OS? Oh Yes! 책을 바탕으로 학습한 내용입니다.
상호배제는 경쟁 상태의 병행 프로세스간 임계 자원에 속하는 공유 자원에 대한 문제에 있어서 임계 영역(Critical Section)에 한번에 하나의 프로세스만 진입하도록 하는 것이다.
운영체제의 도움 없이 병행하는 프로세스들이 상호배제를 책임지도록 하는 기법, 임계 영역의 앞뒤로 적절한 처리를 해준다.
운영체제의 도움 없이도 상호배제를 성공적으로 구현할 수 있지만 임계영역 앞에서 반복문을 계속해서 돌면서 바쁜 대기(Busy Wait) 또는 스핀락(Spinlock)을 피할 수 없기 때문에 CPU를 낭비하는 결과를 초래하며 개발자의 실수로 인한 오류의 가능성이 있다.
세 개의 특수한 명령들(초기화, wait, signal)만 접근할 수 있게 허용되는 보호된 변수로 운영체제 수준에서 병행성을 제공하여 상호배제 명령을 구현할 수 있다. 운영체제 수준에서 임계영역 진입을 기다리는 프로세스들을 대기 상태로 전환시킴으로써 바쁜 대기를 할 때의 CPU 낭비를 없앨 수 있다.(block and wakeup) 하지만 바쁜 대기보다 반응이 즉각적이지 못하며 대기 상태로 만드는 비용을 감수해야하며 기아(Starvation)를 일으킬 수 있다.
세마포어는 상호배제의 구현뿐만 아니라 동기화도 쉽게 구현할 수 있다. 상호 의존 관계의 프로세스 사이에서 두 프로세스의 진행을 조정하여 동기화를 구현한다.
임계영역의 진입을 시도하는 프로세스들에게 순번 표를 부여함으로써 기다린 순서대로 처리되게 하여 기아(Starvation)를 방지할 수 있다.
모니터란 공유 데이터들과 이들에 대한 임계영역들을 관리하는 소프트웨어 구성체다. 호출 대기 큐(진입 큐), 조건 큐, 신호자 대기 큐가 필요하다.
생산자와 소비자 문제
생산자는 데이터를 만들어 버퍼에 저장하고 소비자는 버퍼에 접근하여 데이터를 소비할 때 버퍼는 공유 자원이므로 버퍼에 대한 접근은 상호배제되어야한다. 또한 버퍼가 가득 찼을 때는 생산자가 기다리고, 버퍼가 비었을 때는 소비자가 기다려야하므로 동기화되어야 한다.
식사하는 철학자
원형 테이블에서 5명의 철학자가 식사할 때 각 철학자 사이에 포크가 하나 씩 있다. 철학자는 식사를 하려면 양쪽의 포크를 모두 사용해야한다. 모든 철학자가 동시에 왼쪽 또는 오른쪽 포크를 집으면 교착상태에 빠지고 양쪽의 포크를 모두 집도록하면 기아가 발생할 수 있다.