IPC (Inter Process Communication)
- 프로세스는 독립적으로 실행되어 다른 프로세스에 영향을 받지 않는다.
- 다만 스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다.
- 프로세스 간의 통신을 해야하는 상황이 있는데 이때 필요한 것이 IPC통신이다. 프로세스는 커널이 제공하는 IPC 설비를 이용하여 프로세스간 통신을 할 수 있게 된다.
- 커널 : 운영체제의 핵심, 다른 모든 부분에 여러 기본적인 서비스를 제공
IPC 종류
- 익명 PIPE
- 파이프는 2개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고 다른 하나는 데이터를 읽기만 할 수 있다.
- 한쪽 방향으로만 통신이 가능한 반이중 통신
- 통신할 프로세스를 명확히 알 수 있는 경우 사용 (부모-자식 간 통신)
- 간단하게 사용할 수 있으며 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이지만 전이중 통신을 위해 파이프를 2개로 만들어야 할 땐 구현이 복잡해진다.
- Named PIPE(FIFO)
- 전혀 모르는 상태의 프로세스들 사이 통신에 사용
- 부모 프로세스와 무관한 다른 프로세스도 통신이 가능한 것
- 읽기/쓰기 동시에 불가능하여 한쪽 방향으로만 통신이 가능한 반이중 통신이다.
- Message Queue
- 입출력 방식은 Named PIPE와 동일하지만 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
- 사용할 데이터에 번호를 붙이면서 여러 프로세스를 동시에 데이터를 쉽게 다룰 수 있다.
- 공유 메모리
- 파이프, 메시지 큐가 통신을 이용한 설비라면 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비
- 즉, 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.
- 중개자 없이 곧바로 메모리에 접근할 수 있어 IPC 중 가장 빠르게 작동한다.
- 메모리 맵
- 공유 메모리처럼 메모리를 공유
- 열린 파일을 메모리에 맵핑시켜 공유하는 방식 (파일+메모리)
- 파일로 대용량 데이터를 공유해야 할 때 사용
- 소켓
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 클라이언트(connect)와 서버(bind, listen, accept)가 소켓을 통해서 통신하는 구조로 원격에서 프로세스 간 데이터를 공유할 때 사용
- 이러한 IPC통신에서 공유된 자원에 한번에 하나의 프로세스만 접근시킬 때, 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다.
세마포어
공유된 자원에 여러 프로세스가 동시에 접근하면서 문제가 발생할 수 있다.
이때 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 둬야 하기에 멀티 프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법을 세마포어라고 한다.
- 임계 구역(Critical Section)
- 여러 프로세스가 데이터를 공유하며 수행될 때 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분
- 공유 데이터를 여러 프로세스가 동시에 접근할 때 잘못된 결과를 만들 수 있기에 한 프로세스가 임계 구역을 수행할 때는 다른 프로세스가 접근하지 못하도록 해야 한다.
- 세마포어 P, V 연산
- P : 임계 구역 들어가기 전 수행 (프로세스 진입 여부를 자원의 개수{S}를 통해 결정)
- V : 임계 구역에서 나올 때 수행 (자원 반납 알림, 대기 중인 프로세스를 깨우는 신호)
- P(S); // 임계 구역 V(S);
- 프로세스가 P혹은 V를 수행하고 있는 동안 다른 프로세스가 인터럽트 당하지 않게 된다. P와 V를 사용하여 임계 구역에 대한 상호배제 구현이 가능하게 된다.
뮤텍스(Mutex)
임계 구역을 가진 스레드들의 실행 시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술
(상호 배제 Mutual Exclusion, 줄여서 Mutex)
- 해당 접근을 조율하기 위해 lock과 unlock을 사용
- lock : 현재 임계 구역에 들어갈 권한을 얻어온다. 만약 다른 프로세스/스레드가 임계 구역 수행 중이면 종료할 때까지 대기한다.
- unlock : 현재 임계 구역을 모두 사용했음을 알린다. 대기 중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다.
- 뮤텍스 알고리즘
- 데커(dekker) 알고리즘
- flag와 turn 변수를 통해 임계 구역에 들어갈 프로세스/스레드를 결정하는 방식
- flag : 프로세스 중 누가 임계 영역에 진입할 것인지 나타내는 변수
- turn : 누가 임계 구역에 들어갈 차례인지 나타내는 변수
while(true) { flag[i] = true; // 프로세스 i가 임계 구역 진입 시도 while(flag[j]) { // 프로세스 j가 현재 임계 구역에 있는지 확인 if(turn == j) { // j가 임계 구역 사용 중이면 flag[i] = false; // 프로세스 i 진입 취소 while(turn == j); // turn이 j에서 변경될 때까지 대기 flag[i] = true; // j turn이 끝나면 다시 진입 시도 } } } // ------ 임계 구역 ------ turn = j; // 임계 구역 사용 끝나면 turn을 넘김 flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림
- flag와 turn 변수를 통해 임계 구역에 들어갈 프로세스/스레드를 결정하는 방식
- 피터슨(peterson) 알고리즘
- 데커와 유사하지만 상대방 프로세스/스레드에게 진입 기회를 양보하는 것에 차이가 있다.
while(true) { flag[i] = true; // 프로세스 i가 임계 구역 진입 시도 turn = j; // 다른 프로세스에게 진입 기회 양보 while(flag[j] && turn == j) { // 다른 프로세스가 진입 시도하면 대기 } } // ------ 임계 구역 ------ flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림
- 제과점(Bakery) 알고리즘
- 여러 프로세스/스레드에 대한 처리가 가능한 알고리즘
- 가장 작은 수의 번호표를 가지고 있는 프로세스가 임계 구역에 진입한다.
- 데커(dekker) 알고리즘
'기초 CS 정리' 카테고리의 다른 글
데드락 DeadLock (0) | 2023.01.31 |
---|---|
CPU Scheduling (0) | 2023.01.31 |
Process Control Block(PCB)와 Context Switching (0) | 2023.01.29 |
System Call 시스템 콜 (0) | 2023.01.29 |
프로세스와 스레드, 인터럽트(Interrupt) (0) | 2023.01.28 |