-
(7) IPC - Inter Process CommunicationCS 지식/○ OS(Operating System) 2021. 6. 20. 00:29
1. 프로세스의 특징
1-1) 특징
프로세스는 독립적으로 실행 됨
프로그램 실행시 독립적인 메모리 공간을 할당받으며 data, stack, code 가진다.
한 프로세스 안에서는 개별 스레드는 자원을 공유하지만 독립적인 프로세스 간에는 공유할 방식이 없는데,
이를 위해 프로세스간 통신이 가능하도록 하는 것이 IPC 통신이다.
이는 OS의 프로세스 커널이 제공하는 IPC 설비를 이용하여 가능하게 된다.
커널이란?
운영체제의 핵심적인 부분으로 다른 모든 부분에 여러 기본적인 서비스를 제공해줌
컴퓨터 과학에서 커널(kernel)은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다.[1] 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다. 핵심(核心)[2]이라고도 한다.2. IPC의 종류
2-1) 익명 PIPE
(a) 정의
Pipe는 두 개의 프로세스를 연결하는데, 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있음
(b) 특징
> 통신할 프로세스를 명확히 알 수 있는 경우에 사용 (ex 부모-자식 프로세스간 통신)
한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부름.
양쪽으로 송/수신 가능하려면 2개의 pipe를 만들어야 함.
- 간단하게 사용할 수 있는 장점
- 단순한 데이터 흐름을 가지는 경우에 매우 효율적
- 양방향(전이중) 통신을 위해 2개를 구현할 때는 구현이 복잡하게 됨2-2) Named PIPE(FIFO)
> 프로세스 관계가 명확하지 않고 전혀 모르는 상태의 프로세스 사이에 통신으로 사용 됨
(a) 정의
익명 pipe의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스와도 통신이 가능한 것
통신을 위해 이름이 있는 파일을 사용한다
(b) 특징
- Named Pipㄷ 역시 읽기/쓰기가 동시에 이루어 지는 것이 불가능 하므로 마찬가지로 전이중 통신을 위해서는
이중으로 만들어야 함
2-3) Message Queue
입출력 방식은 Names 파이프와 동일 (파일을 사용하고 writer / reader만 존재)
- 메세지 큐는 파일을 사용하지 않고 메모리 공간을 사용
- 데이터에 번호를 붙여, 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있음
2-4) 공유 메모리
> named / unamed PIPE. Message Queue가 통신을 이용한 IPC라면
공유 메모리는 "메모리 자체"를 공유하여 데이터를 공유하도록 지원하는 방식
(a) 정의
프로세스간 메모리 영역을 공유해서 사용할 수 있도록 해주는 방식
(b) 특징
프로세스가 공유 메모리할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고
다른 프로세스들이 해당 메모리 영역에 접근할 수 있도록 해줌
- 중재가 없이 곧바로 메모리에 접근할 수 있어서 IPC중에 가장 빠르게 동작
2-5) 메모리 맵
> 공유 메모리 처럼 메모리를 공유
(a) 정의
열린 파일을 메모리에 맵핑시켜서 공유하는 방식
(공유 매개체가 파일 + 메모리)
(b) 특징
주로 파일로 대용량 데이터를 공유할 때 사용함
2-6) 소켓
> 네트워크 소켓 통신을 위해 데이터를 공유
(a) 정의
클라이언트와 서버가 소켓을 통해 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용
- 서버(bind, listen, accept), 클라이언트(connect)
3. IPC 통신 특징
이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)
[참조 ▼]
더보기1. 세마포어(Semaphore)와 뮤텍스(Mutex)
세마포어와 뮤텍스는 모두 동기화를 이용되는 도구이지만 차이가 있다. 자세한 내용은 아래와 같다.
[ Mutex(뮤텍스) ]
뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다. 이것은 프로그램이 시작될 때 고유한 이름으로 생성된다. 뮤텍스는 Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.
wait syntax 사용wait (mutex); ….. Critical Section ….. signal (mutex);
위의 수도코드는 뮤텍스의 과정을 보여주고 있는데, 락을 얻은 쓰레드만이 임계 영역을 나갈 때 락을 해제해줄 수 있다. 이러한 이유는 뮤텍스가 1개의 락만을 갖는 Locking 메커니즘이기 때문이다.
[ Semaphore(세마포어) ]
세마포어는 Signaling 메커니즘이라는 점에서 뮤텍스와 다르다. 세마포어는 락을 걸지 않은 쓰레드도 Signal을 보내 락을 해제할 수 있다는 점에서, wait 함수를 호출한 쓰레드만이 signal 함수를 호출할 수 있는 뮤텍스와 다르다.
세마포어는 동기화를 위해 wait와 signal이라는 2개의 atomic operations를 사용한다.
wait를 호출하면 세마포어의 카운트를 1줄이고, 세마포어의 카운트가 0보다 작거나 같아질 경우에 락이 실행된다.
struct semaphore { int count; queueType queue; }; void semWait (semaphore s) { s.count--; if (s.count <= 0) { // 락이 걸리고 공유 자원에 접근할 수 없음 } } void semSignal (semaphore s) { s.count++; if (s.count <= 0) { // 아직 락에 걸려 대기중인 프로세스가 있음 } }
세마포어의 카운트가 0보다 작거나 같아져 동기화가 실행된 상황에, 다른 쓰레드가 signal 함수를 호출하면 세마포어의 카운트가 1증가하고, 해당 쓰레드는 락에서 나올 수 있다.
세마포어는 크게 Counting Semaphores, Binary Semaphore 2종류가 있다. 카운팅 세마포어는 세마포어의 카운트가 양의 정수값을 가지며, 설정한 값만큼 쓰레드를 허용하고 그 이상의 쓰레드가 자원에 접근하면 락이 실행된다. 바이너리 세마포어는 세마포어의 카운트가 1이며 Mutex처럼 사용될 수 있다.(뮤텍스는 절대로 세마포어처럼 사용될 수 없다.)
2. 세마포어(Semaphore) vs 뮤텍스(Mutex) 차이
[ 세마포어와 뮤텍스 차이 정리 ]
뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈때 락을 해제할 수 있다. 하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal을 사용해 락을 해제할 수 있다. 세마포어의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있다.
출처: https://mangkyu.tistory.com/104 [MangKyu's Diary]
참조
https://gyoogle.dev/blog/computer-science/operating-system/IPC.html
반응형'CS 지식 > ○ OS(Operating System)' 카테고리의 다른 글
(9) 데드락 ( Dead lock) (0) 2021.06.23 (8) CPU Scheduling (0) 2021.06.21 (6) PCB & Context Switching (0) 2021.06.16 (5) System Call (0) 2021.06.15 (4) 인터럽트 (0) 2021.06.15