[운영체제] 프로세스 동기화
Updated: Categories: CS프로세스의 동기화 문제에 대해 알아보자
IPC
- Inter Process Communication
- 프로세스는 독립된 메모리 공간을 가지기에 서로 통신이 어려움
- 따라서 프로세스의 내부 통신 방법을 IPC라 함
- IPC는 크게 두가지로 나뉜다
메시지 전달
- 커널을 통해 메시지를 전달하여 데이터를 주고받는 방식
- 장점 : 커널을 사용하여 구현이 쉬움
- 단점 : 시스템 호출로 인한 오버헤드 발생
- Pipe : 단방향 파이프를 통해 통신
- Signal : 프로세스 ID를 통해 메시지를 전달
- Message Queue : 메시지 큐를 통해 통신
- Socket : 네트워크 간 프로세스 통신 방식
공유 메모리
- 공유 메모리 영역을 통해 데이터를 주고받는 방식
- 장점 : 커널 의존도가 낮아 속도가 빠름
- 단점 : 동기화 이슈 발생
- Semaphore
동시성 문제
- 동시성 문제 : 여러 프로세스가 ‘공유자원’을 두고 ‘경쟁상태’에 빠지는 것
- 공유자원 : 여러 프로세스가 공동으로 사용하는 메모리, 파일 등
- 경쟁상태 : 두 개 이상의 프로세스가 공유 데이터에 접근하는 상황
- 동기화 : 공유자원의 일관성을 유지하기 위해 프로세스의 접근 순서를 제어하는 것
임계구역
- 공유자원 접근 순서에 따라 실행결과가 달라지는 프로그램의 영역, 코드블럭
- 생산자-소비자 문제가 대표적인 임계구역 문제
- 해결조건
- 상호배제 : 한 프로세스가 임계구역에 진입하면 다른 프로세스는 진입할 수 없음
- 유연한 진행 : 한 프로세스가 다른 프로세스의 진입을 방해하면 안됨
- 한정된 대기 : 어떤 프로세스도 무한 대기하지 말아야함 (기아현상이 없어야함)
Mutex
- 상호 배제(Mutual Exclusion)를 뜻함
- 1개의 공유자원에 1개의 프로세스만 접근할 수 있음
- Lock 기법 : 프로세스가 임계구역 진입시 Lock을 걸어버림
- 바쁜대기 : 대기 프로세스는 계속 실행중이면서 임계구역을 지속적으로 확인함
- 피터슨 알고리즘이 이에 해당함
Semaphore
- N개의 공유자원에 N개의 프로세스만 접근할 수 있음
- 남은 공유자원의 수 카운터를 사용함
- 프로세스는 임계구역 진입하며 카운터 -1
- 카운터가 0일때 다른 프로세스는 진입 불가
- 프로세스는 임계구역에서 나오면서 카운터 +1, Wake Up 신호 보냄
- 대기 프로세스는 Sleep 상태가 된다
- 남은 공유자원의 수 카운터를 사용함
Monitor
- 세마포어보다 고수준 언어에서 사용되는 상호배제 기법
- 자바에서 동기화에 사용됨
- 상호배제 큐(Mutual Exclusion Queue)와 조건동기 큐(Conditional Synchronization Queue)가 사용된다
- 상호배제 큐 : 공유자원을 얻기위해 프로세스가 대기하는 큐
- 조건동기 큐 : 공유자원을 점유하고 있던 프로세스가 block되면서 대기하는 큐 (다른 프로세스에게 자원을 뺏긴것)
- synchronized : 코드블록을 동기화시키는 제어자
- wait() : 자원을 점유하던 프로세스를 block시키는 메소드
- notify() : 조건동기 큐의 block 상태 프로세스를 깨우는 메소드
- notifyAll() : 조건동기 큐의 모든 block 상태 프로세스를 깨우는 메소드
교착상태
- 여러 프로세스가 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한 대기하는 현상
- 기아현상과 차이점
- 기아현상 : 특정 프로세스가 계속 지연 ~ 무한대기
- 교착상태 : 모든 프로세스가 무한대기
발생조건
- 상호배제 : 한번에 하나의 프로세스만 공유 자원 사용
- 점유대기 : 하나의 자원을 점유하면서 다른 프로세스의 자원을 요구하며 대기
- 비선점 : 점유중인 자원은 다른 프로세스가 빼앗을 수 없음
- 순환대기 : 점유와 대기를 하는 프로세스가 원형을 이뤄야 함
교착상태 예방
- 교착상태 발생조건 네가지 중 하나를 미리 무력화하는 방법
- 실효성이 적어 사용되지 않음
교착상태 회피
- 교착상태가 발생하지 않는 수준으로 자원 할당
- 은행원 알고리즘이 이에 해당함
- 자원의 낭비가 심하다
교착상태 발견 & 회복
- 교착상태를 발견하고 회복시키는 방법
- 발견
- 타임아웃 : 특정 프로세스가 일정시간동안 작업이 진행되지 않으면 교착상태가 발생했다고 판단
- 자원할당 그래프 : 그래프를 보고 단일자원일때 사이클이 생기면 교착상태로 판단
- 회복
- 모든 프로세스 강제종료 : 재시작시 동시에 실행하면 교착상태가 재발생할 수 있으므로 순차적으로 실행
- 교착상태 원인 프로세스를 하나씩 종료 : 우선순위가 낮은 프로세스부터 종료시킴
- 현실적으로 가장 적합한 방법
식사하는 철학자 문제
- 일정 시간 생각을 한다.
- 왼쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
- 오른쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
- 양쪽의 포크를 잡으면 일정 시간만큼 식사를 한다.
- 오른쪽 포크를 내려놓는다.
- 왼쪽 포크를 내려놓는다.
- 다시 1번으로 돌아간다.
교착상태 조건
- 상호배제 : 철학자들은 서로 포크를 공유할 수 없다
- 점유대기 : 철학자들은 왼쪽 포크를 잡은 채 오른쪽 포크를 기다린다
- 비선점 : 철학자들은 다른 철학자의 포크를 빼앗을 수 없다
- 순환대기 : 철학자들은 원형 테이블에 앉아있다
해결방법
- 교착상태 예방
- 상호배제 : 철학자들의 포크를 서로 공유할 수 있도록한다.
- 점유대기 : 두 포크를 모두 잡지 못한 철학자는 포크를 놓도록 한다
- 비선점 : 철학자들이 다른 철학자의 포크를 빼앗을 수 있도록한다
- 순환대기 : 한 철학자는 왼쪽이 아닌 오른쪽 포크를 먼저 잡도록 한다