대학 전공 공부/운영체제

7. IPC(Inter Process Communication)

Xerath(제라스) 2022. 11. 17. 20:22
728x90
반응형

프로세스들이 어떻게 서로 협력을 할 수 있음...?

OS는 이를 어떻게 지원함...?

 

궁금해...!!!

 


IPC란...?

: 프로세스들 간에 데이터/정보를 주고 받기 위한 메커니즘.

-> 커널에서 IPC를 위해 System Call 형태로 도구를 제공함.

(프로세스들은 이 System Call들을 호출함으로서 프로세스 간에 통신할 거라고 OS에게 얘기해 줌.-> OS는 그 프로세스들에게 그 기능을 사용 가능하게 해줌.)

 

- IPC의 필요성

: Process 협력 모델을 구현하기 위해서 반드시 필요함.

-> 실행 중인 프로세스는 협력하는 다른 프로세스의 영향을 받음.

 어떤 시스템이 돌아갈 때 여러 프로세스들이 사용되는데 그들 간에는 통신을 해야 함. 이러한 통신을 위해서는 IPC가 필요함.

 

IPC 모델 2가지 - 공유 메모리(Shared Memory), 메시지 교환(Message Passing)

공유 메모리

: 프로세스의 특정 메모리 영역을 공유하는 방식.

공유 메모리 모델 방식

- 응용 프로그램 레벨에서 통신 기능을 제공하기에, 공유 메모리가 한번 설정되면 이후에는 OS의 도움이 없어도(커널의 도움이 없어도) 협력이 가능함.

 

ex. Shared Memory

 

- 동작 방식: Read / Write

-> 프로세스들의 주소 공간 중 일부를 공유 메모리로 설정. 이후 프로그램에서 바로 접근해서 데이터를 읽거나 씀.

메시지 교환

: 공유 메모리 없이 동작함. 커널로 메시지를 보내고 이를 받아오는 방식으로 메시지 통신을 함.

∴ 교환 시마다 매번 커널의 도움을 받아야 함.

메시지 교환 모델 방식

- Client-Server 방식의 통신.

 

ex. Pipe, Message Queue, Socket

 

- 동작 방식: Send / Receive

-> 커널을 통해 메시지를 전송함. 때로는 커널에 데이터를 버퍼링 되어 있다가(커널이 갖고 있다가) 프로세스에 전달됨.

- Context Switching에 연관됨.(상대가 실행 중이지 않을 때 메시지를 전송해주는 건 의미없기 때문.)

 

두 방식의 큰 차이점: OS(커널)를 거쳐서 메시지를 전송해야 하느냐와 공유 메모리를 두고 read/write만 해서도 데이터를 주고받을 수 있느냐의 차이.

두 모델의 차이

IPC에서 동기화의 필요성

- 메시지 교환 방식 - 커널이 동기화를 제공하기에 따로 프로그램에서 동기화 고려 X.

 

- 공유 메모리 방식 - 메모리 영역에 대한 동시 접근을 제어하기 위한 방법이 필요. ex. Locking, 세마포어(Semaphore)

 

Pipe

: 하나의 프로세스가 다른 프로세스로 데이터를 직접 전달하는 방법.

 

- 데이터는 단방향으로만 이동함.

∴ 양방향 통신을 위해서는 2개의 pipe가 필요함.

 

- 하나의 pipe에서는 1:1 통신만 가능함.

- 보내진 순서대로만 받음.

- 용량이 제한되어 있어서 꽉 차면 사용 불가능.

∴ Receive를 해주어야 그만큼 비워져서 추가로 보낼 수 있어짐.

Pipe 관련 예시 코드(hello, world. 메시지를 parent 프로세스에서 child 프로세스로 보내는 코드)

Signal

: 특정 프로세스에게 커널을 통해 Event를 전달하는 방법.

 

- 송신 프로세스: 여러 신호 중 하나를 특정 프로세스에 보냄. 수신할 프로세스의 상태에 상관없이 수행 가능함.

- 수신 프로세스: 신호 종류에 따라 신호 처리 방법을 지정할 수 있음.(무시 / 단순히 신호를 붙잡아 둠 / Signal Handler를 두어 처리)

 

- 비동기적인 동작

: 아무리 송신 프로세스가 수신 프로세스에게 시그널을 보내도 이 시그널의 처리는 수신 프로세스가 Scheduling되어야 가능함.(so 당연..!)

 

Signal 관련 예시 코드

* sigaction() : 시그널 핸들러를 등록하는 함수.

* kill : 프로세스를 죽이는 것 외에도 시그널을 전달할 때도 사용함.

* waitpid : 자식 프로세스를 기다리다가 종료되면 빠져나감.

 

Shared Memory

: 두 개 이상의 프로세스들이 하나의 메모리 영역을 공유하여 통신하는 방법.

 

- 메모리의 직접 사용이 가능하기에 빠르고 자유로운 통신이 가능함.

- 두 개 이상의 프로세스가 동시에 메모리를 변경하지 않도록 프로세스 간의 동기화가 필요함.

 

Shared Memory 관련 예시 코드(11,22로 저장되어 있던 값을 자식 프로세스에서 33,44로 바꾸는 코드)

* shmget : 공유 메모리를 생성하는 함수.

* shmat: 공유 메모리의 위치를 찾아서 저장하는 함수.

 

Message Queue

: 고정된 크기를 갖는 Message를 Linked-List를 통해 통신하는 방법.

 

- Message의 단위: 통신하고자 하는 프로세스 간의 약속이 필요함.

- 여러 프로세스가 동시에 접근이 가능한 방식이기에 동기화가 필요함!!!

 

Message Queue 관련 예시 코드

* MSG: 메시지의 타입과 내용이 형식을 정해둔 구조체

* msgget: 메시지 Queue 생성하는 함수

* msgsnd: 메시지를 쓰는 함수

* msgrcv: 메시지를 읽는 함수

Socket

- Port를 이용하여 통신하는데에 사용됨.

-> Port라는 OS가 제공하는 Abstraction을 가지고서 그 번호를 이용해서 통신 상대 프로세스의 Socket을 찾아감.

 

- 다른 IPC와 달리에 프로세스의 위치에 상관없음.(Local도 가능하고 Remote도 가능함.)

-> 이건 Port 덕분에 가능한데,

Local은 Port 번호만으로도 식별이 가능함.

Remote는 IP주소+ Port 번호로 식별이 가능함.

 

- 연결의 Semantics를 정할 수 있음.(TCP vs UDP)

 

- Port를 사용하기에 Machine Boundary가 상관없음.

- Port로 여러 웹 브라우저를 생성하는데 이때 Remote Machinedms Local Machine의 Port만 보임(그림처럼 ㅇㅇ)

Socket 관련 사용 코드

728x90
반응형