Message Passing
지난 글까지 정리한 프로세스 동기화는 모두 하나의 컴퓨터에서 같은 메모리와 CPU를 공유하는 서로 다른 프로세스 사이의 동작을 이야기했다. 이번에는 네트워크로 연결된 서로 다른 컴퓨터 상에서 돌아가는 서로 다른 프로세스 사이의 동작에 대해 이야기해본다.
서로 다른 프로세스 사이에 메세지를 주고받으려면 네트워크를 통해서 메세지를 전송하고 수신할 수 있어야 한다.
메세지를 전송할 때는 send(), 메세지를 수신할 때는 receive() 라는 시스템 콜을 사용한다.
send() 는 목적지로 메세지를 전송하는 것이니 간단한데, receive() 의 경우, 호출 했을 때 자신에게 온 메세지가 없다면 blocked 상태로 빠지거나(Sleep) 에러 코드를 return 할 수 있다. (뒤에서 볼 예제는 첫번째 방법을 사용하여 blocked 상태가 된다.)
send(), receive() 를 구현할 때는 여러가지 고려사항이 있을 수 있다.
메세지가 네트워크를 타고 가다가 중간에 유실될 수 있으니 ACK 신호를 응답하는 체계가 필요하고,
메세지를 연속적으로 여러개 보내기 위해서 메세지와 ACK에 번호를 붙일 수도 있다.
또한 프로세스를 단순히 source, destination 으로 구분하기 보다 이름을 지어줘야 하며,
네트워크를 통해 들어온 메세지가 정말 그 프로세스가 보낸 메세지인지 확인하는 인증 절차가 필요하다.
마지막으로 같은 컴퓨터 내에서 실행되는 프로세스의 경우 네트워크를 통해서 메세지를 전달하는 것보다 메모리를 통해 소통하는 것이 더 효율적이므로 케이스를 따로 처리해주어야 한다.
이제 메세지 전달에 대해 구체적인 예시를 살펴보자.
생산자 소비자 문제를 서로 다른 컴퓨터 위에서 돌아가는 두 프로세스 상황에서 생각해보자.
생산자는 아이템을 만들고, 소비자가 보낸 empty 신호를 받으면 그때 아이템을 메세지에 담아서 소비자에게 보낸다.
소비자는 미리 N개의 empty 신호를 보내두고, 무한 반복을 돌면서 생산자의 생산 메세지를 받아 아이템을 사용한다.
이렇게 메세지 패싱을 하는 상황에서는 '공유버퍼' 라는 개념이 없다.
두 프로세스가 애초에 다른 컴퓨터에서 돌아가고 있기 때문에 공유하는 공간이 없기 때문이다.
Barrier
배리어는 여러 프로세스들의 실행 타이밍을 동기화하고자 할 때 유용하다.
위 그림에서 보는 것처럼 4개의 프로세스 A, B, C, D의 실행 타이밍을 동기화해야한다면, 그 동기화해야하는 타이밍에 배리어를 둔다.
각 프로세스는 베리어 영역에 들어올 때마다 barrier primitive 라는 것을 실행하고 Blocked 상태로 들어간다. (sleep)
만약 4개의 모든 프로세스 그룹이 다 도착해서 barrier primitive 를 실행하면, 그때 4개의 프로세스가 풀려나면서 모두 다음 단계로 넘어갈 수 있게 된다.
예를 들어 t1 부터 t9 각각의 시점에 새로운 어떤 온도를 계산해야 하는데, 각 온도 계산식은 주변 온도의 계산이 끝나야 주변 온도를 가지고 계산할 수 있다고 해보자.
그러면 주변 온도의 계산이 모두 끝날 때까지 배리어를 통해서 전체 계산의 종료 타이밍을 맞출 수 있다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 7. 스케줄링 (1) - 개요 (0) | 2024.10.20 |
---|---|
[운영체제] 6. 프로세스 동기화 (4) - 식사하는 철학자 문제 (2) | 2024.10.19 |
[운영체제] 4. 프로세스 동기화 (2) - 세마포, 뮤텍스, 모니터 (0) | 2024.10.19 |
[운영체제] 3. 프로세스 동기화 (1) - 상호배제와 Busy Waiting (2) | 2024.10.17 |
[운영체제] 2. 프로세스 (5) | 2024.10.16 |