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