프로세스간의 통신
IPC(Inter-Process Communication)
함께 실행되는 프로세스 관계에는 IPC 메커니즘이 필요
생산자 소비자 문제(Producer-Consumer Problem)
생산자는 정보를 생산하고, 소비자는 생산된 정보를 소비함
ex)
- 컴파일러가 어셈블리어를 만들면, 어셈블러가 어셈블리어를 소비해 기계어를 생성함
- 웹 서버가 HTML 파일을 만들면, 브라우저가 HTML 파일을 소비해 페이지를 렌더링함
공유 메모리(shared memory)를 사용하는 방법
- process A가 shared memory에 데이터를 놓으면 process B가 shared memory에서 데이터에 접근함
- 생산자와 소비자는 동시에(concurrently)하게 동작함
- 버퍼를 사용해 데이터를 공유할 수 있음
- 버퍼 - process A와 process B가 공유하고 있는 메모리 공간
- 각 프로세스가 갖는 공간은 다른 프로세스와 독립적인 별도의 공간을 가져야 함
- 버퍼 공간은 운영체제가 프로세스 내부가 아닌 외부에 별도로 생성해주어야 함
- 원형 큐를 이용해 버퍼 공간을 구현할 수 있음
- 생산자인 process A는 버퍼에 데이터를 저장
- 소비자인 process B는 버퍼에서 데이터를 가져옴
- 버퍼는 사이즈가 정해져있기 때문에 생산자인 process A는 대기상태가 됨
- 소비자인 process B는 버퍼가 비어있을 때는 대기상태가 됨
공유 메모리 방식의 문제점
- 메모리 영역에 엑세스하는 것을 사용자가 직접 지정해주어야 함
- 프로세스의 양이 많아지면 지정해주는 데 한계가 있음
커뮤니케이션 링크
M:N의 프로슈머(producer + consumer)와 프로슈머가 통신을 할 때는 일일히 메세지 설정을 해주기 어렵기 때문에 공유 메모리를 사용하는 경우도 있음
메세지(message passing)를 사용하는 방법
- process A가 운영체제에 메세지를 보내면 운영체제가 process B에 메세지를 전달하는 방법
- 메세지를 전달하는 것을 운영체제가 처리해줌
- 큐잉이나 대기 등을 모두 운영체제가 처리해줌
- 사용자 입장에서는 공유 메모리를 관리할 필요 없이 운영체제에게 맡기면 됨
- send(), receive() 시스템 콜만 사용하면 됨
- 전달방식
- direct와 indirect
- direct
- 생산자가 소비자에게 바로 전달해줌
- receiver와 sender를 서로 알고 있음
- communication link가 자동으로 생성됨
- 한 쌍의 프로세스에 대해 오직 하나의 링크만을 가짐
- indirect
- 생산자가 데이터를 저장하면 소비자가 저장된 데이터에 접근함
- 메세지는 포트(메일박스)를 통해 전달됨
- receiver와 sender는 포트(메일박스)만 알고 있음
- 하나의 링크에 대해 여러 개의 sender와 receiver가 있을 수 있음
- create, send, receive, delete 기능 외만 사용자가 사용하고 나머지는 운영체제가 관리하게 됨
- synchronous와 asynchronous
- synchronous(동기화)
- sender가 데이터를 주면 동시에 receiver가 데이터에 접근해 사용함
- Blocking send : 메세지를 receiver가 받을 때까지 sender는 다른 행동을 하지 않음(block 상태)
- Blocking receive : 메세지를 모두 받을 때까지 receiver는 다른 행동을 하지 않음(block 상태)
- 속도가 느린 대신 신뢰성을 보장할 수 있음
- asynchronous(비동기화)
- 데이터를 동시에 주고 받는 것이 아닌 필요할 때만 접근함
- Non-Blocking send : 메세지를 전송한 후 다른 동작을 수행할 수 있음
- Non-Blocking receive : 메세지를 받은 후 더 이상 받을 메세지가 없으면 다른 동작을 하다가 다시 메세지를 받음
- 속도가 빠르지만 신뢰성을 보장할 수 없음
- automatic과 explict
- automatic - 자동적으로 데이터를 전송
- explicit - 데이터를 명시적으로 전송