1 / 10

Sistemas Operacionais

Sistemas Operacionais. Page Cache e Page Writeback Vinicius Faria Culmant Ramos Prof.: Vitor Santos Costa. Introdução. Page Cache é, fisicamente, uma página na RAM; Cada página corresponde a vários blocos no disco; O kernel busca informações primeiro no cache para depois buscar no disco.

barth
Download Presentation

Sistemas Operacionais

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sistemas Operacionais Page Cache e Page Writeback Vinicius Faria Culmant Ramos Prof.: Vitor Santos Costa

  2. Introdução • Page Cache é, fisicamente, uma página na RAM; • Cada página corresponde a vários blocos no disco; • O kernel busca informações primeiro no cache para depois buscar no disco.

  3. Características • Minimizar disk I/O -> Armazenar dados em memória que pode vir a ser utilizado; • Acesso ao disco é muito mais lento do que acesso à memória; • Páginas acessadas são muito prováveis de serem acessadas em um curto espaço de tempo. • Page Cache x86 -> tamanho 4Kb

  4. address_space • SVR4 utilizava o Page Cache apenas para dados do filesystem; • SVR4 Page Cache utilizado é equivalente ao file object (struct vnode); • Linux armazena qualquer page-based object, incluindo diferentes tipos de arquivos e mapeamento de memória; • Utiliza a estrutura address_space que identifica as páginas no Page Cache;

  5. address_space • linux/fs.h struct address_space { struct inode *host; /* owning inode */ struct radix_tree_root page_tree; /* radix tree of all pages */ spinlock_t tree_lock; /* page_tree lock */ unsigned int i_mmap_writable; /* VM_SHARED ma count */ struct prio_tree_root i_mmap; /* list of all mappings */ struct list_head i_mmap_nonlinear; /* VM_NONLINEAR ma list */ spinlock_t i_mmap_lock; /* i_mmap lock */ atomic_t truncate_count; /* truncate re count */ unsigned long nrpages; /* total number of pages */ pgoff_t writeback_index; /* writeback start offset */ struct address_space_operations *a_ops; /* operations table */ unsigned long flags; /* gfp_mask and error flags */ struct backing_dev_info *backing_dev_info; /* read-ahead information */ spinlock_t private_lock; /* private lock */ struct list_head private_list; /* private list */ struct address_space *assoc_mapping; /* associated buffers */ };

  6. address_space • i_nmap -> Árvore de prioridades de todos as mapas de memória, tanto compartilhado quanto privados; • address_space está associado a algum objeto do kernel, geralmente é um inode; • *host pode ser NULL se o objeto associado não for um inode, por exemplo uma área de swap; • a_ops aponta para a tabela de operações do address_space; • Esta tabela está descrita na estrutura address_space_operations;

  7. address_space struct address_space_operations { int (*writepage)(struct page *, struct writeback_control *); int (*readpage) (struct file *, struct page *); int (*sync_page) (struct page *); int (*writepages) (struct address_space *, struct writeback_control *); int (*set_page_dirty) (struct page *); int (*readpages) (struct file *, struct address_space *, struct list_head *, unsigned); int (*prepare_write) (struct file *, struct page *, unsigned, unsigned); int (*commit_write) (struct file *, struct page *, unsigned, unsigned); sector_t (*bmap)(struct address_space *, sector_t); int (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, int); int (*direct_IO) (int, struct kiocb *, const struct iovec *, loff_t, unsigned long); };

  8. read_page() • Um dos métodos mais importantes; • Page = find_get_page(mapping, index); // Busca a página no page cache • Se a página não estiver no cache: struct page *cached_page; int error; cached_page = page_cache_alloc_cold(mapping); if (!cached_page) /* error allocating memory */ error = add_to_page_cache_lru(cached_page, mapping, index, GFP_KERNEL); if (error) /* error adding page to page cache */ error = mapping->a_ops->readpage(file, page);

  9. write_page() • Um dos métodos mais importantes; • Quando uma página é modificada sempre é chamada a função SetPageDirty(page); • Para escrever, faz-se uma busca no cache pela página; • Se não estiver, uma página é alocada e adicionada; • prepare_write() é invocada para setar a requisição de escrita; • Os dados são copiados da área do usuário para o Kernel buffer; • Os dados são copiados para o disco com a função commit_write();

  10. Obrigado!

More Related