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