문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 뮤텍스 (문단 편집) === 뮤텍스 === 이제 두 처리 단위가 임계 구역에 동시에 접근하지 못하도록 막는 기법이 필요해진다. 이를 '상호 배제('''Mut'''ual '''Ex'''clusion)'이라고 하며 보통 '뮤텍스'로 줄여서 이야기한다. 아주 단순하게 생각하면 뮤텍스는 아래 두 가지 연산만을 지원하면 된다. * ''lock'': 현재의 임계 구역에 들어갈 권한을 얻어온다. 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할때까지 대기한다(entry section). * ''unlock'': 현재의 임계 구역을 모두 사용했음을 알린다. 대기중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다(exit section). 위의 ''getchar'' 함수를 뮤텍스를 활용해 다시 작성한다. {{{#!syntax cpp char queue[32]; int head = 0; int tail = 0; mutex keymutex; ... int getchar() { int pos; char ret; lock(keymutex); /* entry section */ /* critical section begin */ pos = head; ret = queue[pos]; pos = (pos + 1) % 32; head = pos; /* critical section end */ unlock(keymutex); /* exit section */ return ret; /* remainder section */ } }}} 다시 프로세스 A, B가 키 입력을 얻어간다고 하면 1. (A) lock keymutex; 2. (A) pos = head = 0; 3. (A) ret = queue[0] = 'a'; '''Context Switch''' 4. (B) lock keymutex: '''Blocked'''[* 이미 A가 keymutex를 잠가 둔 상태이기 때문에 B는 A가 keymutex를 풀 때까지 대기하여야 한다. 실제로 운영체제에서는 뮤텍스가 잠겨 있으면, 뮤텍스를 소유한 프로세스/스레드로 context switch해준다.] '''Context Switch''' 5. (A) pos = 1; → head = 1; 6. (A) unlock keymutex; '''Context Switch''' 7. (B) '''returned from lock''' 8. (B) ... 9. (B) pos = 3; → head = 3; 10. (B) unlock keymutex; || head || 3 || || tail || 3 || || queue || [~~'a', 'b', 'c',~~ ...] || 의도한대로 잘 작동한다. 이제 임계구역은 한 덩어리로 묶여서 실행되며, 임계구역 수행 중간에 다른 프로세스/스레드가 임계구역에 진입할 수 없게 된다. 이를 원자적(atomic)으로 실행된다고 칭한다. [[DBMS]]의 [[트랜잭션]] 역시 원자적인 연산의 한 종류이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기