Search

[운영체제] 병행 프로세스 (1) - 협력 프로세스, 세마포어 연산

제목
Tag
작성일

병행성과 병행 프로세스

병행성(concurrency)
여러 개의 프로세스 또는 쓰레드가 동시에 실행되는 시스템의 특성
병렬 처리와 다르게 단일 CPU 환경에서도 가능
병행 프로세스
동시 수행되는 여러개의 프로세스 또는 쓰레드

병행 프로세스의 실행 형태

1.
단일 CPU: 인터리빙 형식
CPU가 빠르게 번갈아가며 프로세스를 실행
실제 동시 실행이 아닌 시분할 방식으로 동작
2.
다중 CPU: 병렬처리
여러 개의 CPU가 각각 프로세스를 실행
메모리 구조에 따라
1.
강결합 시스템(공유 메모리 구조)
여러 개의 프로세스가 공유 메모리를 통해 데이터 교환
프로세스간 통신이 빠르지만 동기화 문제 발생 가능
2.
약결합 시스템(분산 메모리 구조)
각 프로세스가 독립적인 메모리를 가짐
메시지 전달을 통해 통신

프로세스 간의 관계

독립 프로세스
다른 프로세스와 상태 및 데이터를 공유하지 않음
실행 결과는 입력에 의해서만 결정됨
결정적: 같은 입력이면 동일한 결과
재생 가능: 언제 실행해도 결과 동일
협력 프로세스
다른 프로세스와 상호작용하며 데이터를 공유
실행 순서에 따라 결과가 달라질 수 있음
비결정적: 실행 순서에 따라 결과 변동
재생 불가능: 같은 입력이어도 실행 순서가 다르면 결과 달라질 수 있음

협력 프로세스의 병행성 문제

1.
상호배제
두 개 이상의 프로세스가 동시에 임계영역을 실행하지 못하도록 하는 것
임계영역: 동시에 접근하면 안 되는 공유 자원(메모리, 파일 등)을 사용하는 코드 영역
2.
동기화
여러 프로세스가 올바른 순서로 실행되도록 조정하는 것
예: 생산자-소비자 문제 (생산자가 먼저 데이터를 만들어야 소비자가 사용 가능)
3.
통신
프로세스들이 데이터를 교환하는 메커니즘
IPC (Inter-Process Communication)
공유 변수: 변수를 통해 직접 데이터 공유
메시지 전달: 메시지를 주고받으며 통신

세마포어 (semaphore)

상호배제와 동기화 문제를 해결하기 위한 도구
공유 변수(정수 값)와 두 가지 연산(P, V)으로 동작
상호배제와 동기화 문제 해결에 사용됨

세마포어의 특징

정수형 변수를 사용하여 프로세스 간 접근 제어
저장 값:
사용 가능한 자원의 개수 또는 잠김(locked) / 풀림(unlocked)의 상태를 나타냄
0 이상의 정수 값으로 초기화
P, V 연산을 통해 원자적으로 조작됨
원자적(Atomic) → 한 번 실행되면 중간에 끼어들 수 없음

세마포어 연산 (P, V))

P연산 (Proberen, Test)
자원을 사용해도 되는지 검사하고 가능하면 사용하도록 감소시키는 연산
1.
세마포어 값(S) 확인
2.
S > 0 이면 S = S - 1 (자원을 사용)
3.
S = 0 이면 자원이 없으므로 대기 상태
예제)
자원이 3개 (S = 3) 일 때, P 연산을 호출하면 하나 감소됨
S = 0 인경우 프로세스틑 블록(대기)상태에 들어감
P(S) 실행 → S = 2 P(S) 실행 → S = 1 P(S) 실행 → S = 0 (더 이상 자원 없음, 다음 요청은 대기)
Plain Text
복사
V연산 (Vehogen, Signal)
자원을 사용이 끝나면 반납하고 다른 프로세스를 깨우는 연산
1.
세마포어 값(S)을 증가시킴(S = S + 1)
2.
대기중인 프로세스가 있으면 깨움
예제)
S = 0 인 상태에서 V(S) 호출시
V(S) 실행 → S = 1 (자원 하나가 사용 가능해짐)
Plain Text
복사

상호배제 해결

한 프로세스가 임계영역 수행중 다른 프로세스 임계 영역에 진입 X
임계영역 수행중이던 프로세스가 임계영역 벗어남 > 누군가 하나는 임계영역을 새로이 수행
임계영역 진입 못하고 대기하는 프로세스 > 적절한 시간 내에 임계영역 수행 시작해야함
진입영역 - 임계영역에 대한 수행을 해도 되는지 체크 임계영역 해제영역 - 다른 프로세스가 임계영역 수행을 시작 할 수 있도록 함
Java
복사

세마포어를 이용한 상호배제 구현

진입영역: P(mutex)
해제영역: V(mutex)
대기 큐는 FIFO로 동작
semaphore S = 1;// 초기값 1 void critical_section() { P(S);// 자원 사용 (락)// 여기가 임계영역 V(S);// 자원 반납 (언락) }
Java
복사
P(S) 실행 → S = 0이 되어 다른 프로세스는 대기
V(S) 실행 → S = 1이 되어 다른 프로세스가 실행 가능