모니터와 메시지 전달
잠그고 푸는 일을 언어가 대신 해 줄 수는 없을까?
모니터
공유 데이터를 연산과 함께 가둡니다
모니터(monitor)는 공유 데이터와 그것을 다루는 연산을 한 단위로 묶습니다. 바깥의 태스크는 데이터에 직접 손댈 수 없고, 모니터가 내놓은 연산을 불러야만 합니다.
데이터와 연산을 한 덩어리로 묶고 속을 감춘 타입을 추상 자료형이라고 합니다(10강). 모니터는 공유 데이터를 위한 추상 자료형입니다.
경쟁 동기화
입구는 하나, 한 번에 하나
모니터는 한 번에 한 태스크만 안으로 들입니다. 누가 안에 있을 때 연산을 부른 태스크는 큐에서 기다립니다. 이 일을 모니터가 알아서 하므로 프로그래머가 wait와 release를 적지 않아도 됩니다.
Ada, 자바, C#이 모니터를 지원합니다.
모니터 평가
경쟁은 자동, 협력은 그대로
경쟁 동기화는 모니터가 대신 해 주므로 빠뜨릴 일이 줄어듭니다. 하지만 빈 버퍼에서 꺼내거나 꽉 찬 버퍼에 넣는 것을 막는 협력 동기화는 여전히 프로그래머가 짜야 합니다.
세마포어로 모니터를 만들 수 있고 모니터로 세마포어를 만들 수 있어서, 둘이 할 수 있는 일의 범위는 같습니다.
메시지 전달
둘 다 준비되면 만납니다
메시지 전달(message passing)은 데이터를 함께 쓰는 대신 태스크끼리 메시지를 건넵니다. 보내는 쪽이 먼저 준비되면 받는 쪽이 준비될 때까지 기다립니다. 둘이 만나 메시지가 건너가는 것이 랑데부(rendezvous)입니다.
굵은 선은 실행 중인 구간, 점선은 기다리는 구간입니다.
동기식 메시지 전달
먼저 온 쪽이 기다립니다
받는 쪽이 먼저 준비되면 이번에는 받는 쪽이 기다립니다. 어느 쪽이 먼저 오든 둘 다 준비돼야 메시지가 건너갑니다. 이렇게 때를 맞춰 건네는 방식이 동기식 메시지 전달입니다.
이 강의가 따르는 교재는 의사와 환자의 만남에 견줍니다. 대부분의 시간은 한쪽이 기다리고, 둘 다 준비돼야 만납니다.
언어가 갖출 것
받겠다는 표시, 기다리는 줄
메시지 전달을 지원하려면 언어에 두 가지가 있어야 합니다. 태스크가 받을 준비가 됐음을 나타내는 수단, 그리고 기다리는 보낸 쪽을 기억해 두었다가 다음 메시지를 공정하게(먼저 온 순서대로) 고르는 방법입니다.
메시지 전달은 세마포어와 모니터가 하는 일을 모두 나타낼 수 있는 일반적인 모델입니다.
다음 편