1
•
Conjunto de protocolos usados para manter a integridade do sistema e/ou controlar o acesso a
•
•
3
programador de forma a tirar partido do multiprocessamento.
• controlar o acesso a recursos partilhados
Exemplo
Considerem-se dois processos
concorrentes em que um faz a leitura
de um teclado e outro que envia
O Teclado cada vez que recebe um
caracter incrementa uma variavel
n=n+1;
caracter decrementa essa variavel
n=n-1
isto seria traduzido por
LOAD
R,n
INC
R
STORE n,R
e
LOAD
R,n
DEC
R
STORE n,R
5
uma
.
Uma
normalmente protege dados partilhados. Quando um processo
periodo de tempo, utiliza um recurso partilhado impedindo o
acesso qualquer outro processo .
recurso
dos processos em conflito
processos acederem ao recurso partilhado.
7
program mutex1;type who = (proc1,proc2); var turn: who;
process p1;
begin
while true do begin
while turn = proc2 do {keeptesting}; critical_section; turn := proc2; other_p1_processing; end; end; process p2; begin
while true do begin
while turn = proc1 do {keeptesting}; critical_section; turn := proc1; other_p2_processing; end; end; begin turn:= …; initite p1,p2; end;
Exemplo 1
sim. Mas…. • restantes…•Se um dos processos for mais lento na parte
other_??_processing
•Se um dos processos termina ou “estampa-se”
em tempo finito.”
program mutex2;
var p1using, p2using: boolean; process p1;
begin
while true do begin
while p2using do {keeptesting}; p1using :=true; critical_section; p1using:=false; other_p1_processing; end; end; process p2; begin
while true do begin
while p1using do {keeptesting}; p2using :=true; critical_section; p2using:=false; other_p2_processing; end; end; begin p1using:=false; p2using:=false; initiate p1,p2; program mutex3; var p1using,p2using:boolean; process p1; begin
while true do begin p1using:=true;
while p2using do {keeptesting}; critical_section; p1using:=false; end; end; process p2; begin
while true do begin p2using:=true;
while p1using do {keeptesting}; critical_section; p2using:=false; end; end; begin p1using:=false; p2using:=false; initate p1,p2;
Exemplo 2
Exemplo 3
9
#define FALSE 0 #define TRUE 1 #define N 2 int turn; int interested[N];enter_region( int process) {
int other; other = 1 - process; interested[process] = TRUE; turn = process;
while (turn == process && interested [other] == TRUE); }
leave_region(int process){
interested[process]=FALSE; }
ser acedida e manipuladas por meio das primitivas SIGNAL e WAIT.
wait(s):
while (s==0) ;
s= s-1;
signal:
s=s+1;
11
/* smutex*/semaphore mutex; /* binario */ p1(){ while (1) { wait(mutex); critical_section; signal(mutex); other_processing(); } } p2(){ while (1) { wait(mutex); critical_section; signal(mutex); other_processing(); } } p3(){ while (1) { wait(mutex); critical_section; signal(mutex); other_processing(); } } main(){ mutex = 1; /* livre */ inicia_processos(p1,p2,p3); }