Olá pessoal, na aula de SOP (Sistemas Operacionais) da minha faculdade meu professor pediu para que escrevêssemos um algoritmo para simular dois processos (A e B), onde o processo A era um produtor de valores e o processo B era um consumidor de valores.
Também era desejado que os dois processos pudessem operar de forma igual mesmo se os dois possuíssem velocidades diferentes. Exemplo:
[1 caso] Se o processo A (produtor) for mais veloz que o processo B (consumidor) ele deve produzir um número máximo N e logo em seguida dormir. O processo A será ativado novamente quando a lista estiver sem nenhum valor para ser consumido.
[2 caso] Se o processor B (consumidor) for mais veloz que o processo A (produtor) ele deve consumir todo o vetor de valores len(N) e logo em seguida dormir. O processo B (consumidor) será ativado novamente quando a lista estiver preenchida com valores para serem consumidos.
Para fazer esse tarefa usei a linguagem Python, e segue abaixo a minha implementação:
#! /usr/bin/python # coding:utf-8 from random import randint from time import sleep import sys import os lista = [] #cria uma lista de valores com nenhum valor inserido dormir_c = False #flag para desativar/ativar processo B (consumidor) dormir_p = False #flag para desativar/ativar processo A (produtor) length_max = int(sys.argv[1]) #tamanho max do vetor #Processo A (produtor), produz valores para a lista def produtor(): global lista, length_max, dormir_c, dormir_p if not dormir_p: #verifica se processo está ativo while len(lista) < length_max: #verifica se a lista não atingiu seu tamanho máximo lista.append(randint(0, 1000)) #adiciona um valor inteiro entre 0 e 1000 à lista print 'Olá Sr. Programador eu sou o produtor, olha como está a lista de valores ' + str(lista) else: print 'Fiz o meu serviço olha como eu deixei a lista cheinha >>> ' + str(lista) print 'Agora eu vou tirar uma soneca. [Produtor está tirando uma soneca acorde ele quando a lista estiver vazia] \n' dormir_p = True #desativa o processo A dormir_c = False #ativa o processo B consumidor() #chama o consumidor #Processo B (consumidor), consome valores da lista def consumidor(): global lista, length_max, dormir_c, dormir_p if not dormir_c: #verifica se processo está ativo if lista: #verifica se a lista contem valores del lista[0] #remove o valor que se encontra no inicio da lista print 'Olá Sr. Programador eu sou o consumidor, olha como está a lista de valores' + str(lista) else: print 'Fiz o meu serviço olha como eu deixei a lista limpinha >>> ' + str(lista) print 'Agora eu vou tirar uma soneca. [Consumidor está tirando uma soneca, acorde ele quando a lista possuir valores] \n' dormir_c = True #desativa o processo B dormir_p = False #ativa o processo A produtor() #chama o produtor while True: #loop infinito #inicia a brincadeira produtor() consumidor() sleep(5) #trava a tela a cada iteração para podermos ver os processos em execução print '-----------------------------------------------------------------------------------------------------------------------------------'
Para executar o script, você deve informar o número máximo de itens que a lista pode conter. Esse parâmetro deve ser informado por linha de comando. Desse modo para executarmos nosso script temos que fazer:
user@server$ python algoritmo.py N
Onde N é um número inteiro aleatório. Quando quiser encerrar a execução basta pressionar Ctrl+C. Espero que gostem do material e até a próxima!