View
22
Download
0
Category
Preview:
DESCRIPTION
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. - PowerPoint PPT Presentation
Citation preview
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_spacestruct 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();
Obrigado!
Recommended