개요
최근에는 여러 프로세스가 단순히 순차처리가 아닌 병행처리될 필요가 많다.
음악 파일을 배경음악으로 재생하며 동시에 동영상도 틀어놓고 문서작업을 하는 등 운영체제는 이들을 병행으로 처리해야 한다.
특히 이렇게 병행처리되는 프로세스가 서로 상호작용하며 동작하는 경우에는 해결해야 할 다양한 문제가 존재한다.
따라서 해당 글에서는 병행 프로세스의 기본 개념과 함께 상호 배제와 동기화 문제에 대해 정리하고자 한다.
병행프로세스의 실행형태
- 1개의 CPU : 인터리빙 형식
- 여러개의 CPU : 병렬처리 형식
![](https://blog.kakaocdn.net/dn/rfaVI/btsHj0EmOaL/kMjeIGWZ885ZVmBhMuN74K/img.png)
📍 멀티 프로세서 시스템에서의 메모리 구조에 따라
- 강결합 시스템(공유 메모리 구조)
: CPU는 여러 개 존재 , 메모리는 하나만 존재하는 구조
> 여러 CPU들이 하나의 메모리를 공유 !
- 약결한 시스템(분산 메모리 구조)
: CPU 는 여러개 존재, 메모리도 여러개 존재
CPU마다 메모리가 별도로 존재 , 여러 개의 컴퓨터 시스템들이 독립적으로 존재하고 있고 통신선으로 연결되어 정보를 주고받을 수 있는 분산 메모리 구조이다.
- 차이점
강결합 시스템은 각각의 CPU끼리 정보교환을 하려고 할 때에는 메모리를 활용할 수도 있고 운영체제를 활용하여 정보교환이 가능하다.
프로세스간의 관계
독립프로세스
- 수행중인 다른 프로세스에 영향을 주지도 받지도 않음
- 데이터 및 상태를 다른 프로세스와 공유하지 않음
- 프로세스의 실행
> 결정적 : 실행결과는 입력에 의해서만 결정됨
> 재생 가능 : 같은 입력에 대해 항상 동일한 실행결과
협력 프로세스
- 수행중인 다른 프로세스와 영향을 주고받음
- 데이터 및 상태를 다른 프로세스와 공유
- 프로세스의 실행
> 비결정적 : 실행결과는 실행순서에 좌우됨
> 재생 불가능 : 같은 입력에 대해 항상 동일한 실행결과를 보장하지 못함
병행성 문제
- 협력 프로세스인 경우 발생 가능한 문제
> 상호배제
> 동기화
> 통신
상호배제
: 2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것
* 임계영역 : 2개 이상의 프로세스가 동시에 사용하면 안 되는 공유 자원을 액세스 하는 프로그램 코드 영역
동기화
: 2개 이상의 프로세스에 대한 처리 순서를 결정하는 것
- 프로세스 동기화
* 상호배제 : 임계영역에 대한 동기화 문제
예시 요구사항 )
계좌 1에 있는 5만원 중에서 일부 금액(만원)을 인출해서 계좌 2에 입금을 하는 로직
- 정상적이게 서비스가 작동할 때
- 비정상적이게 작동할때
입금 프로세스 B가 먼저 작동할 수도 있으므로 출금 프로세스 A 와 입금 프로세스 B 와의 순서를 결정하는 동기화 작업이 필요하다.
통신
: 프로세스들이 데이터를 공유하기 위해 반드시 필요
- 프로세스 간 통신 (IPC)
> 통신 방법
- 하나의 변수 사용
- 메시지를 서로 주고받음
세마포어
: 상호배제와 동기화 문제를 해결하기 위한 도구
- Dijkstra가 제안
> 정수형 공용변수
- 저장값 : 사용 가능한 자원의 수 또는 잠김이나 풀림의 상태
* 변수에 담기는 정수형 값의 의미는 상황에 따라서 그 의미가 변한다.
> 상황에 맞춰 0 이상인 정수로 초기화
> 두 기본 연산 P 와 V 에 의해서만 사용됨
- 기본연산 : 인터럽트되지 않고 하나의 단위로 처리됨
연산 P
- 검사, 감소시키려는 시도
void P (semaphore s)
{
if(s>0)
s--;
else
현재 프로세스를 대기시킴;
}
> 매개변수로 받아온 s가 양의 정수값이면 세마포어의 값을 1 감소시킨다. 그 후 해당하는 세마포어 종료.
그러나 s가 양의 정수값이 아니라면 p라는 연산을 호출한 프로세스를 대기시킨다.
연산 V
- 증가
void V(semaphore s){
if(대기중인 프로세스 없음)
s++;
else
대기중인 프로세스 1개 진행;
}
> 받아온 세마포어의 값을 보기 전에 대기중인 프로세스가 있는지 여부 확인
=> 각각의 세마포어마다 대기 큐 필요
상호배제 해결
> 상호배제를 위한 일반적인 요구사항
● 한 프로세스가 임계영역 수행 중
▷ 다른 프로세스는 임계영역에 진입해서는 안 됨
● 임계영역 수행 중이던 프로세스가 임계영역 벗어남
▷ 누군가 하나는 임계영역을 새로이 수행할 수 있어야 함
● 임계영역 진입 못하고 대기하는 프로세스
▷ 적절한 시간 내에 임계영역 수행을 시작할 수 있어야 함
> 상호배제를 위한 임계영역 주변의 코드 영역
● 진입영역 : 임계영역에 대한 수행을 해도 되는 지 체크
● 해제영역 : 다른 프로세스가 임계영역 수행을 시작할 수 있도록 함
> 세마포어 이용
● 세마포어 mutex 초기값은 1
● 진입 영역 : P(mutex)
● 해제 영역 : V(mutex)
● 대기 큐는 FIFO 로 동작
동기화 해결
● 상황 : 프로세스 A가 코드 S1 을 수행한 후 프로세스 B가 코드 S2 를 수행하도록 동기화
● 세마포어 sync 초기값은 0