오래 못 할 짓 하지 않기

[ 운영체제 ] 6. Inter Process Communication / PIPE 본문

3학년 1학기/운영체제 (OS)

[ 운영체제 ] 6. Inter Process Communication / PIPE

쫑알bot 2024. 4. 1. 01:09
728x90

프로세스의 종류는 2가지가 있다.

 

● 독립적 Independent

이건 자기가 할 거 알아서 하면 됨

 

(우리가 오늘 배울 건)

● 협력적 Cooperating

   → Cooperate하는 프로세스끼리 서로 영향을 주고 받는다.

 

그러기 위해서는 Inter Process Communication

IPC가 필요하다.

 

 

IPC의 종류

● Shared memory

 

● Message Passing

 

 

 

그럼 하나씩 알아보자


● Shared memory ( Producer / consumer 개념 )

: 프로세스 간에 소통하려고 하는 곳에 있는 메모리

 

서로 정보를 직접 던지는 게 아니라, 프로세스 사이에 있는 메모리에 두고 거기로 주고 받는다.

(쉽게 생각하면 케이시 헌병 건물에서 물건 받는 창구라고 생각하면 된다.)

 

* Shared memory를 Buffer라고 생각하고 학습해도 크게 문제 없을 것 같다. 

(문제 생기면 수정하겠음)

 

 

이렇게 정보를 주고 받을 때 알아야 하는 개념이 있다.

 

● Producer / Consumer

이름에서 알 수 있듯이

정보를 만드는 프로세스와 소비하는 프로세스가 있다.

 

 

Producer와 consumer는 Shared memory를 통해 정보를 주고받는다!

 

 

● Share memory 특징

 : circular queue로 구현된다.

 

 

- Producer가 움직일 때 ▶ Full인지 판단.

- Consumer가 움직일 땐 ▶ Empty인지 판단.

 

 

위에 거만 이해하면 됨. (아래도 로직은 같음)

 

- While(1)로 계속 돌아간다 {

- While(    조건    )  << 이 조건의 의미 = [ 이제 곧 넣으려고 하는 다음 칸이 빈 칸이 아니라, 나가려고 기다리는 애 ] 

                                이 조건이면 앞 칸이 지금 차있다는 것이고, Circular 입장에서는 모든 칸이 다 찼다는 뜻이다.

 

- While에서 계속 기다린다... 그 조건이 아니라면

 방금 입력 받은 걸 Buffer에 넣고, Circular 꼬리에 넣는다.

 

 




 

 

● Message - Passing

: 프로세스가 그냥 항상 소통할 상태인 매커니즘

 

● IPC 에서 제공하는 2가지 기능

1. Send ( message )

2. Receive ( message )

Message pass하는 방법에도 2가지가 있는데

직접 / 간접 방법이 있다.

 

직접 : Message의 목적지를 받는 프로세스한테 주고 , 보낸 프로세스로부터 받는지

간접 : 주고 받는 주소를 Mailbox로 하느냐 차이가 있다.

 


 

 

● Blocking = Synchronous : 메시지가 올 때까지 기다린다. (받기 전까진 blocked)

   - Blocking send : sender는 자신이 보낸 메시지를 Receiver가 받을 때까지 막힌다.

   - Blocking receive : receiver는 받은 메시지를 읽을 수 있을 때까지 막힌다. (Until a message is available)

                                  = 원하는 게 끝까지 다 들어올 때까지 막힌다.

 

 

● Non - Blocking = Asynchronous : 메시지가 오든말든 그냥 할 거 함

   - Non - Blocking send : sender는 메시지를 보냄 +할 거 한다.

   - Non - Blocking receive : receiver는 계속 받음. 들어오는 건 ( NULL  || Message ) 이다. 

 

 

 

 

 

(추가) Buffer 설명

 

임시적인 Queue라고 생각하면 된다.

크기에 따라 3종류로 나뉨

 



예제 코드

 

 

 


 

Pipe

 

: 2개 이상의 Process가 소통하는 배관 역할

 

 ● 일반적인 Pipe

- 부모와 자식 Process간에 단방향 소통

- 전형적으로, 부모 프로세스에서 파이프를 만들고이를 통해 자식 프로세스와 소통한다. 

- fd[0] = read  / fd[1] = write 

+ Named pipes

 : 부모 자식 관계 없이 그냥 양방향 pipe

 

 

 

(출처)

한동대학교 고윤민교수님 - OS