IPC
프로세스는 독립적인 프로세스이거나 협력적인 프로세스이다.
- 독립적인 프로세스 : 다른 프로세스와 아무런 데이터도 공유하지 않는 프로세스
- 협력적인 프로세스 : 다른 프로세스에 영향을 주거나 받는 프로세스 또는 다른 프로세스와 데이터를 공유하는 프로세스
협력적인 프로세스들은 서로 간 데이터를 주고 받을 수 있는 프로세스 간 통신(interprocess communication, IPC) 기법이 필요하다. IPC에는 공유 메모리(shared-memory)와 메시지 전달(message-passing) 모델이 있다. 어떻게 하면 프로세스 간 데이터를 주고 받을 수 있을까? 프로세스가 다른 프로세스 메모리에 접근하는 것은 매우 위험하므로 OS에 의해 금지된다. 쉬운 방법은 프로세스들이 서로 접근할 수 있는 공유 메모리를 두는 것이다. 공유 메모리 모델은 응용 프로그래머가 직접 공유 메모리를 제어하는 방식이며 메시지 전달 모델은 OS가 공유 메모리를 제어하는 방식이다.
공유 메모리를 통한 IPC
프로세스들이 서로 접근할 수 있는 공유 메모리(버퍼)를 사용하려면 생산자-소비자 문제가 고려되어야 한다. 생산자 프로세스는 버퍼에 데이터를 생산한다. 소비가 프로세스는 버퍼에 있는 데이터를 소비한다. 그리고 생산자와 소비자는 고정 크기의 버퍼를 공유한다. (버퍼는 원형 큐로 구현된다.) 이때 하나 이상의 생산자와 소비자가 동시에 버퍼에 접근해 데이터를 생산하고 소비할경우 아래의 문제들이 발생할 수 있다. 이 문제가 생산자-소비자 문제이다.
- 생산자는 버퍼가 가득차면 더 이상 데이터를 생산하지 않아야 한다.
- 소비자는 버퍼가 비워있으면 더 이상 데이터를 소비하지 않아야 한다.
- 생산자와 소비자는 동시에 버퍼에 접근해서는 안된다.
위 문제를 발생하지 않도록 공유 메모리에 접근하고 조작하는 코드를 응용 프로그래머가 작성해 프로세스 간 데이터를 송수신한다. 하지만 이러한 코드를 작성하는 것은 응용 프로그래머에게 많은 부담이 된다. 그렇기에 OS가 공유 메모리를 제어하고 응용 프로그래머는 단순히 메시지 송신, 수신 연산으로 프로세스간 데이터를 주고받을 수 있는 메시지 전달 모델이 나왔다.
메시지 전달을 통한 ICP
OS는 Message-Passing을 통해 응용 프로그래머에게 프로세스간 데이터를 주고받을 수 있는 수단을 제공한다. OS는 최소 두 가지 연산(시스템 콜)을 제공하며 응용 프로그래머는 아래의 연산을 사용해 프로세스간 메시지를 송수신한다.
- send(message)
- receive(message)
Message-Passing으로 프로세스 P와 Q가 통신하려면 이들 사이의 통신 연결(communication link)이 설정되어야 한다. 하나의 링크(communication link)와 send()/receive() 연산을 논리적으로 구현하는 방법은 다음과 같다.
- 직접(direct) 또는 간접(indirect) 통신
- 동기식(synchronous) 또는 비동기식(asynchronous) 통신
- 자동(automatic) 또는 명시적(explicit) 버퍼링
직접 통신
직접 통신에서 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시한다. 직접 통신에서 send()/receive() 연산은 다음과 같이 정의한다.
- send(P,message) - 메시지를 프로세스 P에 전송한다.
- receive(Q, message) - 메시지를 프로세스 Q로부터 수신한다.
직접 통신의 링크는 다음의 특성을 가진다.
- 링크는 정확히 두 프로세스 사이에만 연관된다.
- 링크로 연결된 두 프로세스 사이에는 정확하게 하나의 연결만 존재한다.
- 링크는 자동으로 구축된다.
간접 통신
간접 통신에서 메시지들은 메일 박스 또는 포트(port)로 송신되고 그것으로부터 수신된다. 메일박스(포트)는 프로세스들에 의해 메시지들이 넣어지고 메시지들이 제거되는 객체이다. 간접 통신에서 send()/receive() 연산은 다음과 같이 정의한다.
- send(A, message) - 메시지를 메일박스 A로 송신한다.
- receive(A, message) - 메시지를 메일박스 A로부터 수신한다.
간접 통신의 링크는 다음의 특성을 가진다.
- 공유 메일박스를 통해서 링크가 구축된다.
- 링크는 두 개 이상의 프로세스들과 연관될 수 있다.
- 통신하고 있는 각 프로세스 사이에는 다수의 서로 다른 링크가 존재할 수 있고, 각 링크는 하나의 메일박스에 대응된다.
메일박스는 OS가 소유하고 있으며 프로세스에게 다음을 할 수 있는 방법을 제공한다.
- 메일박스 생성
- 메일박스를 통해 메시지를 송수신
- 메일박스 삭제
Blocking, Non-Blocking
메시지 전달 모델의 프로세스 간 통신은 send()/receive() 연산에 의해 이뤄진다. send()/receive() 연산을 구현하는 두 가지 설계 옵션이 있다. 하나는 blocking 방식이며 다른 하나는 non-blocking 방식이다. 이 두 방식은 각각 동기식(synchronous), 비동기식(asynchronous)으로 불린다.
- blocking send : 송신하는 프로세스는 메시지가 수신 프로세스 또는 메일박스에 의해 수신될때까지 봉쇄(block)된다.
- non-blocking send : 송신하는 프로세스가 메시지를 보내고 실행을 재개한다. (메시지를 보내는건 OS에게 맡기며 프로세스는 봉쇄되지 않는다.)
- blocking receive() : 수신하는 프로세스는 메시지를 모두 수신할때까지 봉쇄된다.
- non-blocking receive() : 수신하는 프로세스는 메시지를 받고 실행을 재개한다. (메시지를 받는건 OS에게 맡기며 프로세스는 봉쇄되지 않는다.)
클라이언트 서버 시스템에서의 IPC
POSIX 공유 메모리 모델 또는 UNIX의 Pipes로 한 컴퓨터 내에서 IPC가 가능하다. 하지만 컴퓨터가 네트워크에 연결됨에 따라 한 컴퓨터 내에서의 IPC가 아닌 네트워크로 연결된 컴퓨터 간의 IPC 기법이 나왔다. 이러한 기법에는 소켓(socket)과 원격 프로시저 호출(RPC)이 있다.
Socket
소켓은 통신의 종단점(endpoint)를 뜻한다. 두 프로세스가 네트워크 상에서 통신을 하려면 양 프로세스마다 하나씩, 총 두개의 소켓이 필요하다. 각 소켓은 IP 주소와 포트 번호 두 가지를 접합(concatenate)해 구별된다.
소켓은 효율적이지만 너무 낮은 수준이다. 우선 소켓은 스레드 간의 구조화되지 않은 바이트 스트림만을 전송할 수 있기 때문이다. 송신 측에서 구조화된 데이터를 바이트 스트림으로 변환하고 수신 측으로 전송한다. 수신 측에서 바이트 스트림을 수신하고 해석, 구조화해 데이터로 다시 변환한다. 이러한 작업은 응용 프로그래머의 부담을 높인다. 때문에 이에 대한 대안으로 더욱 높은 수준의 IPC 기법인 RPC가 있다.
RPC (Remote Procedure Call)
원격지에 있는 프로시저를 호출할 수 있는 기법이다. RPC는 클라이언트가 원격 호스트의 프로시저를 호출하는 것을 마치 자기의 프로시저를 호출하는 것처럼 해준다.
'Computer Science > OS' 카테고리의 다른 글
[OS - 6] CPU 스케줄링 (0) | 2023.05.03 |
---|---|
[OS - 5] 스레드 (0) | 2022.11.29 |
[OS - 3] 프로세스 (0) | 2022.11.15 |
[OS - 2] 운영체제 개요 (2) (0) | 2022.11.09 |
[OS - 1] 운영체제 개요 (1) (0) | 2022.11.02 |