No gerenciamento de memória do Linux, a maioria dos processos são criados dinâmicamente e representados pela task_struct. Um exemplo disso pode ser visto em ./linux/arch/i386/kernel/init_task.c.
Os processos no Linux podem ser coletados de duas formas:
- hashtable: os processos são colocados em hash pelo valor de PID
- lista duplamente encadeada
Agora, vamos analisar as interfaces existentes no Linux para realizar a criação e remoção de processos, a troca de contexto e o page-fault.
Criação de Processos:
A criação de processos ocorre através da chamada fork(). A partir dela, uma sequência de chamadas são realizadas, como mostrado na figura abaixo.
Na chamada do_fork, realizamos a alocação de um PID para o novo processo. Em seguida, realizamos uma análise no processo pai, para passar os flags, registradores e situação de pilha.
Na chamada copy_process, criamos o processo filho como uma cópia do pai.
Em seguida,
dup_task_struct
(encontrada em ./linux/kernel/fork.c) é chamada, alocando um novo task_struct
e copiando os descritores do processo atual nele.Troca de Contexto entre Processos:
A troca de contexto entre processos é responsável por armazenar as informações sobre o estado operacional do processo, de modo que este processo possa retomar sua operação de uma posição idêntica. Além disso, o ato de remover o processo de atividade e colocar outro é conhecido como troca de contexto.
O contecto de um processo envolve seu espaço de endereço, espaço de pilha, espaço de endereço virtual, registro de imagem fixa, ponteiro de pilha, registro de instrução e registradores de uso geral.
Ao realizar uma interrupção, o escalonador é responsável por armazenar o estado atual de task_struct e substituir o ponteiro de tarefas atual por um ponteiro para o task_struct do novo processo.
Page Fault:
Uma página é um bloco de memória de tamanho fixo que é utilizado como unidade de transferência entre a memória física e um dispositivo externo.
Uma page-fault é uma interrupção ao software gerada por hardware quando um programa acessa uma página que está mapeada no espaço de endereços, mas não está carregada na memória física.
O hardware responsável por identificar esta situação é o MMU. O software responsável por tratar esta interrupção faz parte do sistema operacional e tenta disponibilizar a página requerida ou então finaliza o programa, no caso de um acesso ilegal.
Os page-faults são comums e necessários para aumentar a quantidade de memória disponível aos programas nos sistemas operacionais.
Remoção de Processos:
A remoção do processo ocorre após a chamada de término de um processo. O término do processo ocorre através da chamada exit().
A chamada exit() realiza a chamada da função do_exit(), presente no kernel, como mostrado na figura abaixo.
A função do_exit é responsável por remover todas as referências do processo atual do sistema operacional. Após remover o processo, seu estado é alterado para PF_DEAD e a função schedule é chamada para selecionar um novo processo para execução.
A função do_exit com o auxílio de outras chamadas como: exit_mm, exit_keys e exit_notify.
A chamada exit_mm é responsável por remover as páginas da memória e
A chamada exit_notify é responsável por notificar os outros processos a respeito da saída deste processo (Ex: processo pai notificado da saída do filho).
Referências:
http://www.ibm.com/developerworks/br/library/l-linux-process-management/index.html
http://lzanuz.sites.uol.com.br/processos.htm
http://en.wikipedia.org/wiki/Page_fault
http://www.linux-tutorial.info/modules.php?name=MContent&pageid=326
Nenhum comentário:
Postar um comentário