임계구역 (Critical Section) 세마포어, 뮤텍스를 정리하기에 앞서 임계구역에 대한 개념이 필수적입니다. 다수의 프로세스가 처리되는 환경에서, 프로세스들은 일부 자원을 공유하게 됩니다. 이때 프로세스가 공유자원에 접근하게 되는 부분(영역)이 Critical Section(CS)입니다.
동기화(Synchronization) 여러개의 프로세스, 혹은 여러개의 스레드가 공유자원에 접근하게 되면 데이터가 마구잡이로 변할수도있습니다. 데이터가 무질서하게 수정되지 않고, 프로세스와 스레드의 접근을 제어하여 데이터의 정합성이 지켜지는 것을 동기화 라고 합니다. 공유자원에 대한 접근이 제어되면서 데드락이 발생하기도 하는데, 다음번에 알아보도록 합니다.
세마포어 (Semaphore) 공유자원의 동기화 방법 중 하나입니다. 프로세스나 스레드들의 접근을 제어하기위한 기법입니다. 단순하게 정수값을 갖는 변수로 볼수도있는데, 프로세스가 cs에 접근하면되면 값이 감소하고, cs에서 나오면 값이다시 증가하는 간단한 방식으로 생각할 수 있습니다. 깊게들어가면 cs에접근하지 않은 프로세스도 시그널을 보내서 락을 해제할 수 있습니다. 이 점이 뮤텍스와 가장큰 차이점입니다. 시스템콜을 활용하여 세마포어를 구현하는 부분도 중요한데 다음번에 보충하도록 합니다.
뮤텍스(Mutex) 상호배제 라는 이름의 동기화 방법입니다. 세마포어와 달리 cs에 접근할 수 있는 열쇠 하나 라고생각하면 편합니다. 쓰레드에 적용되는 동기화기법이라고도 하는데, 프로세스에도 쓰인다는 내용도있고 이점은 정확하지 않습니다. 쓰레드 하나가 cs에 접근할때 뮤텍스 객체에 락을 걸고 접근합니다. 이 방식에서 락킹 기법이라고도 합니다. cs에 탈출할 때는 뮤텍스 객체 언락을 합니다. 이후 다른 쓰레드가 뮤텍스를 들고 cs에 접근할 수 있습니다. 위에서 언급했듯이 세마포어와 가장큰 차이점은 뮤텍스는 락을 건 쓰레드만이 언락을 해줄 수 있다는 것입니다.
피터슨 알고리즘 세마포어와 뮤텍스 이외에도 공유자원의 동기화를 위한 방법들이 여러가지가 있는데, 그중 하나입니다. 이전에 입사시험에 코드가 출제된 기억이 떠올라 위키에서 퍼왔습니다.