---
# System prepended metadata

title: 프로세스 간 통신
tags: ["\U0001F4BB TIL"]

---

<h1><center> 프로세스 간 통신 </center></h1>

###### tags: `💻 TIL`, `Operation System`, `Computer Science`
###### date: `2024-02-01T15:12:33.284Z`

> [color=#724cd1][name=데릭]
> [Nossi.DEV](https://www.nossi.dev/8a7d1cef-6e61-4e6b-9d3f-364e105ca86f)
> [프로세스 간 통신](https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B0%84_%ED%86%B5%EC%8B%A0)


## 프로세스 간 통신

>IPC(Inter-Process Communication)   는 프로세스들 사이엥 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이나 경로를 뜻한다. 

> IPC는 마이크로커널과 나노커널의 디자인 프로세스에 매우 중요하다. 마이크로커널은 커널이 제공하는 기능의 수를 줄여준다. 

프로세스는 각자 자신만의 독립적인 주소공간을 가지는데, 다른 프로세스가 이 주소공간을 참조하는 것을 허용하지 않는다. 그렇기 때문에 다른 프로세스와 데이터를 주고받을 수 없다. 

이런 문제를 해결하고자 운영체제는 IPC기법을 통해 프로세스들 간에 통신을 가능하게 만들었다. 

프로세스간 통신(IPC)에는 기본적으로 공유메모리(Shared Memory)와 메시지 전달(Message Passing) 두 가지 모델이 있다.

**NOTE**

> 마이크로커널: 컴퓨터 과학에서 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널이다. 이러한 미니멀리티 메커니즘에는 낮은 수준의 주소 공간 관리, 스레드 관리, 프로세스 간 통신(IPC)을 포함한다. 하드웨어가 여러 개의 링과 CPU 모드를 제공한다면 마이크로커널은 최고 권한 수준(일반적으로 수퍼바이저 및 커널 모드로 부름)에서 실행되는 유일한 소프트워어가 된다. <br> 
> 멀티 스레드와 다르게 프로세스끼리는 데이터 공류를 하고 있지 않다. 따라서 데이터를 주고 받기 위해서 IPC 기법을 사용한다. IPC는 크게 공유메모리 방식과 메시지 전달방식으로 나뉘는데 각각의 장단점과 차이점에 대해 알아야 한다.

### Shared Memory

![image](https://hackmd.io/_uploads/rJETL_35a.png)

공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유하는 것이다. 공유한 메모리 영역에 읽기/쓰기를 통해 통신을 한다.

1. 프로세스가 공유 메모리 할당을 커널에 요청한다.
2. 커널은 해당 프로세스에 메모리 공간을 할당해준다.

공유 메모리 영역이 구축된 이후에는 모든 적근이 일반적인 메모리 접근으로 취급되어 더 이상 커널에 따로 요청없이 프로세스들 끼리 해당 메모리 영역에 접근할 수 있다. 

따라서 커널의 관여 없이 데이터를 통신할 수 있기 때문에 IPC속도가 빠르다는 장점이 있다.

공유 메모리 방식은 프로세스 간의 통신을 수월하게 만들지만 동시에 같은 메모리 위치에 접근하게 되면 일관성 문제가 발생할 수 있다.

**NOTE**

> 메모리 일관성(Consistency): 여러 개의 캐시 또는 병렬 처리 시스템에서 공유된 데이터에 대한 동시 접근에서 발생할 수 있는 문제를 다루는 개념이다. 특히, 공유 메모리 시스템에서 여러 프로세스나 스레드가 동시에 같은 메모리 위치에 접근할 때 발생하는 일관성 문제는 중요한 이슈 중 하나이다.

**일관성 문제**

일관성 문제는 여러 개의 캐시가 데이터를 갖고 있을 때, 한 캐시에서 데이터를 변경했을 때, 다른 캐시나 메모리에서 해당 변경사항을 언제 볼 수 있는지에 대한 문제이다. 각 프로세스나 스레드가 갖고 있는 캐시가 서로 일관되지 않아서 예상치 못한 동작이 발생할 수 있다. 

예를 들어, 두 개의 스레드가 공유된 변수를 읽고 쓰는 작업을 수행할 때, 한 스레드가 변수의 값을 변경하면, 다른 스레드가 이 변경을 인식하지 못할 수 있다. 이로 인해 사이드 이펙트가 발생할 수 있음.

**일관성을 유지하는 방법**

1. 캐시 일관성 프로토콜(Cache Coherence Protocol): 다수의 캐시 간에 일관성을 유지하기 위해 사용되는 규칙이다. MEISI(Modified, Exclusive, Shared, Invalid) 프로토콜과 MOESI(Modified, Owned, Exclusive, Shared, Invalid) 프로토콜 등이 있다. 

2. 원자적(Atomic) 명령어 사용: 원자적 명령어를 사용하여 하나의 명령이 실행되는 동안 다른 프로세스들이 해당 데이터에 접근하지 못하도록 보장한다.

3. 뮤텍스, 세마포어 등 동기화 메커니즘 사용:  공유 자원에 대한 접근을 조절하여 일관성을 유지할 수 있다.

### Message Passing

![image](https://hackmd.io/_uploads/BywHPdn9T.png)

메세지 전달 방법은 통상 system call을 사용하여 구현된다. 커널을 통해 send(message)와 receive(message) 두 연산을 제공 받는다. 

예를 들어, 프로세스1이 커널로 메세지를 보내면 커널이 프로세스2에게 메세지를 보내주는 방식이다. 

메모리 공유보다는 속도가 느리지만, 충돌을 회피할 필요가 없기 때문에 적은양의 데이터를 교환하는데 유용하다. 또한, 구현하기가 쉽다.

대표적인 예시로는 pipe, socket, message queue등이 있다.