프로세스 동기화
동기화란
- 동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고 받음
- 자원의 일관성을 보장해야 = 프로세스 동기화를 고려해야
- 실행의 문맥을 갖는 모든 대상은 동기화 대상이기 때문에 스레드도 동기화 대상이다.
동기화
- 프로세스들의 수행 시기를 맞추는 것이다.
- 실행 순서 제어
- 프로세스를 올바른 순서대로 실행
- reader writer problem
- writer: book.txt 파일에 값을 저장하는 프로세스
- reader: book.txt 파일에 저장된 값을 읽어들이는 프로세스
- reader 프로세스는 book.txt 안에 값이 존재한다는 특정 조건이 만족해야만 실행 가능
- 상호 배제
- 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 함.
- band account problem
- 현재 계좌에 잔액 10만원, 프로세스 A는 현재 잔액에 2만원 추가, 프로세스 B는 현재 잔액에 5만원 추가
- 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 함(동시에 잔액에 접근해서는 안된다.)
- context switch 후에도 기다려야 한다.
- producer and consumer problem
- 물건을 계속해서 생산하는 생산자, 물건을 계속해서 소비하는 소비자, 총합 변수 공유한다.
공유 자원과 임계 영역
공유 자원
- 여러 프로세스 혹은 스레드가 공유하는 자원
- e.g. 전역 변수, 파일, 입출력장치, 보조기억장치
임계 구역
- 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- e.g. 총합 변수, 잔액 변수
- 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.
- 임계 구역에 동시에 접근하려고 하면 문제가 발생한다.
- 자원의 일관성이 깨질 수 있음 = race condition
- 고급 언어를 저급 언어로 변경 시 한 줄 코드가 여러 줄로 바뀔 수 있음
- 중간에서 context swtich가 발생하면 예상치 못한 결과 발생 가능
운영체제가 임계구역 문제를 해결하는 세 가지 원칙
= 상호 배제를 위한 동기화를 위한 세 가지 원칙
- 상호 배제 (mutual exclusion)
- 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어갈 수 없음
- 진행 (progress)
- 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있음
- 유한 대기 (bounded waiting)
- 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어가야 함
- 임계 구역에 들어오기 위해 무한정 대기 x
동기화 기법
- 뮤텍스 락
- 상호 배제를 위한 동기화 도구
- 공유 자원이 하나인 경우를 상정
- 뮤텍스 락의 단순한 형태 = 전역 변수 하나, 함수 두개
- 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할: acquire 함수
- 프로세스가 임계 구역에 진입하기 전에 호출
- 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인
- 임계 구역이 열려 있다면 임계 구역을 잠금
- 임계 구역의 잠금을 해제하는 역할: release 함수
- 임계 구역에서의 작업이 끝나고 호출
- 현재 잠긴 임계 구역을 열기
- e.g. acquire → 임계 구역 → release()
- 바쁜 대기 (busy waiting)
- 무한히 계속 반복되면서 임계 구역을 확인하는 방법
세마포어
-
- 좀 더 일반화된 방식의 동기화 도구
- 공유 자원이 여러 개 있는 경우에도 적용 가능
- 카운팅 세마포
- 임계 구역 앞에서 멈춤 신호를 받으면 기다리기
- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
- 세마포의 단순한 형태 = 전역 변수 하나, 함수 두 개
- 임계 구역에 진입할 수 있는 프로세스의 개수(공유 자원의 개수)를 나타내는 s
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait함수상호 배제를 위한 동기화
- wait 함수는 busy waiting (바쁜 대기)
- 사용할 수 있는 자원이 없을 경우 대기 상태로 만든다. (해당 프로세스의 PCB를 대기 큐에 삽입)
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
실행 순서 동기화
- 세마포의 변수 S를 0으로 둔다
- 먼저 실행할 프로세스 뒤에 signal 함수
- 다음에 실행할 프로세스 앞에 wait() 함수
모니터
- 세마포는 임계 구역에 앞뒤로 일일이 wait와 signal 함수를 명시하는 것은 번거로운 일이다.
- 모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리한다.
- 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다.
- 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 한다.
- 실행 순서 제어를 위한 동기화도 제공
- 특정 조건을 바탕으로 프로세스를 실행하고, 일시 중단하기 위해 모니터는 조건 변수 사용
조건 변수(condition variable)
- wait, signal 연산 수행 가능
- wait는 호출한 프로세스의 상태를 대기 상태로 전환하고, 대기 큐에 삽입하는 연산
모니터는 조건 변수를 이용하여 프로세스 실행 순서 제어를 위한 동기화를 제공한다.
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단한다.
- 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행을 재개한다.
'📗 BOOK > 혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
혼자 공부하는 컴퓨터 구조+운영체제 14장 정리 (0) | 2024.08.04 |
---|---|
혼자 공부하는 컴퓨터 구조+운영체제 13장 정리 (0) | 2024.07.31 |
혼자 공부하는 컴퓨터 구조+운영체제 11장 정리 (0) | 2024.07.27 |
혼자 공부하는 컴퓨터 구조+운영체제 10장 정리 (0) | 2024.07.27 |
혼자 공부하는 컴퓨터 구조+운영체제 9장 정리 (0) | 2024.07.25 |