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

Sistemas Operacionais

  • Upload
    barth

  • View
    22

  • Download
    0

Embed Size (px)

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

Page 1: Sistemas Operacionais

Sistemas Operacionais

Page Cache e Page Writeback

Vinicius Faria Culmant Ramos

Prof.: Vitor Santos Costa

Page 2: Sistemas Operacionais

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.

Page 3: Sistemas Operacionais

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

Page 4: Sistemas Operacionais

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;

Page 5: Sistemas Operacionais

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 */};

Page 6: Sistemas Operacionais

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;

Page 7: Sistemas Operacionais

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);};

Page 8: Sistemas Operacionais

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);

Page 9: Sistemas Operacionais

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();

Page 10: Sistemas Operacionais

Obrigado!