Sistema Operacional Linux
Por: Salezio.Francisco • 19/9/2018 • 1.208 Palavras (5 Páginas) • 426 Visualizações
...
Cada área consiste de uma série de páginas consecutivas com proteção e propriedades de paginação idênticas. Pode haver vazios no espaço de endereçamento virtual entre essas áreas. Qualquer referência à memória para um vazio resulta em uma falta de página fatal. O tamanho de página é fixo.
Cada endereço virtual é quebrado em até quatros campos. O campo diretório é usado como índice do diretório global, sendo que existe um privado para cada processo.
O Linux gerencia a memória usando o algoritmo companheiro, com a adição de um vetor no qual o primeiro elemento é a cabeça de uma lista de blocos com tamanho de uma unidade, o segundo elemento é a cabeça de uma lista de blocos com tamanho de duas unidades, o próximo elemento aponta para blocos de quatro unidades e assim por diante. Dessa maneira qualquer bloco de potência de dois pode ser encontrado rapidamente.
Esse algoritmo gera uma considerável fragmentação interna, pois, se você deseja um bloco de 65 páginas, você tem de solicitar e obter um bloco de 128 páginas. Para amenizar esse problema, o Linux tem uma segunda alocação de memória que obtêm blocos, usando o algoritmo companheiro, e depois os retalha para gerenciar unidades menores separadamente. Um terceiro alocador de memória também é utilizado quando a memória solicitada precisa ser contígua somente no espaço virtual, mas não na memória física.
4. Gerência de Processos
Durante a fase de inicialização do Linux a função "start_kernel" é responsável por criar um thread, este é o processo de número zero, o primeiro e o ascendente de todos os outros processos. Após inicializar toda a estrutura de dados para este processo esta mesma função é responsável por chamar a função "init" que por sua vez utiliza a chamada de sistema "execve" para rodar o executável init, que será o processo número 1, mais conhecido como init.
O processo init pode ser visto como pai de todos os demais. Ele é o segundo a ser criado, e um dos últimos a morrer. Existem alguns outros processos que também são criados pelo kernel durante a fase de inicialização e destruídos assim que o sistema desliga. Outros são criados sob demanda, assim que surge a necessidade deles são carregados.
Uma das coisas que o escalonador precisa ter ciência é em qual estado está cada processo, na estrutura que armazena os dados de cada processo temos um array de possíveis estados onde apenas uma das opções abaixo estará ativa.
Os estados são:
TASK_RUNNING: Em execução, ou em espera para ser executado.
TASK_INTERRUTIBLE: Suspenso até que determinada condição se torne verdadeira.
TASK_UNINTERRUPTIBLE: Como o estado anterior, exceto pelo fato de que o seu estado não será modificado quando receber um sinal. É importante para os processos que necessitam executar determinada tarefa sem ser interrompido.
TASK_STOPPED: Execução do processo foi parada.
TASK_ZOMBIE: O processo está terminado, mas o processo pai ainda não executou uma chamada de sistema para retornar informações sobre o processo morto - "wait", as informações não são descartadas pois ainda podem ser utilizadas.
...