본문 바로가기

Library/Computer System

Critical Section

경쟁 조건을 피하는 문제에서, 프로세스는 이따금 공유 메모리나 파일들에 접근해야만 하고, 경쟁을 유발하는 일을 하게 된다. 공유 메모리에 접근하는 프로그램 부분을 임계구역(critial region, 또는 critical section)이라 한다. 어떤 두 프로세스도 동시에 임계구역에 둘 수 없도록 한다면, 경쟁 상태를 피할 수 있다.

비록 이와 같은 요구 사항이 경쟁 조건을 피할 수 있어도, 병렬 프로세스들이 정확하게 협력하고, 효율적으로 공유 데이터를 사용하기 위한 충분 조건은 아니다. 좋은 해법을 얻기 위해서는 다음 4가지 조건이 필요하다.

1. 어떤 두 프로세스도 동시에 임계구역 안으로 들어갈 수 없다.
2. CPU의 속도나 수에 대한 어떤 가정도 없다.
3. 임계구역 밖에서 수행되는 어떤 프로세스도 다른 프로세스를 블록시킬 수 없다.
4. 어떤 프로세스도 임계구역에 들어가기 위해 영원히 기다리지는 않는다.

그리고, 당연한 이야기지만 여기서의 Critical Section은 Win32 환경의 단일 프로세스에서 스레드 사이의 동기화를 제공하기 위한 경량 뮤텍스인 CRITICAL_SECTION을 의미하는 용어가 아니다. 스레드를 처리하기 위한 표준으로는, POSIX THREAD 라이브러리가 있지만, Win32처럼 표준이 아님에도 불구하고 워낙 널리 쓰여서 표준처럼 간주되는 라이브러리도 있다. Win32 환경에서 작업한다면 스레드 사용은 거의 필수적인 요소가 된다. Win32은 VMS의 후손이며, VMS의 유전적 특징 상 하나의 프로세스 생성은 현대적인 유닉스에 비해 비싼 작업이다. 따라서, Win32 환경에서는 여러 프로세스를 생성하고 IPC를 통한 협력 하는 방법보다, 단일 프로세스 내에서 다중 스레드 사용이 권장된다. 반대로, 현대적인 유닉스 운영체제에서는 프로세스 생성은 무거운 편이 아니며, 유닉스 설계 철학 상 다른 프로세스와 협력하는, 작은 프로세스를 만드는 것이 권장된다.


Reference
Andrew S. Tanenbaum, Modern Operating System, Second Edition