Você está na página 1de 38

Sistemas Operativos

Processos

Ibéria Medeiros

Departamento de Informática
Faculdade de Ciências da Universidade de Lisboa

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Conceito de Processo

Conceito de Processo

Um Sistema Operativo executa uma variedade de programas:


 Sistemas batch - jobs
 Sistemas em tempo repartido (time sharing) – processos
Utilizaremos job ou processo de forma indiferente
Processo – um programa em execução de forma sequencial
A um processo estão associados:
 Espaço de Endereçamento
 Código Executável
 Secção de Dados
 Pilha (Stack)
 Contexto
 Instruction Pointer
 Etc...

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Conceito de Processo

Estados de um Processo

Um processo ao ser executado passa por vários estados:


 Novo (new): acaba de ser criado
 Pronto (ready): à espera de lhe ser atribuído processador
 Correr (running): está a ser executado pelo processador
 Bloqueado (waiting): à espera que algum evento aconteça
 Terminado (terminated): terminou execução

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Conceito de Processo

Bloco de Controle de um Processo (PCB)

Toda a informação associada a cada


processo está contida no Process Control
Block (PCB):
 Estado do Processo
 Número do Processo
 Instruction Pointer (Program Counter)
 Cópias dos Registos do CPU
 Informação sobre o escalonamento do
CPU
 Informação sobre o seu Espaço de
Endereçamento Memória
 Informação sobre todas as operações
de I/O do processo
 Informação sobre a sua actividade

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações em Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Escalonamento

Os processos necessitam de recursos


Há tipicamente mais processos que recursos
Portanto: os processos competem por recursos
O sistema operativo deve fazer o escalonamento dos processos
Os recursos devem ser atribuídos pela ordem correspondente às
políticas de escalonamento (estudado mais à frente no Cap. De
Escalonamento)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Escalonamento

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Filas de espera de Escalonamento

O sistema mantem várias filas de espera para processos:


 job queue: todos os processos do sistema
 ready queue: todos os processos em memória prontos e à
espera de executar
 device queues: contem os processos à espera de I/O num
dispositivo (uma para cada dispositivo)

Os processos migram entre as várias filas de espera

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Ready Queue e I/O Queues

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Ciclo de Vida do Processo

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

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...

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Escalonamento de Processos

Comutação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Criação de Processos

Um processo pode criar novos processos durante a sua execução.


Os novos processos são designados processos filhos (children) do processo
que os criou.
Os novos processo vão necessitar de recursos (tempo de CPU, memória,
ficheiros, dispositivos de IO, etc.).
Os novos processos podem obter estes recursos do sistema operativo ou do
processo que os criou (pai).

Quando um processo cria um processo filho:


 continua a executar em paralelo com o processo filho
 pode esperar que o seu processo filho termine (ex: wait)
Quanto ao espaço de endereçamento do novo processo criado:
 o filho é um duplicado do processo pai (fork)
 é carregado um programa novo para o processo filho (exec)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Criação de Processos

Chamada ao sistema fork cria filho


fork “retorna duas vezes”, no pai e no filho
Ambos continuam a executar o mesmo programa
Filho herda duplicado do pai mas continua independentemente: com a sua
memoria, . . .
Para substituir o programa a executar usa-se exec; muda o programa mas
continua o processo corrente

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Terminar Processos

Um processo termina quando acaba de executar a sua última instrução e pede


ao sistema operativo que o 'apague' através da system call exit().
Nessa altura o processo pode retornar um código de resultado para o processo
pai.
Todos os recursos do processo são libertados pelo sistema operativo
(memória, ficheiros, periféricos, etc.).

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Árvore de Processos (Solaris)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Árvore de Processos Linux

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Operações em Processos

Árvore de Processos Windows XP

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em linux

A criação de um processo no Linux é efectuada através da duplicação do


processo actual através da system call fork.

Quando um processo é duplicado o processo pai e o processo filho são


idênticos em todos os aspectos à excepção dos seus PIDs
 o código, dados e stack do processo filho são iguais aos do processo pai e
ambos continuam a executar o mesmo código.

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.

Quando um processo filho termina a sua 'morte' é comunicada ao processo


pai. Isso é possível se o pai estiver em wait enquanto o filho está em
execução.

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em linux

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos


//processo filho: cópia do processo pai (código e dados)
//processo pai e processo filho executam-se concorrentemente
// em linguagem C // em linguagem python

#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)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos


//processo filho: cópia do processo pai (código e dados)
//processo pai e processo filho executam-se concorrentemente

// Processo PAI // Processo FILHO

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

except OSError as e: except OSError as e:


print >>sys.stderr, "fork failed “, print >>sys.stderr, "fork failed “,
e.errno, "-“, e.strerror e.errno, "-“, e.strerror
sys.exit(1) sys.exit(1)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos


//processo filho: cópia do processo pai (código e dados)
//processo pai e processo filho executam-se concorrentemente

// Processo PAI // Processo FILHO

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

except OSError as e: except OSError as e:


print >>sys.stderr, "fork failed “, print >>sys.stderr, "fork failed “,
e.errno, "-“, e.strerror e.errno, "-“, e.strerror
sys.exit(1) sys.exit(1)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos


## processo filho: copia do processo pai (codigo e dados)
## processo pai e processo filho executam-se concorrentemente

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)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos


## processo filho: carrega outro programa
## processo pai espera ate filho terminar

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

Processos em Unix - Exemplos


## processo pai espera que o filho termine. O proc. pai recebe o valor de exit do filho

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)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Gestão de Processos em Linux

Processos em Unix - Exemplos

//Quantos processo sao criados ?

import os

os.fork()
os.fork()
os.fork()
file=open("TMP"+str(os.getpid()),'w')
file.close()

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Sumário

Sumário

Conceito de Processo
Escalonamento de Processos
Operações sobre Processos
Gestão de Processos em Linux
Cooperação entre Processos

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

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)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

Memória Partilhada

Processos partilham zona de memória


Processos são responsáveis por garantir que não escrevem na mesma zona
de memória simultaneamente (ver cap. de sincronização)

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:
….

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

Troca de Mensagens

Duas operações básicas:


• send
• recv

Canal de comunicação
• Comunicação directa ou indirecta (por mailbox)
• Comunicação síncrona ou assíncrona
• Buffering automático ou explícito

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

Troca de Mensagens

Comunicação Síncrona ou Assíncrona

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

Não bloqueante – assíncrona


• Envio não bloqueante: o emissor envia a msg e continua
• Recepção não bloqueante: o receptor recebe a msg ou NULL

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

Troca de Mensagens

Buffering

• Capacidade das filas de mensagens associadas ao canal


- Capacidade 0:
Emissor tem de esperar pelo receptor
- Capacidade limitada
O emissor tem de esperar se canal cheio
- Capacidade ilimitada
Emissor nunca espera

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos


Capítulo III – Processos Cooperação entre Processos

Comunicação cliente-servidor

• Sockets
• Remote Procedure Calls (RPC)
• Remote Method Invocation (Java)

© 2019 Ibéria Medeiros. Todos os direitos reservados Sistemas Operativos

Você também pode gostar