120 likes | 262 Views
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.
E N D
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.
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
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;
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 */ };
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;
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); };
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);
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();