Escolar Documentos
Profissional Documentos
Cultura Documentos
AUTOMAO INDUSTRIAL
Mdulo 3:
Excluso Mtua
Ao avaliar desenvolvimentos da matemtica, devemos sempre ter em mente
que as idias atrs das notaes so de longe a melhor metade
Carl B. Boyer, Histria da Matemtica
Prof:
Prof: Constantino
Constantino Seixas
Seixas Filho
Filho
sexta-feira,
sexta-feira, 25
25 de
de maro
maro de
de 2005
2005
1
Seo Crtica
Seo Crtica
Seo Crtica:
Trecho de cdigo de um programa onde as instrues no
podem ser intercaladas com a de outro programa
Seo Crtica
P1) Excluso mtua
O critrio de entrada na seo crtica deve ser tal que assegure que
nenhuma thread seja excluda da oportunidade de entrar. A inanio
tambm conhecida como adiamento indefinido
Se apenas uma thread deseja entrar em sua seo crtica, ela dever
conseguir faze-lo com um mnimo de overhead
4
Premissas
Uma thread nunca pode ficar em loop ou interromper sua execuo
Famlia de Solues
a) Tcnicas que assumem a no existncia de uma instruo especial,
no conjunto de instrues de um processador, capaz de ler e
escrever em um registro de memria de forma atmica. Esta
instruo denominada de test_and_set
b) Tcnicas baseadas na instruo test_and_set do processador e
portanto independentes do sistema operacional
c)
Pecados Mortais
Lgica proposicional
Lgica temporal
Demonstrao por absurdo
Loop Invariants
PIF = Princpio da Induo Finita
Exemplo:
No existe um nmero racional maior que 0 que seja o mnimo
Vamos supor que existe um nmero racional q maior que 0 que seja o
mnimo do conjunto dos nmeros racionais
Seja r = q/2. r positivo, menor que q e racional.
Logo q no o mnimo.
10
Problema
11
Princpio Intuitivo:
12
Exemplo:
Seja a srie: .: 1, 2, 3, 4, 5, 6, ...
Demonstrar que
Para n = 1
n = S (n) =
n =1
1
n = S (1) =
n =1
n( n + 1)
2
1(1 + 1)
=1
2
2
n =1
N +1
n =1
n =1
n = n + ( N + 1) =
N ( N + 1)
( N + 1)( N + 2)
+ ( N + 1) =
= S ( N + 1)
2
2
Problemas
Demonstre que:
a) n3 n divisvel por 3
b) n5 n divisvel por 5
c) A soma dos quadrados dos N nmeros naturais :
14
Torres de Hani
O Objetivo mover as peas da coluna da esquerda para a da
direita no menor nmero de passos de forma a que em nenhum
instante uma pea maior fique sobre uma menor
Modelagem do problema:
Para n=1 necessitamos de apenas um movimento logo:
T(1) = 1, onde T(n) o tempo para mover a torre no menor
nmero de passos possvel
15
Torres de Hani
Parece claro que o algoritmo para solucionar o problema
consiste em se mover a torre de N-1 peas para a coluna
central, depois mover a pea maior para o destino e finalmente
mover a torre intermediria para o destino
Posio Inicial
2) Mover Base
Logo: T(N)=2T(N-1)+1
16
Torres de Hani
O nmero de passos necessrios para realizar a transferncia :
.: 1, 3, 7, 15, ...
Ns poderamos sugerir uma expresso geral para a(n):
A(n)=2n-1
Demostre que a expresso anterior verdadeira usando PIF:
17
Loop Invariant
18
Loop Invariants
// Variveis globais:
int s1 = 1;
int s2 = 1;
Thread T1;
{ int x = 0;
loop {
a1: s1 = s1 - 1 ;
b1: if (s1 >= 0) x= s1;
c1:
s1 = s1 + 1;
} // end_loop
} // ThreadT1
Thread T2;
{ int x = 0;
loop {
a2: s2 = s2 -1;
b2: if (s2 >= 0) x= s2;
c2:
s2 = s2 +1;
} // end_loop
} // ThreadT2
Proposio de Invariantes:
a) s1 >= 0
b) s1 = 0 v s1 = 1
c) x = 0
d) s2 >= 0
e) s2=0 v s2 = 1
19
Demonstrao
Voltando ao exemplo anterior, vamos demonstrar a propriedade:
Q (s1 = 0 v s1 = 1).
No incio a afirmativa verdadeira:
a1: (s1 = 0 v s1 = 1) s1 = 0 pela semntica da inicializao
Vamos examinar a primeira transio vlida:
a1 b1: s1 = s1 -1;
A expresso se torna: (s1 = -1 v s1 = 0)
A demonstrao FALHOU
20
10
Demonstrao Tentativa 2
Vamos tomar uma propriedade auxiliar:
P (at(a1) s1 = 1) ^ ((at(b1) v at(c1)) s1 = 0) um invariante
Demonstrao
Transio
Demonstrao
Transio
em a1
c1 a1
a1 b1
a2 b2
O invariante no afetado
b2 c2
O invariante no afetado
c2 a2
O invariante no afetado
b1 c1
21
Demonstrao Tentativa 2
O invariante:
P (at(a1) s1 = 1) ^ ((at(b1) v at(c1)) s1 = 0)
Foi demonstrado utilizando PIF
Ora, como o programa tem trs instrues podemos afirmar:
Q = at(a1) V at(b1) V at(c1)
Das duas afirmativas deduzimos:
R = (s1 =1) V (s1 = 0)
c.q.d.
22
11
Exerccios
a) Complete as tabelas verdades abaixo:
a
avb
a^b
ab
ab
ab
~a
~b
~a^b
~b^a
(~a^b) v (~b^a)
a b = (~a^b) v (~b^a)
b) Demonstre que:
Se ((a b) ^ a) b
(modus ponens)
23
// espera
// anuncia que deseja entrar
// libera direito para outras threads
// espera
// anuncia que deseja entrar
// libera direito para outras threads
24
12
Solicita1
Solicita2
25
Tentativa 1
26
13
Tentativa 2
// Variveis globais
BOOL solicita1 = FALSE;
BOOL solicita2 = FALSE;
Thread T1;
{
loop {
***
a1:
solicita1 = TRUE;
b1:
while (solicita2 ) ;
c1:
SeoCrtica;
d1:
solicita1 = FALSE;
e1:
SeoNoCrtica;
} // end_loop
}
// ThreadT1
Thread T2;
{
loop {
***
a2:
solicita2 = TRUE;
b2:
while (solicita1 ) ;
c2:
SeoCrtica;
d2:
solicita2 = FALSE;
e2:
SeoNoCrtica;
} // end_loop
}
// ThreadT2
27
Demonstrao
Temos que demonstrar quatro propriedades:
1. Excluso Mtua
2. Ausncia de deadlock
3. Ausncia de inanio
4. Facilidade de acesso em caso de ausncia de conteno
28
14
15
Tentativa 3
// Variveis globais:
int vez = 1;
Thread T1;
{
loop { ***
a1:
while (vez == 2 ) ;
b1:
SeoCrtica;
c1:
vez = 2;
d1:
SeoNoCrtica;
} // end_loop
} // ThreadT1
Thread T2;
{
loop { ***
a2:
while (vez == 1) ;
b2:
SeoCrtica;
c2:
vez = 1;
d2:
SeoNoCrtica;
} // end_loop
} // ThreadT2
// espera
// libera direito para outra thread
31
Tentativa 3
Este algoritmo falha na ausncia de conteno.
Por que ?
32
16
Algoritmo de Peterson
// Variveis globais
int vez = 0;
BOOL solicita1 = FALSE;
BOOL solicita2 = FALSE;
Thread T1 {
loop {
***
a1:
solicita1 = TRUE;
b1:
vez = 2;
c1:
while (solicita2 && (vez == 2)) ;
d1:
SeoCrtica;
e1:
solicita1 = FALSE;
f1:
SeoNoCrtica;
} // end_loop
}
// ThreadT1
Thread T2 {
loop {
***
a2:
solicita2 = TRUE;
b2:
vez = 1;
c2:
while (solicita1 && (vez == 1)) ;
d2:
SeoCrtica;
e2:
solicita2 = FALSE;
f2:
SeoNoCrtica;
} // end_loop
}
// ThreadT2
33
Demonstrao
34
17
Algoritmo de Dekker
int c1, c2 = 1;
int vez = 1;
Thread T1 {
loop {
SeoNoCrtica;
c1 = 0;
while (c2 != 1)
if (vez == 2) {
c1 = 1;
while (vez != 1) ;
c1 = 0;
} // if
} // end_loop
SeoCrtica;
c1 = 1;
vez = 2;
} // ThreadT1;
Thread T2 {
loop {
SeoNoCrtica;
c2 = 0;
while (c1 != 1)
if (vez == 2) {
c2 = 1;
while (vez != 2) ;
c2 = 0;
} // if
} // end_loop
SeoCrtica;
c2 = 1;
vez =1;
} // ThreadT1;
//
//
//
//
//
//
//
//
//
//
//
//
35
Algoritmo de Dekker
Como o algoritmo de Dekker se compara como o algoritmo de Peterson ?
36
18
if (M==0)
flag = 0
else flag = 1;
M = 1;
M = Memria Global
Memria Ocupada
Memria Livre
0
Flag=0
Flag=1
37
38
19
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
Status
Interpretao
WAIT_OBJECT_0
WAIT_TIMEOUT
Ocorreu timeout
WAIT_ABANDONED
WAIT_FAILED
A funo falhou
39
// _beginthreadex() e _endthreadex()
// _getch
// Ativa funo CheckForError
20
// delay de 10 ms
42
21
WaitForMultipleObjects
DWORD WaitForMultipleObjects (
DWORD nCount,
BOOL bWaitAll,
DWORD dwMilliseconds
);
bWaitAll
Status
Interpretao
TRUE
FALSE
WAIT_OBJECT_0
Valor
WAIT_ABANDONED_0 +
x
WAIT_TIMEOUT
Ocorreu timeout
WAIT_FAILED
Funo falhou
43
Uso de WaitForMultipleObjects
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
// _beginthreadex() e _endthreadex()
#include <conio.h>
// _getch
#define _CHECKERROR
1
// Ativa funo CheckForError
#include "CheckForError.h"
// Casting para terceiro e sexto parmetros da funo _beginthreadex
typedef unsigned (WINAPI *CAST_FUNCTION)(LPVOID);
typedef unsigned *CAST_LPDWORD;
DWORD WINAPI TestFunc(LPVOID);
// declarao da funo
int main()
{
HANDLE hThreads[3];
DWORD dwThreadId;
DWORD dwExitCode = 0;
DWORD dwRet;
int i;
44
22
Uso de WaitForMultipleObjects
for (i=0; i<3; ++i) {
// cria 3 threads
hThreads[i] = (HANDLE) _beginthreadex(
NULL,
0,
(CAST_FUNCTION)TestFunc,
(LPVOID)i,
0,
(CAST_LPDWORD)&dwThreadId);
if (hThreads[i]) printf("Thread %d criada com Id= %0x \n", i, dwThreadId);
} // for
dwRet = WaitForMultipleObjects(3,hThreads,TRUE,INFINITE);
CheckForError((dwRet >= WAIT_OBJECT_0) && (dwRet < WAIT_OBJECT_0 + 3));
for (i=0; i<3; ++i) {
GetExitCodeThread(hThreads[i], &dwExitCode);
printf("thread %d terminou: codigo=%d\n",i,dwExitCode);
CloseHandle(hThreads[i]);
// apaga referncia ao objeto
} // for
printf("\nAcione uma tecla para terminar\n");
_getch(); // Pare aqui, caso no esteja executando no ambiente MDS
return EXIT_SUCCESS;
} // main
45
Uso de WaitForMultipleObjects
DWORD WINAPI TestFunc(LPVOID index)
{ int i;
for(i=0; i<50; ++i) {
printf("%d ", index);
// Sleep(10);
// delay de 10 ms
}
printf("\n");
_endthreadex((DWORD) index);
return(0);
} // TestFunc
46
23
Objetos do Kernel
OBJETO
DESCRIO
Thread
Process
Change
notification
Console input
Event
Mutex
Semaphore
File
Timer
47
CriticalSection
VOID InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
VOID DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
48
24
Exemplo CriticalSection
DWORD WINAPI MyThread(LPVOID);
// Variveis Globais
CRITICAL_SECTION CriticalSection;
// declarao da funo
int main() {
HANDLE hThread;
DWORD dwThreadId;
DWORD dwExitCode = 0;
DWORD dwRet;
InitializeCriticalSection(&CriticalSection);
hThread = (HANDLE) _beginthreadex(
NULL,
0,
(CAST_FUNCTION)MyThread,
(LPVOID)i,
0,
(CAST_LPDWORD)&dwThreadId
);
*****************
EnterCriticalSection(&CriticalSection);
SeoCrtica;
LeaveCriticalSection(&CriticalSection);
*****************
49
Exemplo CriticalSection
50
25
Mutex
51
CreateMutex
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
// Nome do objeto.
);
Retorno:
Status
Interpretao
Sucesso
NULL
Falha
52
26
OpenMutex
HANDLE OpenMutex(
DWORD dwDesiredAccess,
// Atributos de segurana:
MUTEX_ALL_ACCESS: o handle pode ser usado em qualquer funo.
SYNCHRONIZE: o handle pode ser usado apenas nas funes Wait e
ReleaseMutex().
BOOL bInheritHandle,
LPCTSTR lpName
);
Retorno:
Status
Interpretao
Sucesso
NULL
Falha
53
Wait / ReleaseMutex
Operao de Wait:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
Operao de Release:
HANDLE ReleaseMutex(HANDLE hMutex);
Retorno:
Status
Interpretao
TRUE
Sucesso
FALSE
Falha
54
27
Mutex - Exemplo
// Variveis Globais
HANDLE hMutex;
int main()
{
HANDLE hThread;
DWORD dwThreadId;
DWORD dwExitCode = 0;
DWORD dwRet;
hMutex = CreateMutex(NULL, FALSE, "AcessaMapa");
hThread = (HANDLE) _beginthreadex(
NULL,
0,
(CAST_FUNCTION)MyThread,
(LPVOID)i,
0,
(CAST_LPDWORD)&dwThreadId
);
***************************
WaitForSingleObject(hMutex, INFINITE);
SeoCrtica;
ReleaseMutex(hMutex);
***************************
55
Mutex - Exemplo
56
28
Propriedades do Mutex
WAIT_ABANDONED_0
WaitForMultipleObjects()
WAIT_ABANDONED_0 + X,
onde X o ndice da thread que abandonou a Seo Crtica
Funes complementares
LONG InterlockedIncrement(
LPLONG lpAddend
);
LONG InterlockedDecrement(
LPLONG lpAddend
);
Retorno:
LONG InterlockedExchange(
Status
Interpretao
ret
LPLONG lpTarget,
LPLONG Value
);
Retorno:
Status
Interpretao
ret
29
59
60
30
61
62
31
Insight x Mtodo
63
64
32
Invariante
Quebra cabea dos 15
1
10
11
12
10
11
12
13
14
15
13
15
14
10
10
11
13 14
15 12
13 14
14
13 15
11 12
13
15
3
7
4
8
10 11
12
10 11
14 15 12
14
13
3
7
10 11
15 12
9
13 14
10 11
15 12
66
33
Invariante
Um pirata escondeu um tesouro em uma ilha e construiu um mapa com indicaes:
C
T
A
Chegando ilha v at o poste da forca indicado na figura pela letra F e de l ande reto at um
pinheiro P, medindo a distncia percorrida.
Chegando ao pinheiro, vire esquerda e ande igual distncia em angulo reto com a trajetria
anterior. Marque o ponto A.
Ainda a partir da forca ande em direo ao carvalho C e l chegando vire direita, caminhando
em angulo reto a mesma distancia anterior. Marque o ponto B. O tesouro est enterrado no
ponto mdio do segmento AB.
Ao chegar ilha constataram que a forca havia sido demolida e j no existia mais nem trao
de onde estava localizada, mas o pinheiro e o carvalho ainda estavam l.
Mesmo assim eles encontram o tesouro. Descubra como e qual o raciocnio empregado.
From: The kinematic method in geometrical problems Yu.I.Lyubich and L.A.Shor, Mir Publishers
67
Exerccio P.I.F.
68
34
2)
3)
Muito Obrigado
70
35