1. 프로세스 동기화란?
프로세스들의 수행 시기를 맞추는 것!
크게 두 가지를 의미하는데,
1️⃣ 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
- reader writer problem
- reader 와 writer 프로세스는 순서에 맞게 실행되어야 함
- ex: reader 프로세스는 Book.txt 안에 값이 존재한다는 조건이 만족되어야 실행 가능함
2️⃣ 상호 배제: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
- bank account problem
- 생산자 & 소비자 problem
(스레드도 동기화의 대상임)
2. 공유 자원과 임계구역
2.1 용어 정리
💡 공유 자원(shared recource)
여러 프로세스 혹은 스레드가 공유하는 자원
💡 경쟁 조건(race condition)
2개 이상의 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황
💡 임계 구역(critical area)
공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
2.2 임계구역 문제 해결 조건
✔️ 상호 배제(mutual exclusion) ⭐️ 중요! ⭐️
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음
- 임계구역 내에는 한 번에 하나의 프로세스만 있어야함
✔️ 한정 대기(bounded waiting)
- 어떤 프로세스도 임계구역에 진입하지 못하여 무한 대기 하지 않아야 함
✔️ 진행의 융통성(progress flexibility)
- 임계구역에 어떤 프로세스도 진입하지 않았다면, 진입하고자 하는 프로세스는 들어갈 수 있어야 함
3. 동기화 기법
3.1 뮤텍스 락(자물쇠 역할!!)
acquire(); // 자물쇠가 잠겨 있는지 확인, 잠겨 있지 않다면 잠그고 들어가기
// 임계구역 // 임계구역에서의 작업 진행
release(); // 자물쇠 반환
- acquire()에서는 임계구역이 잠겨있는지를 반복적으로 확인함
-> 바쁜 대기(busy waiting) 발생(CPU 사이클 낭비)
3.2 세마포어
3.2.1 카운팅 세마포어
💡 세마포어의 바쁜 대기 해결 방법
- 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
3.3 모니터
- 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화하는 방법
1️⃣ 임계구역에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청을 함
2️⃣ 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌
참조
📚 쉽게 배우는 운영체제
🧑🏻🏫 개발자를 위한 컴퓨터공학1: 혼자 공부하는 컴퓨터구조 + 운영체제