quarta-feira, 6 de março de 2013

Processos


  • Consiste num método de descrição das actividades de um sistema operativo;
  • Todo o software incluído no sistema operativo é organizado num grupo de programas executáveis. Cada um destes programas quando activo forma um processo juntamente com o ambiente de execução associado;
  • Cada processo pode "correr" num processador diferente, mas na prática é utilizada a multi-programação (cada processador "corre" vários processos), logo o sistema operativo deve fazer o escalonamento de processos de forma a ser efectuada a comutação de processos;
  • Os sistemas operativos baseados neste modelo, fornecem primitivas para a criação e destruição de processos;
  • Cada processo pode criar por sua vez processos filho independentes, podendo este continuar a sua execução concorrentemente com eles, ou então bloquear até à sua conclusão.

Contexto de um Processo

É toda a informação necessária à descrição completa do estado actual de um processo:
  • PCB (Bloco de Controlo do Processo)
    • Identificação do processo, grupo, etc;
    • Informação sobre o escalonamento: estado, prioridade, etc;
    • Localização e tamanho dos contextos de memória, de dados, de stack, ficheiros e código;
    • Registos de controlo;
    • Código;
    • Dados do programa;
    • Stack;
    • Descritores de ficheiros.

Funcionamento de Algumas System Calls

 Como funciona a função fork(), exit(),wait() ?

Fork()

fork ( int pid = fork() )

 1- Verifica se há lugar na Tabela de Processos
 2- Tenta alocar memória para o filho
 3- Altera o mapa de memória e copia para a Tabela
 4- Copia a imagem do Pai para o Filho
 5- Copia para a tabela de processos a informação do processo Pai(pid,propriedades,estado,etc)
 6- Atribui um Pid ao Pai
 7- Informa o Kernel (Núcleo do Sistema Operativo) e o sistema de ficheiros que foi criado um novo processo

Exit()

exit (exit(int estado) )

O  funcionamento depende do pai estar á espera ou não.
  * Se o pai esta á espera, então a entrada na tabela é limpa e o espaço de memória  é desalocado(o processo termina definitivamente)
 * Se o pai não está á espera, o processo fica adormecido, activando um bit na entrada correspondente da tabela, o scheduler(o responsável pelo escalonamento dos processos) recebe uma mensagem de modo a evitar o processo
 * Se o processo pai morre antes do filho fazer exit e de modo a evitar que o processo fique adormecido eternamente, este é adoptado pelo processo ttv(processo que "lê" o login) correspondente, já que este está a sempre a fazer wait
  
wait()


wait (int pid=wait(int *estado) )

Obriga o processo a esperar pelo fim de um filho de modo a libertar o espaço correspondente na tabela e originar uma eliminação definitiva.
  • Obriga a uma pesquisa da tabela de processos, para descobrir se existe algum processo filho;
  • Se existir um processo filho adormecido, ele é limpo da tabela de processos e o seu pid é retornado para o wait, assim como o argumento do exit do processo adormecido;
  • Se não houver nenhum filho adormecido, e existir algum filho no scheduler, então o processo é bloqueado até o filho executar o exit;
  • Se não existir nenhum filho na tabela de processos, o wait retorna um valor de erro.