Sistemas Operacionais Aula 2 Processos

Propaganda
Sistemas Operacionais
Aula 2
Processos
Ivan da Silva Sendin
[email protected]
FACOM - Universidade Federal de Uberlândia
Sistemas OperacionaisAula 2Processos – p. 1
Processo
Processo = programa em execução
han@falcon:˜/UFG/Cursos/SO/1S2014/slides$ ps -ef
UID
PID PPID C STIME TTY
TIME CMD
root
1
0 0 11:49 ?
00:00:00 /sbin/init
....
han
4069 2797 0 14:40 pts/5
00:00:00 bash
han
21143 2797 0 15:48 pts/6
00:00:00 bash
han
23893
1 5 16:01 ?
00:00:33 rhythmbox
/media/FCE9-A351/Novos/01-the_handsome_family-flies.mp3
han
24056 2806 0 16:03 pts/0
00:00:02 emacs aula2.tex
han
24288 2806 0 16:12 pts/0
00:00:00 ps -ef
Ou ainda usar o top. kill também!
Sistemas OperacionaisAula 2Processos – p. 2
kill
han@falcon:˜/UFG/Cursos/SO/1S2014/slides$ kill 1
bash: kill: (1) - Operation not permitted
O comando kill envia uma mensagem ao processo.
Sistemas OperacionaisAula 2Processos – p. 3
Processo
Existem alguns estados em que um processo pode
estar,por exemplo:
EXECUTANDO
Ele esta sendo executando pela CPU
Nao faz nada
AGUARDANDO Ele esta pronto para ser executado, na fila.
DORMINDO
EXECUTANDO
DORMINDO
ESPERANDO
A realidade é mais complicada do que isso....mas vamos
abstrair!
Sistemas OperacionaisAula 2Processos – p. 4
Dormindo...
import time
while(True):
time.sleep(1)
print ’Passei por aqui...’,time.gmtime().tm_sec
--------------Passei
Passei
Passei
Passei
Passei
Passei
Passei
por
por
por
por
por
por
por
aqui...
aqui...
aqui...
aqui...
aqui...
aqui...
aqui...
43
44
45
46
47
48
49
Sistemas OperacionaisAula 2Processos – p. 5
PID
O SO precisa controlar quem esta sendo executado,quem
esta dormindo, etc...
Para isso existe o ID de processo: PID.
import os
print ’Meu id:’,os.getpid()
Com o ID de cada processo, o SO mantem uma lista dos processos em aguardando,
dormindo,etc...
print ’id do meu pai:’,os.getppid()
Cada vez que o script for executado o id deve mudar e o id do pai deve manter (se
chamado do mesmo shell)
Sistemas OperacionaisAula 2Processos – p. 6
Fork
A chamada de sistema fork é usada para criar um novo
processo. De onde vêm este nome?
id = os.fork()
if id==0:
while(True):
time.sleep(1)
print ’Passei por aqui...’,time.gmtime().tm_sec
O processo pai encerra a sua execução, liberando a shell. O processo filho continua para
sempre. Quem é o novo pai?
ps -ef | grep python
luke
7965
1
0 15:56 pts/1
00:00:00 python sinal.py
Sistemas OperacionaisAula 2Processos – p. 7
Fork
id = os.fork()
if id==0:
for i in range(5):
time.sleep(1)
print ’Passei por aqui...’,time.gmtime().tm_sec
print ’Fim do filho’
else:
os.wait()
print ’Meu filho morreu!!’
Sistemas OperacionaisAula 2Processos – p. 8
Fork
trabalhando um pouco:
id = os.fork()
if id==0:
for i in range(5):
wasteCPU(35)
print ’Passei por aqui...’,time.gmtime().tm_sec
print ’Fim do filho’,os.times()[0]
else:
os.wait()
print ’Meu filho morreu!!’,os.times()[0]
--------------------------Passei por aqui... 51
(...)
Passei por aqui... 1
Fim do filho 12.68
Meu filho morreu!! 0.01
Sistemas OperacionaisAula 2Processos – p. 9
Fork
E se o pai nao da atenção ao filho?
else:
time.sleep(120)
os.wait()
print ’Meu filho morreu!!’,os.times()[0]
------------------------luke
11673 7826 0 16:41 pts/1
00:00:00 python sinal.py
luke
11674 11673 78 16:41 pts/1
00:00:12 [python] <defunct>
E se o pai morre antes do filho?
Sistemas OperacionaisAula 2Processos – p. 10
Exercicios
1. Implemente um pai com dois filhos e espere pelos dois
antes de morrer
2. O tempo obtido em os.times()[0] do filho corresponde
aproximadamente ao tempo real. Como fazer este
tempo ficar diferente do real(sem usar o sleep)?
3. Em uma maquina com acesso ao root, execute
sudo cat /proc/*I*D*/status
trocando o *I*D* pelo id de um processo.
Sistemas OperacionaisAula 2Processos – p. 11
Download