✅ 프로세스(Process)의 개요
프로세스(Process)는 프로그램이 구동될 때 주 메모리에 적재되며, 메모리 상에서 실행되는 작업의 단위를 말한다. 즉 컴퓨터가 연속적으로 실행하고 있는 컴퓨터 프로그램을 뜻하며 작업(Task)와 같은 의미로 쓰인다.
프로세스는 원래 독립적이지만 상황에 따라 프로세스끼리 협력해야 되는 경우가 발생한다. 이럴 때 프로세스간 자원과 데이터를 공유할 수 있어야 하는데, 서로간의 통신을 위해 별도의 매커니즘이 필요하고, IPC라는 설비를 이용해 프로세스간 통신을 할 수 있게 된다.
📚 프로세스와 스레드에 대해 알아보기
✅ IPC란
IPC란 프로세스 간에 데이터 및 정보를 주고받기 위한 매커니즘을 말한다. 커널에서 IPC를 위한 도구를 제공하며, 시스템 콜의 형태로 프로세스에게 제공된다. IPC에는 크게 두 가지 모델이 있다.
1. 공유 메모리(Shared Memory) 모델 => User memory 공간
2. 메시지 전달(Message Passing) 모델 => kernel memory 공간
🔎 1. 공유 메모리(Shared Memory) 모델
두 개 이상의 프로세스들이 주소 공간의 일부를 공유하며, 공유한 메모리 영역에 읽기/쓰기를 통해서 통신을 수행하는 방법이다. 시스템 콜을 통해 공유 메모리가 설정되면, 그 이후의 통신은 커널의 관여 없이 진행 가능하다.
공유 메모리 모델은 커널의 관여 없이 메모리를 직접 사용하기 때문에 속도가 빠르다는 장점이 있다. 또한 프로그램 레벨에서 통신 기능을 제공하며, 자유로운 통신이 가능하다는 장점도 있다. 하지만 공유 메모리 모델은 Producer-Consumer Problem을 발생시킬 수 있어 별도의 동기화 과정이 필요하다. 동기화 방법으로 locking과 세마포어 등이 있다.
🔎 2. 메시지 전달(Message Passing) 모델
커널을 공유하여 고정길이 메시지, 가변길이 메시지를 송/수신자끼리 주고 받으며, 커널에서는 데이터를 버퍼링 하는 방식이다. 커널을 통해서 데이터를 주고 받기 때문에 통신 속도가 느리다는 단점이 있지만, 커널에서 데이터를 주고 받는 과정을 컨트롤 할 수 있어 안전하며 send/receive 연산에 대해 커널이 동기화를 제공해 준다는 장점이 있다. 서버-클라이언트 방식의 통신이 대표적인 메시지 전달 모델 방식이다.
메시지 전달 방식에는 크게 Blocking 방식과 Non-Blocking 방식이 있다.
Blocking(동기): 순서대로 진행됨을 의미. 다음 단계에서 이전 단계가 수행 완료됨을 보장
Non-Blocking(비동기): 순서 상관 없이 진행
✅ IPC 종류 요약
공유 메모리 | 메세지 전달 |
공유 메모리 영역을 구축하고 공유영역을 통해 자원이나 데이터를 주고 받음 | 커널을 통해 메시지를 전달하는 방식으로 자원이나 데이터를 주고 받음 |
커널 의존도가 낮기 때문에 속도가 빠르고 통신이 자유로움 | 커널을 이용하기 때문에 구현이 비교적 쉬움 |
자원과 데이터를 공유하기 때문에 동기화 이슈 발생 | 시스템 콜이 필요하며 이로 인해 오버헤드 발생 |
Semaphores 등 | Pipe, Signal, Message Queueing, Sorket 등 |
🔎 Semaphore(세마포어)
Pipe, Name PIPE, Message Queue와 같은 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는데 반해, Semaphore는 프로세스 간 데이터를 동기화하고 보호하는데 그 목적이 있다. 프로세스간 메시지 전송을 하거나 공유메모리를 통해 데이터를 공유하게 될 경우 발생하는 문제가 공유된 자원에 다수의 프로세스가 동시에 접근하면 안되며 단지 하나의 프로세스만 접근가능하게 해주는것이 세마포어이다.
한 프로세스가 사용되고 있는 동안에 세마포어를 세워서 다른 프로세스를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용한다.
✔ 장점
- 많은 Thread들은 크리티컬 섹션을 허락받아야 한다. 즉, 크리티컬 섹션에서 충돌이 나지 않는다.
✔ 단점
- 많은 Thread들은 block을 당한다. 즉, CPU가 가만히 waiting하는 시간 낭비가 발생할 수 있다.
🔎 pipe(파이프)
파이프는 두 개의 프로세스를 연결하고 하나의 프로세스는 데이터를 쓰기만 하고, 다른 프로세스는 데이터를 읽기만 한다. 부모 자식 간에 단방향 통신으로 자주 사용된다. pipe는 반이중 통신이기에 하나의 통신선로는 읽기/쓰기 중 하나만 가능하므로 만약 읽기/쓰기 모두 하기 원한다면 두 개의 파이프를 만들어야 가능하다.
✔ 장점
- pipe는 간단하게 사용할 수 있다는 장점이 있다. 한쪽 프로세스는 단지 읽기만하고 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합
✔ 단점
- Full-Duplex 통신 방식으로 활요하려면 PIPE를 두개 만들어야 하는데, 구현이 꽤나 복잡해질 수 있다. buffer가 상대적으로 작기 때문에 overflow될 확률이 높다.
🔎 Named PIPE(익명 파이프)
Named PIPE는 통신할 프로세스가 명확히 알 수 있는 경우 사용한다. 보통 PIPE는 부모자식간에 사용하고 Named PIPE는 전혀 모르는 상태의 프로세스들 사이에서 통신할 경우 사용한다. Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데, 이유는 프로세스간에 통신을 위해 이름이 있는 파일을 매개체로 사용하기 때문이다. Mkfifo를 통해 Named PIPE를 생성하는데, mkfifo가 성공하면 이름이 명명된 파일이 생성되고 이를 활용해서 프로세스 간에 통신이 이루어진다.
✔ 장점
- 기본 PIPE와 비슷하다.
✔ 단점
- 읽기/쓰기가 동시에 이루어지지 않음, 단방향 통신
- 기본 PIPE와 비슷하다.
🔎 Message Queue(메시지 큐)
FIFO 자료구조를 가지는 통신설비로 커널에서 관리하며 입출력 방식으로보면 Named PIPE와 동일하다가 할 수 있다. 차이점이라면 Named PIPE는 데이터의 흐름이라면 Message Queue는 메모리 공간이라는 점. Message Queue에 쓸 데이터에 번호를 붙힘으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
✔ 장점
- 비동기 방식이기에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리 할 수 있다.
- 다수의 프로세스들이 큐에 메시지를 보낼 수 있고 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있다.
- 분산처리 및 경쟁처리 방식에 사용할 수 있다.
✔ 단점
- 메세지가 정말 잘 전달되었는지 알 수 없다.
- 큐에 데이터를 넣고 나오는 과정에서 오버헤드가 발생 할 수 있다.
- 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요하다.
🔎 Socket(소켓)
같은 도메인 내에서 연결 될 수 있고 프로세스들 사이의 통신을 가능하게 한다. 서버단에서는 bind, listen, accept를 진행해 소켓 연결을 위한 준비를 한다. 클라이언트 단에서는 connect를 통해 서버에 요청하고 연결이 수립 된 후에서는 socket에 send 함으로써 데이터를 주고 받는다. 연결이 끝나면 반드시 close()로 clear 한다. 즉, 네트워크를 통해 프로세스간에 통신을 진행한다.
✔ 장점
- 서버/클라이언트 환경을 구축하는데 용이하다.
- Internet Socket인 경우 데이터 유실이 발생할 수 있지만, Unix Domain소켓은 PIPE와 같은 형태로 이루어지고 같은 시스템에서 교환이 일어나므로 패킷이 유실되거나, 순서가 바뀌는 등 문제가 발생하지 않을거라 장담 할 수 있다.
- 범용적인 IPC로써 양방향 통신이 가능하다.
- 패킷 단위로 주고 받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있다.
✔ 단점
- Internet UDP와는 달리 경로를 지정할 수 없다.
- 다중의 클라이언트를 받아들이는 서버의 경우 문제가 될 수 있다.
📚 Reference
'Computer Science' 카테고리의 다른 글
쿠키(Cookie)와 세션(Session) (0) | 2023.02.08 |
---|---|
함수형 프로그래밍의 특징과 장단점 (0) | 2023.02.08 |
[DB] 데이터베이스 정규화란? (0) | 2023.02.02 |
애자일(Agile)이란? (0) | 2023.02.01 |
TDD(Test Driven Development)란? (0) | 2023.01.31 |