Como o Linux gerencia gravações “simultâneas” em partições de swap / disco na memória virtual?

3

Atualmente estou trabalhando em um sistema operacional educativo chamado Pintos. Ao implementar a memória virtual, um dos problemas que estou tendo é gravar dados para trocar em uma falha de página que aconteceu durante a leitura de dados do sistema de arquivos.

O problema é que ambas as partições swap e file system usam o mesmo controlador e, portanto, apenas uma pode ser acessada por vez. Quando tento remover uma página para trocar em uma falha de página causada por uma leitura do sistema de arquivos, fico com deadlock (cada dispositivo está aguardando que o outro fique ocioso, portanto nenhum deles pode progredir).

Eu estou querendo saber como sistemas operacionais do mundo real, como o Linux, resolvem esse problema. Uma solução que estou pensando é talvez escrever a página trocada para a memória do kernel primeiro, gerenciá-la em uma fila e agendar a gravação de volta para trocar algum tempo depois, quando o dispositivo estiver disponível. No entanto, isso é caro, pois a gravação deve ser feita duas vezes. Além disso, é muito mais provável que eu fique sem RAM, pois há muito mais espaço de troca disponível do que a memória física.

Outra solução é talvez "forçar" o dispositivo a ficar ocioso na falha da página? Eu sei que o controlador do dispositivo usa alguns bits (BSY e DRQ) para determinar o status do dispositivo. No entanto, isso depende muito da implementação, e não tenho certeza se devo tocar esses bits, pois eles podem ser definidos pelo hardware.

Qualquer conselho seria muito apreciado.

    
por Charles 17.04.2016 / 04:16

1 resposta

2

Umm ... é bem simples: uma fila. Um disco: uma fila. Não importa se duas tarefas estão tentando acessar arquivos diferentes em uma partição ou em duas partições diferentes; as duas solicitações entram em uma fila e o driver de disco as atende uma por vez.

    
por 17.04.2016 / 04:35