IMPLEMENTAÇÃO DE PROCESSOS
Alan Ruani
Lucas Temperly
Orion Guimarães
PROCESSOS
 Uma
instância em execução de um programa é
chamada de processo;
 Quando se tem duas instâncias de um mesmo
programa, existem então dois processos em
execução de um mesmo programa;
 Programação avançada frequentemente usa
escalonamento cooperativo, possibilitando
realizar mais de uma tarefa, utilização de
programas já existentes, entre outros;
PROCESSOS
 Composição
de um processo;
 Muitas das System Calls utilizadas na
implementação de processos estão na
biblioteca <unistd.h> ou na <sys/types.h>;
 Todo programa usa um ou mais processos;
ID’S DE PROCESSO
 Cada
processo em um sistema Linux é
identificado por um único ID de 16-bits, dado
pelo sistema sequencialmente a cada
criação de processo;
 Todo processo tem um processo parente,
exceto o processo init, que é o processo
inicial;
 Um PID(Process Identifier) é um número de
identificação que o sistema dá a cada
processo;
 Não deve ter um PID para dois ou mais
processos ao mesmo tempo;
ID’S DE PROCESSO
 Os
sistemas baseados em Unix precisam
que um processo existente se duplique para
ser atribuída uma nova tarefa a esta cópia;
 Um PPID(Parent Process Identifier) é o ID
do processo pai;
 GETPID() -> retorna o ID de um processo
que está em execução;
 GETPPID() -> retorna o ID do processo pai
deste processo em execução;
EXEMPLO DE CÓDIGO
Imprimindo o ID de processos:
#include <stdio.h>
#include <unistd.h>
Int main()
{
printf(“O ID do processo é %d”, (int)getpid());
printf(“O ID do processo pai é %d”, (int)getppid());
return 0;
}

SINAIS DE PROCESSO
 Meios
para que os processos possam se
comunicar e para que o sistema possa
interferir em seu funcionamento;
 Alguns exemplos de sinais:
 STOP - esse sinal tem a função de
interromper a execução de um processo e
só reativá-lo após o recebimento do sinal
CONT;
 CONT - esse sinal tem a função de instruir
a execução de um processo após este ter
sido interrompido;
SINAIS DE PROCESSO
 TERM
- esse sinal tem a função de terminar
completamente o processo, ou seja, este
deixa de existir após a finalização;
 ILL - esse sinal informa erros de instrução
ilegal, por exemplo, quando ocorre divisão
por zero;
 KILL - esse sinal tem a função de "matar"
um processo e é usado em momentos de
criticidade.
ESTADOS DOS PROCESSOS
 Quando
um processo é criado, ele não
necessariamente é executado;
 Existem vários estados em que um
processo pode se encontrar;
 O sistema Linux trabalha com estes
estados:
 Executável: o processo pode ser
executado imediatamente;
ESTADOS DOS PROCESSOS
 Dormente:
o processo precisa aguardar
alguma coisa para ser executado. Só
depois dessa "coisa" acontecer é que ele
passa para o estado executável;
 Zumbi: o processo é considerado "morto",
mas, por alguma razão, ainda existe;
 Parado: o processo está "congelado", ou
seja, não pode ser executado.
CRIAÇÃO DE PROCESSOS
 Existem
dois tipos principais de criação de
processos:
Usando System:
Quando se usa o system, executa-se um
comando diretamente do Shell, isto se o
mesmo se encontra no Shell, para ser
utilizado em um programa.
CRIAÇÃO DE PROCESSOS
 usando
a chamada system:
#include <stdlib.h>
int main ()
{
int return_value;
return_value = system (“ls -l /”);
return return_value;
}
 O programa executa o comando ls que se
encontra no diretório raiz dentro do Shell.
CRIAÇÃO DE PROCESSOS – FORK()
CRIAÇÃO DE PROCESSOS – FORK()
 Os
Processos são criados através do uso
de uma função interna do Kernel chamada
fork;
 A função fork duplica o processo atual
dentro do sistema operacional;
 O processo que faz achamada a função fork
é chamado de pai;
 O novo processo criado pelo processo pai é
chamado de filho;
 Todas as áreas do processo são duplicados
dentro do sistema operacional (Código,
Dados, Pilha, Memória Dinâmica).
SINTAXE:
PROCESSO ZUMBI
 Um
processo pode se terminar quando seu pai
não está a sua espera. Neste caso, o processo
filho vai se tornar um processo denominado
zumbi (zombie).
 Ele é neste caso identificado pelo nome
<defunct> ou <zombie> ao lado do nome do
processo.
 Seus segmentos de instruções e dados do
usuário e do sistema são automaticamente
suprimidos com sua morte, mas ele vai
continuar ocupando a tabela de processo do
kernel.
 Quando seu fim é esperado, ele simplesmente
desaparece ao fim de sua execução.
SINTAXE
FUNÇÃO EXEC
 Estas
funções substituem a imagem de um
processo por outra imagem de acordo com
os argumentos especificados. Com o fork
podemos criar novos processos e com as
funções exec podemos executar novos
programas ( estas funções não criam um
novo processo para executar o programa,
em vez disso substituem a imagem do
processo pelo programa que se vai
executar).
FUNCIONAMENTO DAS FUNÇÕES EXEC
Verifica as permissões de execução do comando;
 Verifica se o tamanho do código e segmento de
dados do comando é menor que o do processo em
questão ( de modo a garantir que o novo comando
não é carregado e o código do processo é
sobreposto);
 Liberta memória antiga e aloca novo bloco de
memória;
 Modifica mapa de memória;
 Actualiza entrada da tabela;
 Informa o scheduler que o processo está pronto
para ser executado.

TERMINADO UM PROCESSO
 Cada
processo em execução geralmente é
finalizado em poucos segundos, mas algum
processo que está em background, ou sem
um devido controle pode ter problemas e
você precise destruir este processo;
 Usa-se então o comando KILL, que “mata”
o processo

Kill [-sinal] ID de processo (PID)
EXEMPLO DO USO DO KILL
ps
PID TT STAT TIME COMMAND
9408 p9 S
0:00 ue temp2.xdh
9450 pa S
0:01 -Tcsh (Tcsh)
9501 pa T
0:00 less csh.1
9503 pa R
0:00 ps
kill 9501
TERMINAÇÃO DE PROCESSOS
Um processo pode terminar por várias causas, sendo
elas:

decisão do próprio processo, executando a
chamada ao sistema apropriada (direta ou
indiretamente, p.ex. por retorno de main());

erro causado pelo processo, normalmente
devido a um bug, p.ex. divisão por zero ou
acesso a uma região de memória que não lhe foi
atribuída;

decisão de outro processo, executando a
chamada ao sistema apropriada (kill em
POSIX);

decisão do SO (falta de recursos).Note-se
que um processo pode terminar
voluntariamente quando detecta um erro,
p.ex. um compilador não pode compilar
um ficheiro que não existe.
FUNÇÃO EXIT
 fecha
todos os ficheiros
 libera diretório corrente
 libera regiões de memória
 atualiza ficheiro com registro da utilização do
processador, memória e I/O
 envia signal death of child ao processo pai (por
omissão é ignorado)
 registo proc / task mantém-se no estado zumbi:
 permite ao processo pai encontrar informação
sobre o filho quando executa wait.
CHAMADAS AO SISTEMA
#include <unistd.h>
void exit(int status)
void _exit(int status)
pid_t getpid()
pid_t getppid()
_exit() termina o processo que a invoca;
exit() é uma função da biblioteca C (deve usar-se com #include
<stdlib.h>):
invoca as funções registadas usando at_exit();
invoca a chamada ao sistema _exit().
Após retornar de main(), um processo invoca exit().
getpid() retorna o pid do processo que o invoca.
getppid() retorna o pid do processo pai.
FUNÇÃO WAIT
 procura
filho zombie.
 pid
do filho e estado do exit são retornados
através do wait.
 liberta
a estrutura proc do filho se não há
filho zumbi, pai fica bloqueado.
FUNÇÃO WAITPID()
 Assim
como a função wait, o processo pai
aguarda o fim do processo filho;
 Mas com a função waitpid(), o pai pode
esperar a finalização de um processo filho
tendo este especificado pelo seu id, isto é,
pelo seu PID.
SINCRONIZAÇÃO COM WAIT()
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options);
Suspende a execução do processo até um
processo filho terminar (wait()) ou o processo filho
especificado em pid termina (waitpid());
Status permite obter informação adicional sobre
o processo que terminou. Nomeadamente, o
argumento com que invocou a função exit().
Options controla o modo de funcionamento de
waitpid().
EXEMPLO:
...
int status;
pid_t pid;
...
if( (pid = wait(&status)) != -1 ) {
if( WIFEXITED(status) != 0 ) {
printf(‘‘Process %d exited with status %d\n’’,
pid, WEXITSTATUS(status));
} else {
printf(‘‘Process %d exited abnormally\n’’, pid);
}
}
REFERÊNCIAS
S02_AP_02.2_26.03.2015__Advanced_Linux_Prog
ramming-ch03-processes.pdf
 http://linux.die.net/man/2/waitpid
 http://unixhelp.ed.ac.uk/shell/jobz5.html
 S02_AP_02.1_26.03.2015__Processos_Linux.pdf

Download

Implementação de Processos