일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- LeetCode
- DFS
- 그레이들
- VIM
- 동적 계획법
- Redux
- DP
- 다이나믹 프로그래밍
- 자바
- 안드로이드
- git
- Graph
- db
- Algorithm
- 리트코드
- vscode
- Python
- network
- Javascript
- Data Structure
- java
- react
- 프로그래머스
- Database
- TypeScript
- CS
- frontend
- 백준
- 알고리즘
- BFS
- Today
- Total
늘 겸손하게
CS - Operating System - IPC ( Inter-Process Communication ) 본문
CS - Operating System - IPC ( Inter-Process Communication )
besforyou999 2022. 11. 24. 12:06[ IPC? ]
Inter-Process Communication의 약자로 프로세스 간 통신을 의미
[ 왜 필요한가요? ]
프로세스는 독립적으로 실행된다. 즉, 한 프로세스는 다른 프로세스 코드, 데이터, 힙, 스택에 접근이 불가능하다.
하지만 이렇게 독립적인 프로세스들 끼리 통신이 필요한 상황이 있다. 이를 가능하게 해주는 것이 바로 IPC 통신이다.
프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스간 통신을 할 수 있게 된다.
[ IPC 종류 ]
- 익명 PIPE
- Named PIPE (FIFO)
- Message Queue
- 공유 메모리
- 메모리 맵
- 소켓
- 파일
1. 익명 PIPE
파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.
한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부른다. 따라서 양쪽으로 모두 송/수신 하고 싶은 경우 2개의 파이프를 만들어야한다. (1개 수신용, 1개 송신용)
익명 파이프는 통신할 프로세스를 명확히 알 수 있는 부모, 자식 프로세스 사이에서만 사용 가능하며 다른 네트워크 상에서는 사용 불가능하다.
매우 간단하게 사용 가능한 장점이 있고, 데이터 흐름이 단순한 경우 적합하다.
단점으로는 전이중 통신을 위해 2개의 파이프를 만들어야하는 경우 구현이 복잡해진다.
2. Named PIPE(FIFO)
익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (예 : 부모-자식 프로세스 간 통신)
Named 파이프는 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.
즉, 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능한 것 ( 통신을 위해 이름있는 파일을 사용 )
하지만, Named 파이프 역시 읽기/쓰기 동시에 불가능하다.
따라서 전이중 통신을 위해서는 2개의 파이프를 만들어야 한다.
익명 파이프와는 다르게 다른 네트워크 상의 컴퓨터와도 통신이 가능하다.
하나의 파이프 인스턴스를 두고 여러 개의 파이프 클라이언트와 통신하는 방식 또는 여러 개의 파이프 인스턴스를 두고 여러 개의 파이프 클라이언트와 통신하는 방식을 사용 가능하다.
3. Message Queue
입출력 방식은 Named 파이프와 동일하다
다른 점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
다른 IPC 방식에 비해서 사용법이 직관적이고 간단하여 다른 코드 수정 없이 코드 몇 줄만 추가하여 메세지 큐에 접근이 가능한 장점이 있다.
공유 메모리 방식은 IPC를 구현할 때 읽기 쓰기 빈도가 높으면 동기화 때문에 기능을 구현하는 것이 매우 복잡해지는데, 이때 대안으로 메시지 큐를 사용하기도 한다.
4. 공유 메모리
파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비
프로세스의 메모리 영역은 독립적이며 다른 프로세스가 접근하지 못하도록 반드시 보호되야한다. 하지만 스레드처럼 메모리를 공유하도록 해준다면 더욱 편할 것이다.
공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용해준다.
프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.
-> 중개자 없이 바로 메모리에 접근 가능하여 IPC 중에 가장 빠르게 작동한다.
5. 메모리 맵
공유 메모리처럼 메모리를 공유해준다. 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식. (즉 공유 매개체가 파일 + 메모리)
주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
6. 소켓
네트워크 소켓 통신을 통해 데이터를 공유한다.
클라이언트와 서버가 소켓을 통해 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
서버(bind, listen, accept), 클라이언트(connect)
IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)
'Computer Science > Operating System' 카테고리의 다른 글
CS - Operating System - DeadLock (교착 상태) (0) | 2022.11.24 |
---|---|
CS - Operating System - CPU Scheduling (0) | 2022.11.24 |
CS - Operating System - PCB & Context Switching (0) | 2022.11.23 |
CS - Operating System - 시스템 콜 (System Call) (0) | 2022.11.23 |
CS - Operating System - 인터럽트 (Interrupt) (0) | 2022.11.23 |