Escolar Documentos
Profissional Documentos
Cultura Documentos
Processos
Ibéria Medeiros
Departamento de Informática
Faculdade de Ciências da Universidade de Lisboa
Sumário
Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos
Sumário
Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos
Conceito de Processo
Estados de um Processo
Sumário
Conceito de Processo
Escalonamento de Processos
Operações em Processos
Gestão de Processos em Linux
Cooperação entre Processos
Escalonamento
Escalonamento
Comutação de Processos
Comutação de Processos
Quando o scheduler (escalanador) retira um processo do estado running e
o substitui por outro
Mudança de Contexto
Quando há comutação entre dois processos, o sistema deve
salvaguardar o estado do antigo processo na PCB deste e carregar o
estado do novo processo da sua PCB
Esta operação é fundamental para que os processos possam voltar a
passar para o estado running sem perder o contexto de execução
O tempo de mudança de contexto é overhead: o sistema não está a fazer
nada de útil para o utilizador durante a comutação
Depende do suporte fornecido pelo hardware
MMU, hyperthreading, etc...
Sumário
Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos
Criação de Processos
Criação de Processos
Terminar Processos
Sumário
Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos
Processos em linux
Um processo filho pode substituir o seu código pelo código de outro programa
(ficheiro executável). Desta forma o processo filho pode-se diferenciar do
processo pai. Isso é efectuado através da system call exec.
Processos em linux
#include <stdio.h>
import os
#include <stdlib.h>
import sys
int main(int argc, char *argv[]) { n=0
int n=0; try:
if (fork() == -1) { pid=os.fork()
perror(argv[0]);
n+=1
exit(1);
} print "hello, n=“, n
n++;
printf("hello: %d\n", n); except OSError as e:
} print >>sys.stderr, "fork failed “,
e.errno, "-“, e.strerror
sys.exit(1)
import os import os
import sys import sys
n=0 n=0
try: try:
pid=os.fork() pid=os.fork()
n+=1 n+=1
print "hello, n=“, n print "hello, n=“, n
import os import os
import sys import sys
n=0 n=0
try: try:
pid=os.fork() pid=os.fork()
n+=1 n+=1
print "hello, n=“, n print "hello, n=“, n
import os
import sys
try:
pid = os.fork()
if pid == 0: # processo filho
print “Processo Filho: Meu PID=“, os.getpid(), “e PID do pai=“, os.getppid()
sys.exit(0)
else: # processo pai
print “Processo Pai: Meu PID=“, os.getpid(), “PID do filho=“, pid, “e PID do pai=“, os.getppid()
sys.exit(0)
except OSError as e:
print >>sys.stderr, "fork failed "+str(e.errno)+"-"+e.strerror
sys.exit(1)
import os
import sys
try:
pid = os.fork()
if pid == 0: # processo filho
os.execlp("/bin/ls", "/bin/ls", "-l")
else: # processo pai
os.wait()
print "Child complete"
sys.exit(0)
except OSError as e:
print >>sys.stderr, "fork failed "+str(e.errno)+"-"+e.strerror
sys.exit(1)
© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos
Capítulo III – Processos Gestão de Processos em Linux
import os
import sys
import random
try:
pid = os.fork()
if pid == 0: # processo filho
x=random.randrange(1,100)
print "o filho gerou: "+str(x)
sys.exit(x)
else: # processo pai
ipid, status=os.wait()
if os.WIFEXITED(status):
print "Valor recebido no processo pai: "+str(os.WEXITSTATUS(status))
except OSError as e:
print >>sys.stderr, "fork failed "+str(e.errno)+"-"+e.strerror
sys.exit(1)
import os
os.fork()
os.fork()
os.fork()
file=open("TMP"+str(os.getpid()),'w')
file.close()
Sumário
Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos
Processos (filhos) independentes não podem ser afectados pela execução uns
dos outros
Processos (filhos) cooperantes podem afectar ou ser afectados pela execução
uns dos outros
Vantagens da cooperação entre processos
Partilha de informação
Aumento de performance de computação
Modularidade
Conveniência
Cooperação entre processos necessita da Comunicação entre processos (IPC
- Interprocess Communication
Dois modelos de IPC
Memória partilhada
Comunicação por mensagens (troca de mensagens)
Memória Partilhada
import os import os
import sys import sys Alocado na heap
n=0 import Value (memória dinâmica)
try: n = Value(“i”, 0)
try: Ambos os processos
pid = os.fork()
vão escrever na
n+=1 pid = os.fork()
mesma zona de
print "hello, n=“, n n.value+=1 memória
print "hello, n=“, n
except OSError as e:
…. except OSError as e:
….
Troca de Mensagens
Canal de comunicação
• Comunicação directa ou indirecta (por mailbox)
• Comunicação síncrona ou assíncrona
• Buffering automático ou explícito
Troca de Mensagens
Bloqueante – síncrona
• Envio bloqueante: o emissor bloqueia até a msg ser recebida
• Recepção bloqueante: o receptor bloqueia até haver uma msg disponível
Troca de Mensagens
Buffering
Comunicação cliente-servidor
• Sockets
• Remote Procedure Calls (RPC)
• Remote Method Invocation (Java)