Qual é o benefício de fornecer a cada processo um espaço de endereço?

0

Eu entendo que o nível mais básico de benefício é fornecer uma camada de abstração, que permite que o processo não se preocupe com a forma como sua memória virtual deve ser atribuída fisicamente, o que é deixado para o sistema operacional lidar. No entanto, além disso, que outros prós / contras podemos esperar de fazer isso?

    
por oldselflearner1959 14.03.2018 / 19:42

1 resposta

1

Cada processo que recebe seu próprio espaço de endereço segue o modelo de um único programa sendo executado em uma máquina por vez, como foi feito nos primeiros anos da computação. Nos sistemas operacionais modernos de compartilhamento de tempo, os processos ainda vêem o mundo como se estivessem funcionando com a CPU e a memória fornecida apenas para eles. (Isso está simplificando um pouco, os processos podem, é claro, estar cientes de outros processos via mecanismos de IPC.)

Agora, vamos analisar a alternativa: um espaço de endereço compartilhado por todos os processos em execução na máquina. Como os endereços de memória estão em uso por processos já em execução quando um programa é iniciado, os segmentos de memória teriam que ser realocados quando o programa é carregado na memória. O layout de memória de um programa provavelmente seria diferente a cada vez, e o programa teria que ser vinculado "on-the-fly" antes que pudesse ser iniciado.

Um espaço de memória compartilhada pode ser implementado ao espalhar as páginas pertencentes a diferentes processos em todo o espaço da memória. Isso exigiria um elaborado esquema de proteção implementado em hardware, onde cada área de memória (página ou segmento) seria associada à informação sobre qual processo é o proprietário da área. Essa solução também teria a desvantagem de que a memória seria fragmentada e poderia levar a um programa que não pode ser carregado porque pode exigir uma área grande com endereços de memória contíguos e uma área grande o suficiente pode não estar disponível.

A alternativa seria reservar um espaço de memória contíguo para cada processo. Isso tornaria o esquema de proteção um pouco mais simples (apenas limites baixos e altos), mas seria um desperdício com o espaço de endereços e também sofreria de fragmentação.

Algo relacionado a isso são as bibliotecas compartilhadas, que contêm código e dados compartilhados por muitos processos não relacionados. As páginas de uma biblioteca compartilhada devem, de preferência, ser carregadas sem modificações na memória (ou seja, nenhuma correção por processo de endereços absolutos), caso contrário, os quadros de memória física não podem ser compartilhados entre processos. Por outro lado, uma biblioteca compartilhada geralmente deve ser carregada em diferentes endereços virtuais em diferentes processos, ou então eles ficam muito difíceis de manipular. As bibliotecas compartilhadas modernas usam código independente de posição e dados de acesso por meio de indireção, de modo que elas podem ser colocadas praticamente sem modificações e ainda serem executadas usando endereços virtuais variados. As bibliotecas compartilhadas de primeira geração do Linux "a.out" eram realmente mais simples e eram carregadas em locais fixos no espaço de endereço. Isso exigia um registro central de endereços virtuais reservados para cada biblioteca compartilhada conhecida, com alguma sala extra reservada para crescimento futuro.

    
por 15.03.2018 / 19:31

Tags