[운영체제] 병행 프로세스-1
병행 프로세스의 개요
- 병행성 : 여러 개의 프로세스 또는 스레드가 동시 수행되는 시스템의 특성
- 병행 프로세스 : 동시 수행되는 여러 개의 프로세스 또는 쓰레드
- 병행 프로세스의 실행 형태
- 1개의 CPU : 인터리빙 형식
(이해가 가지 않아서 추가로 더 찾아봤는데 과거에는 1개의 CPU = 1개의 코어라서 사용했던 개념이고 현재의 멀티코어 CPU에서는 1개의 CPU여도 이렇게 적용되지 않음. 또는 초기 개념자체를 1개의 코어라고 이해해도 될듯) - 여러개의 CPU : 병렬처리 형식
- 1개의 CPU : 인터리빙 형식
- 멀티프로세서 시스템에서의 메모리 구조에 따라
- 강결합 시스템 : 공유 메모리 구조. 하나의 메모리를 두고 공유함
- 약결합 시스템 : 분산 메모리 구조. CPU마다 메모리를 별도로 두고있고 묶음들이 통신선을 두고 공유함
- 강결합 시스템 : 공유 메모리 구조. 하나의 메모리를 두고 공유함
프로세스 간의 관계
- 독립 프로세스
- 수행중인 다른 프로세스에 영향을 주지도 받지도 않음
- 데이터 및 상태를 다른 프로세스와 공유하지도 않음
- 프로세스의 실행
- 결정적 : 실행결과는 입력에 의해서만 결정됨
- 재생 가능 : 같은 입력에 대해 항상 동일한 실행 결과
- 결정적 : 실행결과는 입력에 의해서만 결정됨
- 수행중인 다른 프로세스에 영향을 주지도 받지도 않음
- 협력 프로세스
- 수행 중인 다른 프로세스와 영향을 주고받음
- 데이터 및 상태를 다른 프로세스와 공유
- 프로세스의 실행
- 비결정적 : 실행결과는 실행 순서에 좌우됨
- 재생 불가능 : 같은 입력에 대해 항상 동일한 재생 결과를 보장하지 못함
- 비결정적 : 실행결과는 실행 순서에 좌우됨
- 수행 중인 다른 프로세스와 영향을 주고받음
협력 프로세스의 병행성 문제
협력 프로세스인 경우 발생 가능한 문제
- 상호배제
2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것
- 임계영역 : 2개 이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역
- 임계영역 : 2개 이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역
- 동기화
2개 이상의 프로세스에 대한 처리순서를 결정하는 것
- 상호배제 : 임계영역에 대한 동기화 문제
- 상호배제 : 임계영역에 대한 동기화 문제
- 통신
- 프로세스들이 데이터를 공유하기 위해 반드시 필요
- 프로세스간 통신(IPC)
- 통신방법
1) 하나의 변수 사용
2) 메시지를 서로 주고받음
- 프로세스들이 데이터를 공유하기 위해 반드시 필요
세마포어
- 상호배제와 동기화 문제를 해결하기 위한 도구
- Dijkstra가 제안한 방식
- 정수형 공용 변수
- 저장값 : 사용 가능한 자원의 수 또는 잠김이나 풀림의 상태
- 저장값 : 사용 가능한 자원의 수 또는 잠김이나 풀림의 상태
- 상황에 맞춰 0 이상인 정수로 초기화
- 두 기본연산 p와 v에 의해서만 사용됨
- 기본연산 : 인터럽트되지 않고 하나의 단위로 처리됨
- 기본연산 : 인터럽트되지 않고 하나의 단위로 처리됨
- 연산 p
- 검사, 감소 시키려는 시도
void P(semaphore s) { if (s>0) { s--; } else { 현재 프로세스를 대기시킴 } }
- 검사, 감소 시키려는 시도
- 연산 v
- 증가 시키려는 시도
void V(semaphore s) { if (대기 중인 프로세스 없음) { s++; } else { 현재 프로세스 1개 진행 } }
- 증가 시키려는 시도
- 세마포어마다 대기 큐 필요
세마포어를 이용한 상호배제 해결
- 상호배제를 위한 일반적인 요구사항
- 한 프로세스가 임계영역 수행 중. 다른 프로세스는 임계영역에 진입해서는 안됨
- 임계영역 수행중이던 프로세스가 임계영역 벗어남. 누군가 하나는 임계영역을 새로이 수행할 수 있어야 함
- 임계영역 진입 못하고 대기하는 프로세스. 적절한 시간 내에 임계영역 수행을 시작할 수 있어야 함
- 한 프로세스가 임계영역 수행 중. 다른 프로세스는 임계영역에 진입해서는 안됨
- 상호배제를 위한 임계영역 주변의 코드 영역
... [ 진입영역 ] // 임계영역에 대한 수행을 해도 되는지 체크 [ 임계영역 ] [ 해제영역 ] // 다른 프로세스가 임계영역 수행을 시작할 수 있도록 함 ...
- 세마포어 이용
... [ P(mutex) ] [ 임계영역 ] [ V(mutex) ] ...
- 세마포어 mutex 초기값은 1
- 대기 큐는 FIFO로 동작
세마포어를 이용한 동기화 해결
상황 : 프로세스 A가 코드 s1을 수행한 후, 프로세스 B가 코드 s2를 수행하도록 동기화
- 프로세스 A
... [ s1 ] [ V(sync) ] ...
- 세마포어 sync 초기값은 0
- 세마포어 sync 초기값은 0
- 프로세스 B
... [ P(sync) ] [ s2 ] ...