Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior | |||
| ppos-v2:cache_de_blocos [2026/05/06 19:32] – maziero | ppos-v2:cache_de_blocos [2026/07/29 18:03] (atual) – maziero | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | ====== Cache de blocos ====== | ||
| + | Este projeto faz parte do [[PPOS-v2: | ||
| + | |||
| + | Este projeto tem por objetivo implementar um cache em memória RAM para os blocos lidos e/ou escritos no disco. | ||
| + | |||
| + | ===== O problema ===== | ||
| + | |||
| + | O acesso a disco é uma operação demorada, pois o disco é lento. Para melhorar o desempenho, pode-se guardar uma cópia em RAM dos blocos lidos ou escritos no disco, para agilizar acessos futuros. As estratégias de //caching// a implementar neste projeto são as seguintes: | ||
| + | |||
| + | * // | ||
| + | * // | ||
| + | |||
| + | <note tip> | ||
| + | Este projeto implementa um cache com escrita // | ||
| + | </ | ||
| + | |||
| + | O cache pode ser visto como um vetor ou lista de blocos com capacidade limitada, geralmente inferior ao tamanho do disco. Se ele estiver cheio e um novo bloco precisar ser armazenado, outro bloco deverá ser descartado do cache antes. Neste projeto, deve-se usar o algoritmo LRU (// | ||
| + | |||
| + | ===== Interface de acesso ao cache ===== | ||
| + | |||
| + | O acesso ao cache de disco pelas tarefas é feito através das funções definidas em '' | ||
| + | |||
| + | === Iniciar o subsistema === | ||
| + | |||
| + | <code c> | ||
| + | void cache_init() | ||
| + | </ | ||
| + | |||
| + | Esta função, chamada na inicialização do PPOS (em '' | ||
| + | |||
| + | === Leitura de bloco com cache === | ||
| + | |||
| + | <code c> | ||
| + | int cache_read(int block, void* buffer) | ||
| + | </ | ||
| + | |||
| + | Parâmetros: | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * retorno: 0 em caso de sucesso ou -1 em caso de erro. | ||
| + | |||
| + | Essa função faz a leitura de blocos usando o cache, da seguinte forma: | ||
| + | |||
| + | - procura o bloco no cache | ||
| + | - se encontrou o bloco | ||
| + | - copia conteúdo do cache para o buffer (usando '' | ||
| + | - senão | ||
| + | - lê o bloco do disco (usando '' | ||
| + | - obtém uma entrada livre no cache (ou libera uma) | ||
| + | - copia o conteúdo do bloco lido para o cache | ||
| + | - atualiza a data de acesso daquele bloco no cache | ||
| + | |||
| + | === Escrita de bloco com cache === | ||
| + | |||
| + | <code c> | ||
| + | int cache_write(int block, void* buffer) | ||
| + | </ | ||
| + | |||
| + | Parâmetros: | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * retorno: 0 em caso de sucesso ou -1 em caso de erro. | ||
| + | |||
| + | Essa função faz a escrita de blocos usando o cache, da seguinte forma: | ||
| + | |||
| + | - se o bloco não estiver no cache ainda | ||
| + | - obtém uma entrada livre no cache (ou libera uma) | ||
| + | - copia o conteúdo do bloco no cache (usando '' | ||
| + | - atualiza a data de acesso daquele bloco no cache | ||
| + | - escreve o bloco no disco (usando '' | ||
| + | |||
| + | === A implementação ===== | ||
| + | |||
| + | Este projeto usa como base o projeto de [[acesso ao disco]] desenvolvido anteriormente. Neste projeto você deve: | ||
| + | |||
| + | * Implementar as funções de acesso ao cache; | ||
| + | * Implementar a política LRU, para liberar entradas se o cache estiver cheio; | ||
| + | * Gerenciar a exclusão mútua no acesso ao cache. | ||
| + | |||
| + | <note important> | ||
| + | Existe o risco de que duas tarefas tentem acessar/ | ||
| + | </ | ||
| + | ===== Outras informações ===== | ||
| + | |||
| + | * Duração estimada: 4 horas. | ||
| + | * Dependências: | ||
| + | * [[Tarefas cooperativas]] | ||
| + | * [[Despachante de tarefas]] | ||
| + | * [[Preempção por Tempo]] | ||
| + | * [[Tarefas que esperam]] | ||
| + | * [[Tarefas que dormem]] | ||
| + | * [[Spinlocks e Semáforos]] | ||
| + | * [[Acesso ao disco]] | ||