All
병행성과 병행 프로세스
병행성(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이 되어 다른 프로세스가 실행 가능




