본문 바로가기

CS/오퍼레이팅 시스템

16. IPC 프로세스간 커뮤니케이션 : message passing

하지만 각 프로세스마다 주소 공간이 있고 다른 프로세스의 공간을 볼 수 없어서

여러 프로세스간의 커뮤니케이션은 어려움

 

*IPC는 커널의 도움을 받아서 프로세스간 커뮤니케이션이 가능하다

1) message passing : 커널 내부에 메일 박스라는 데이터 스트럭처를 생성

2) shared memory : 특정 프로세스의 일부를 공유 영역으로 지정하고 그 영역을 통해서 커뮤니케이션 진행

https://snnchallenge.tistory.com/120

 

15. IPC 프로세스간 커뮤니케이션 : shared memory, producer-consumer문제

- independent : 다른 프로세스의 영향을 받지 않음 - cooperating : 여러 프로세스가 병렬적으로 수행되면서 한가지 일을 당성하고자함 * IPC의 장점 - information sharing : 파일 하나만 오픈하고 공유하면 리..

snnchallenge.tistory.com

메세지 패싱은 데이터를 전송할 때마다 시스템콜을 호출한다

send(message) : 메세지 사이즈가 고정될 수도 있고 변할 수도 있음

receive(message) 

 

- 두개의 프로세스가 커뮤니케이션하기 위해서 두 프로세스 사이에 커뮤니케이션 링크를 설치해야함

- 그 후에 send/receive를 할 수 있음

=> 메세지 송수신 마다 커널의 도움이 필요하다

 

- 커뮤니케이션 링크 설정 : logical device 

  큐로 되어있는 메일 박스라는 공간을 설정

 

* direct communication 

- 데이터를 보낼 때 상대를 명시함

- send(P, message) / receive(Q, message)

- 운영체제가 직접 전송해주는 역할을 함

 

- 데이터를 보내기만하면 링크가 자동으로 형성

- 송신프로세스와 수신 프로세스 간에 하나의 링크만 존재할 수 있다

- 송신 시 수신할 프로세스를 pid로 명시해야하며 프로그래머가 커뮤니케이션할 프로세스의 pid를 알아야한ㄷ

 (확장성이 X, 하드코딩)

- 가장 대표적인 애가 pipe mechanism

 

*indirect communication

- 운영체제가 메일박스로 전송하는 역할을하고

- 중간에 있는 메일박스가 communication link임

  맨 처음에 이 메일 박스를 만들어줘야 함

 

- 메일박스만 있다면 프로세스간 여러개의 링크가 생성이 가능하다=> 두 프로세스 간 여러개의 메일박스

- 링크 하나가 여러개의 프로세스와 상관관계가 있을 수 있음

- unidirectional 이나 bi- directional 가능하다

 

1) 새로운 메일박스를 create

2) send/ receive로 메일박스를 통해 메일을 송수신

3) 메일박스를 파괴

 

 

- mailbox1 : 네개의 프로세스가 하나의 메일박스를 이용, 하나의 메일박스는 여러 프로세스와 상관관계를 만들 수 있음

- 관계를 추가적으로 구축하게되면 두 프로세스간 여러개의 링크를 둘 수 있음

 

한 메일박스를 여러 개의 프로세스가 공유하고 있을 때 발생할 수 있는 이슈

- P1,P2,P3가 메일박스A를 공유하고 있는데 P1이 send를 하면 P2와 P3중 누가 receive하는가

1) P2, P3 둘다 받음

2) 특정 시간에 한 프로세스만 receive함수를 호출할 수 있도록 설정

3) P1이 받는 프로세스를 선택할 수 있도록 함

 

* synchronization

- blocking send

1) sender가 send 시스템콜 호출

2) 메일박스 A로 메세지를 송신

3) 메세지가 메일박스나 receiver한테 도착할 때까지 sender block

4) 전송이 완료되면 다음라인 수행 가능

 

- non- blocking send

1) sender가 send 시스템콜 호출

2) 메일박스 A로 전송

3) 메세지가 어디에 도착하든지 말든지 다음라인 수행

 

- blocking receive

1) receiver가 receive 시스템콜 호출

2) 메일박스A에 아무것도 없으면 state는 waiting으로 전환

3) 메일박스로 메세지가 도착할 때까지 waiting

4) 메세지를 받으면 다음라인을 수행

 

- non-blocking receive

메일박스에서 메세지를 가져왔든지 말든지 신경 안쓰고

메세지가 없으면 없는 상태로 그냥 다음 라인을 수행함

 

* zero capacity

- 메일박스 크기가 메세지를 받을 수 없는 경우

- 굳이 메세지를 안보내고 신호같은 거로 알려주기만 하면 될 때 사용

- 버퍼링이 없음

 

* bounded, unbounded 는 automatic buffering