Index
Search
1. 병행 프로세스의 개요
1.1. 병행성과 병행 프로세스
•
병행성 (concurrency)
◦
여러 프로세스 또는 스레드가 동시 수행되는 시스템의 특성
◦
같은 시간에 여러 프로세스가 동시에 수행되는 것 처럼 보이는 것
◦
동시성
•
병행 프로세스
◦
동시에 수행되는 여러개의 프로세스 또는 스레드
1.2. 병행 프로세스의 실행 형태
•
CPU 종류에 따라
◦
1개의 CPU: 인터리빙 형식
▪
하나의 CPU가 하나의 프로세스 처리
◦
여러개의 CPU: 병렬 처리 형식
•
멀티프로세스 세스템에서의 메모리 구조에 따라
◦
강결합 시스템 (공유 메모리)
◦
약결합 시스템 (분산 메모리 구조)
1.3. 프로세스 간의 관계
•
독립 프로세스
◦
수행 중인 다른 프로세스에 영향을 주지도 받지도 않음
◦
데이터 및 상태를 다른 프로세스와 공유하지 않음
◦
프로세스의 실행
▪
결정적: 실행결과는 입력에 의해서만 결정
▪
재생 가능: 같은 입력에 대해 항상 동일한 실행 결과
•
협력 프로세스
◦
수행 중인 다른 프로세스와 영향을 주고 받음
◦
데이터 및 상태를 다른 프로세스와 공유
◦
프로세스의 실행
▪
비결정적: 실행결과는 실행순서에 좌우됨
▪
재생 불가능: 같은 입력에 대해 항상 동일한 실행 결과를 보장하지 못함
2. 병행성 문제
2.1. 병행성 문제
•
협력 프로세스의 경우 발생 가능한 문제
◦
상호 배제
◦
동기화
◦
통신
2.2. 상호 배제
•
2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는것
•
임계영역
◦
2개이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역
•
임계영역이 상호배제가 될 수 있도록 잘 처리해줘야 함
•
예시)
2.3. 동기화
•
2개 이상의 프로세스에 대해 처리순서를 결정하는 것
◦
프로세스 동기화
◦
상호배제도 임계영역에 대한 동기화 문제라고 볼 수 있음
2.4. 통신
•
프로세스들이 데이터를 공유하기 위해 반드시 필요
◦
프로세스 간 통신 (IPC)
•
통신 방법
◦
하나의 변수 사용
◦
메세지를 서로 주고 받음
3. 세마포어
3.1. 세마포어 (semaphore)
•
상호배제와 동기화 문제를 해결하기 위한 도구
◦
Dijkstra가 제안
•
정수형 공용 변수
◦
저장 값: 사용가능한 자원의 수 또는 잠김이나 풀림의 상태
•
기본적으로 초기화 필요
◦
상황에 맞춰 0 이상인 정수로 초기화
•
두 기본 연산 P와 V에 의해서만 사용됨
◦
기본연산: 인터럽트되지 않고 하나의 단위로 처리됨
•
연산 P
◦
검사, 감소시키려는 시도
void P (semaphore s)
{
if (s > 0)
s--;
else
현재 프로세스를 대기시킴;
}
Shell
복사
•
연산 V
◦
증가
void V (semaphore s)
{
if (대기중인 프로세스 없음)
s++;
else
대기중인 프로세스 1개 진행;
}
Shell
복사
•
세마포어마다 대기 큐 필요
3.2. 상호배제 해결
•
상호 배제를 위한 일반적인 요구사항
◦
오직 한 프로세스가 임계영역 수행 중
▪
다른프로세스는 임계영역에 진입해서는 안됨
◦
임계영역 수행 중이던 프로세스가 임계영역 벗어남
▪
누군가 하나는 임계영역을 새로이 수행할 수 있어야 함
◦
임계영역 진입 못하고 대기하는 프로세스
▪
적절한 시간 내에 임계영역 수행을 시작할 수 있어야 함
•
상호 배제를 위한 임계영역 주변의 코드 영역
◦
진입 영역
▪
임계영역에 대한 수행을 해도 되는지 체크
◦
해제 영역
▪
다른 프로세스가 임계영역 수행을 시작할 수 있도록 함
•
세마 포어 이용
◦
세마포어 mutex 초기값은 1
◦
진입영역: P (mutex) - 진입영역에 연산 P를 둠
◦
해제영역: V (mutex) - 해제영역에 연산 V를 둠
◦
대기 큐는 FIFO로 동작
예시 코드
3.3. 동기화 해결
•
상황
◦
프로세스 A가 코드 S1을 수행한 후, 프로세스 B가 코드 S2를 수행하도록 동기화
◦
세마포어 sync 초기 값은 0
예시 코드