Laboratório 01 - Sistemas Operacionais
Processos
O pacote multiprocessing
suporta processos de spawning, oferecendo simultaneidade local e remota, evitando efetivamente o Global Interpreter Lock usando subprocessos em vez de threads. Devido a isso, o módulo de multiprocessamento permite que o programador aproveite totalmente vários processadores em uma determinada máquina. Ele roda em Unix e Windows.
Exemplo de aplicação:
from multiprocessing import Pool
import time
def ola(n):
time.sleep(10)
print("ola "+str(n))
if __name__ == '__main__':
pool = Pool(processes=2)
start = time.time()
r1 = pool.apply_async(ola, [1])
r2 = pool.apply_async(ola, [2])
pool.close()
pool.join()
end = time.time()
print('Time taken in seconds -', end - start)
Exercício:
Calcular uma aproximação do valor de 𝜋 a partir da seguinte série:
De acordo com a série anterior, a precisão do valor de 𝜋 aumenta quanto maior for o parâmetro N
utilizado.
Como referência, podesmos assumir o valor exato de 𝜋 como sendo o fornecido pela biblioteca numpy
:
import numpy as np
print(np.pi)
O objetivo de exercício é computar uma aproximação de 𝜋 usando a fórmula anterior para diferentes valores de N
.
Usando a biblioteca multiprocessing
, escreva um programa em python que:
-
Cria um pool de processos para rodar tarefas em paralelo
-
O tamanho do pool deve ser o número de cores da sua CPU menos 1 (8 cores -> pool de 7 processos)
-
Escreva uma função que rode em paralelo, chamada py_pi. A função deve receber como parâmetro o valor
N
que especifica o número de termos paa calcular a aproximação de 𝜋. -
A função deve imprimir o valor calculado, o valor real e a diferença do calculado para o real.
-
Rode as tarefas em paralelo, começando com N=10 aumentando 5 vezes para cada processo subsequente (por exemplo: 10, 50, 250, 1250…)
Por fim, espere todos os processos terminarem e imprima o tempo total decorrido.
Para entregar, façam um relatório descrevendo:
- A configuração da sua máquina (principalmente o número de núcleos)
- O tempo total de execução
- Um print do gerenciador de tarefas ou da saída do comando
top
no linux (para gerar o print, aumente o valor de N, para que dê tempo do print pegar os processos em execução)