mutex - 해당되는 글 1건

동기화 오브젝트는 크게 메세지 큐도 되는데
좀더 크게 이야기하면 세마포어랑 뮤텍스가 있다
semaphore
mutex 이것도 내부적으로 세마포어로 구현 할수있다.
세마포어랑 뮤텍스랑
A.C  B.C
int g_flag; extern int g_flag;
main()  app_main()

프로세스가 하나 생성되면서 내부적으로 쓰레드가 하나있다.
스레드가 1개면의미가 없다.스레드를 추가로 하면
하나의 프로세스에 여러개의 프로세스가 돌고있다.
스레드의 특징은 하나의프로세스에서 돌고 있기 때문에
메모리 영역은 다 공유를 한다.

P1  P2
th1  
th2
th3
th4
프로세스 1에서 프로세스2 통신을 위해서
메세지큐나 공유메모리를 사용하게 된다.(프로세스간의 메모리는 보호된다)

process
t1
t2
t3
t1에서 t2에의 한지역변수를 참조할수있다.
오버헤드가 작고 빠르지만
프로세스는 메모리 보호가 되지만
스레드끼리는 메모리가 보호가 안되서
서로 침범을 가능할수있다.

하나의 프로세스에 여러개의 스레드가 발생
g_flag가있을때
th1과 th2와 th3까 있다

th1
g_flag =1
g_flag ++;
g_flag
원하는 2

th2
g_flag =3;
g_flag ++;
원하는 값 4

th3
g_flag =0;
g_flag --;
원하는 결과 -1

이렇게 되지만 중간중간 th1 th2 th3이렇게 반복되면서 일이 되면서 일을 처리하기 때문에
값이 이상하게 되버린다.

th1이 실행할동안에 중간에 값이 변하면안된다.이 영역을 크리티컬 섹션이라고한다.
크리티컬 섹션을 주고 계산을 하게 한다.
---------------------------------------------------
크리티컬 섹션 잠가준다
th1
g_flag =1
g_flag ++;
g_flag
크리티컬섹션을 열어준다
---------------------------------------------------
---------------------------------------------------
크리티컬 섹션 잠가준다
th2
g_flag =3;
g_flag ++;
크리티컬섹션을 열어준다
---------------------------------------------------
---------------------------------------------------
크리티컬 섹션 잠가준다
th3
g_flag =0;
g_flag --;
크리티컬섹션을 열어준다
---------------------------------------------------
th1이 잠겨서 들어가고 스케줄링에의해서 th2가 실행되면 th2는  크리티컬을섹션을 잠가서
들어갈려고 하는데 열쇠가 없어서 잠그지 못하고 슬립상태로 대기하고있다.
th3도 마찬가지임 슬립상태로 대기 하고 있다. th1이 끝나고 크리티컬섹션을 열어주면
열쇠가 반납되고 다음일이 생길수있다.
________________________________________________________________________________________

func()---------------------------------
크리티컬섹션 잠가준다
g_flag=???
크리티컬섹션 열어준다.
------------------------------------------
th1,th2,th3가 있을때 th1이 g_flag를 참조하고 들어가면 th1이 나올때까지
th2,th3가 못들어간다.
_________________________________________________________________________________________
세마포어는 그 키값이 다양하게 존재할수있는데(열쇠를 많이 만들수 있다)
퓨텍스는 0,1 밖없다.(락 언락 개념 열쇠가 1개)
_________________________________________________________________________________________
semaphore-put 일을 끝내고 열쇠를 반납한다는 뜻이다.
semaphore-get 열쇠를 획득해서문을 열고 들어간다는것이고.
get은 1감소 (쓸수있는 키를 가져다가 임계영역으로 들어가니까)
put은 1증가(일끝내고 열쇠를 반납)
_____________________________________________________________________________________________
mutex
Lock      은 0
unLock은 1
뮤텍스는 unlock을 백번해도 계속 1이다
_____________________________________________________________________________________________
데드락 예제
ASDF                  ZXCV
A Lock                B Lock
B Lock                A Lock
B Unlock             A Unlock
A Unlock             B Unlock
asdf가 a락걸고 zxcv가 b락걸고 들어가면  asdf가 b락걸라고하면 대기 zxcv가 a락 걸라고 하면 대기

      c 언어  |  2007. 9. 18. 12:19



sokoban's Blog is powered by Daum & Tattertools