문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 뮤텍스 (문단 편집) === 임계 구역 문제 === 임계 구역으로 설정해야 하는 부분이 임계 구역으로 지정되지 않았을 때 발생하는 문제이다. * 생산자 - 소비자 문제 * 독자 - 저자 문제 * 입출금 문제 대표적인 '생산자-소비자 문제' 로 [[키보드]] 입력을 들 수 있다. 일반적으로 키보드 입력은 시스템 메모리 내부에 일정한 크기의 [[큐(자료구조)|큐]]를 준비해 두고 사용자가 키보드를 타이핑하면 큐에 타이핑한 문자를 하나씩 넣고, 응용 프로그램은 큐에서 문자를 하나씩 얻어가서 처리하는 방식이다. 우선 큐에 문자를 넣는 부분은 운영체제에서 잘 처리해 준다고 생각하고, 큐에서 문자를 빼가는 쪽만 생각해 보자면... {{{#!syntax cpp char queue[32]; int head = 0; int tail = 0; ... int getchar() { int pos; char ret; pos = head; ret = queue[pos]; pos = (pos + 1) % 32; head = pos; return ret; } }}} 위와 같은 {{{getchar}}} 함수를 생각할 수 있다.[* 실제로는 큐에 키가 없으면 대기하는 부분이 있어야 하며, head를 이동시키는 부분은 fetch-and-add 등의 연산을 사용할 수도 있지만 최대한 단순화하여 생각한다.] 호출 이전에는 키 a, b, c를 입력하고 아직 아무도 이 키를 얻어가지 않은 상태라고 한다면, || head || 0 || || tail || 3 || || queue || ['a', 'b', 'c', ...] || 이다. 이 상태에서 getchar를 호출하면 || head || 1 || || tail || 3 || || queue || [~~'a'~~, 'b', 'c', ...] || 와 같이 된다. 이제, A, B 두 응용 프로그램이 동시에 버퍼에서 키를 가져가려고 ''getchar''를 A는 한 번, B는 두 번 호출했다고 가정한다. 본래대로라면 키 입력 세 개를 리턴하여 최종 결과는 || head || 3 || || tail || 3 || || queue || [~~'a', 'b', 'c',~~ ...] || 가 되어야 한다. 그런데... 1. (A) pos = head = 0; 2. (A) ret = queue[0] = 'a'; '''Context Switch''' 3. (B) pos = head = 0; 4. (B) ret = queue[0] = 'a'; 5. (B) pos = 1; → head = 1; 6. (B) pos = head = 1; 7. (B) ret = queue[1] = 'b'; 8. (B) pos = 2; → head = 2; '''Context Switch''' 9. (A) pos = 1; → head = 1; || head || 1 || || tail || 3 || || queue || [~~'a'~~, 'b', 'c', ...] || 결국, A는 'a', B는 'a', 'b'를 얻어가서 입력값이 왜곡되었다. 더군다나 키 입력값 세 개를 얻어간 상태인데도 버퍼에는 여전히 키 두 개가 남아있다. 즉 ''getchar'' 함수 내부에 큐에서 키를 빼내고 ''head''를 조정하는 부분은 두 프로세스, 혹은 스레드가 동시에 실행하면 안 되는 임계 구역이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기