-
병행 프로세스의 문제와 일반적인 해결 방법
병행 프로세스 중 협력 프로세스에서 여러 프로세스가 공유 자원을 사용할 때 다음과 같은 문제가 발생할 수 있다.
- 상호배제 (Mutual Exclusion): 동시에 접근하면 안 되는 자원 보호 필요
- 동기화 (Synchronization): 프로세스 실행 순서가 중요한 경우 제어 필요
- 기아 상태 (Starvation): 특정 프로세스가 자원을 무한정 기다리는 상황 발생 가능성
생산자-소비자 문제
두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제
- 생산자는 데이터를 버퍼에 넣고, 소비자는 버퍼에서 데이터를 꺼내 사용
- 버퍼는 유한 크기이며, 버퍼가 가득 찼거나 비어 있을 때 동기화 문제 발생
- 버퍼에 여러 프로세스가 동시에 접근할 수 없도록 상호배제 필요
버퍼(Buffer)란?
- 생산자 소비자 프로세스 간에 데이터를 임시로 저장하는 공유 메모리 영역
세마포어 설정
- mutex: 상호배제 (초기값 1)
- empty: 빈 버퍼의 개수 관리 (초기값 n, 버퍼 크기)
- full: 찬 버퍼의 개수 관리 (초기값 0)
// 생산자 프로세스 while (true) { 데이터를 생산; P(empty); P(mutex); 버퍼에 데이터를 넣음; V(mutex); V(full); } // 소비자 프로세스 while (true) { P(full); P(mutex); 버퍼에서 데이터를 꺼냄; V(mutex); V(empty); 데이터를 소비; }
판독기-기록기 문제
여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제
- 판독기(Reader): 공유 데이터를 읽기만 하는 프로세스
- 기록기(Writer): 공유 데이터에 쓰기(변경)를 하는 프로세스
- 판독기는 여러 개가 동시에 접근 가능하지만, 기록기가 접근할 땐 반드시 단독 접근 필요
- 판독기-기록기 문제는 판독기 우선과 기록기 우선 두 가지 형태로 구분
제1 판독기-기록기 문제(판독기 우선)
- 판독기 접근 중이면 기록기는 기다림
- 기록기 기아 상태 가능성 존재
- 사용되는 변수와 세마포어
- 일반 변수: rcount (판독기 수, 초기값 0)
- 세마포어:
- mutex (rcount 접근 보호, 초기값 1)
- wrt (기록기의 공유 자원 접근 보호, 초기값 1)
// 판독기 프로세스 while (true) { P(mutex); rcount++; if (rcount == 1) P(wrt); // 첫 판독기면 기록기 접근 방지 V(mutex); 데이터를 읽음; P(mutex); rcount--; if (rcount == 0) V(wrt); // 마지막 판독기면 기록기 접근 허용 V(mutex); } // 기록기 프로세스 while (true) { P(wrt); // 다른 판독기, 기록기 접근 차단 데이터에 기록; V(wrt); // 접근 허용 }
제 2 판독기-기록기 문제(기록기 우선)
- 기록기가 접근 대기 중이라면 새로운 판독기 접근을 제한함
- 판독기 병행성 감소 및 판독기 기아 상태 발생 가능성 존재
- 사용되는 변수와 세마포어
- 일반 변수:
- rcount (판독기 수, 초기값 0)
- wcount (기록기 수, 초기값 0)
- 세마포어:
- mutex1 (rcount 보호, 초기값 1)
- mutex2 (wcount 보호, 초기값 1)
- mutex3 (판독기 진입 조절, 초기값 1)
- rd (판독기 접근 제한, 초기값 1)
- wrt (기록기 접근 보호, 초기값 1)
- 일반 변수:
// 판독기 프로세스 while (true) { P(mutex3); P(rd); P(mutex1); rcount++; if (rcount == 1) P(wrt); V(mutex1); V(rd); V(mutex3); 데이터를 읽음; P(mutex1); rcount--; if (rcount == 0) V(wrt); V(mutex1); } // 기록기 프로세스 while (true) { P(mutex2); wcount++; if (wcount == 1) P(rd); V(mutex2); P(wrt); 데이터에 기록; V(wrt); P(mutex2); wcount--; if (wcount == 0) V(rd); V(mutex2); }
- 조금 복잡하지만 > 판독기가 기록기가 우선순위 가짐, 기록기 접근 중이면 판독기 추가 진입 불가능하게 제한
프로세스 간 통신(IPC: Inter Process Communication)
- 병행 프로세스가 데이터를 서로 공유하는 방법
- 공유 메모리 방법
- 메시지 전달 방법
- 하나의 운영체제에서 두 방법 함께 사용가능
공유 메모리 방법
- 두 개 이상의 협력 프로세스가 공통의 메모리 영역을 공유하여 데이터를 교환
- 프로세스는 해당 메모리 공간을 자신의 주소 공간처럼 접근
- ex) 생산자-소비자 문제의 유한 버퍼, 판독기-기록기 문제의 공유 자원
[프로세스 A] ⇄ [공유 메모리] ⇄ [프로세스 B]
메시지 전달 방법
- 협력 프로세스 간에 메시지 형태로 데이터를 주고받는 방식
- 운영체제가 제공하는 시스템 호출 (ex. send(), receive()) 이용
- 데이터를 메시지 형태로 주고받기 때문에 동기화가 상대적으로 간편
- 주로 소량 데이터 교환에 적합
[프로세스 A] --send()--> [운영체제 (메시지 큐)] --receive()--> [프로세스 B]
메시지 전달 방법의 논리적 구조
통신 링크
- 메시지가 전송되는 논리적 통로
- 운영체제가 관리하며, 물리적이 아닌 논리적 개념
통신 링크 구현 형태
구분 유형 특징 연결 대상 두 프로세스 1:1 통신 링크 셋 이상의 프로세스 1:N 또는 N:M 다자간 통신 링크 링크 개수 하나 하나의 링크로만 연결 둘 이상 프로세스 간 여러 개 링크 가능 통신 방향 단방향 한 방향으로만 메시지 전송 가능 양방향 양쪽 방향으로 전송 가능 링크 용량 무한 송신자 프로세스가 대기할 필요 없음 유한 큐가 가득 차면 송신자 대기 0 수신자가 받을 때까지 송신자 대기 메시지 전달 방식의 두가지 유형
직접 통신
- 송신 프로세스가 수신 프로세스를 직접 지정하여 메시지 전송
- 프로세스 간 링크가 자동 설정 (하나의 링크는 두 프로세스 사이에만 설정됨)
- 양방향 통신 링크 형태로 설정됨
주소 지정 방식
- 대칭형 (Symmetric)
- send(P1, message) : P1에 메시지 전송
- receive(P2, message) : P2로부터 메시지 수신
- 송신자와 수신자가 서로 상대방 프로세스를 명시적으로 지정
- 비대칭형 (Asymmetric)
- send(P1, message) : P1에 메시지 전송
- receive(id, message) : id는 발신자를 지정하지 않고 수신 대기
간접 통신
- 프로세스가 **공유 우편함(mailbox, 포트)**을 통해 간접적으로 통신
- 메시지는 프로세스 간이 아닌 우편함을 통해 전달됨
- 하나의 우편함에 여러 프로세스가 연결될 수 있음
통신 링크의 특성
- 우편함이 여러 개면 프로세스 간 여러 링크 존재 가능
- 한 링크가 여러 프로세스와 연관 가능
우편함 소속에 따른 특징
- 우편함이 수신 프로세스에 소속된 경우
- 수신 프로세스는 하나만 존재
- 통신 링크는 단방향 (송신 → 수신 프로세스)
- 우편함이 운영체제에 소속된 경우
- 여러 수신 프로세스 연결 가능
- 통신 링크는 양방향 (여러 프로세스 사이에서 상호 전송 가능)
'CS > 운영체제' 카테고리의 다른 글
메모리 관리와 가상 메모리 (0) 2025.04.29 교착상태(Deadlock) (0) 2025.04.16 병행 프로세스 (1) - 협력 프로세스, 세마포어 연산 (0) 2025.03.20 프로세스 스케줄링 (0) 2025.03.16 운영체제의 소개 & 프로세스와 쓰레드 (0) 2025.02.27 댓글