🔨동기화란
- 동시다발적으로 실행되는 프로세스는 서로 데이터를 주고받으며 협력적으로 실행될 수 있다.
프로세스들은 아무렇게나 실행되서는 안되고 올바른 실행을 위해 동기화가 필수적이다.
🌅프로세스 동기화
- 프로세스들 사이의 수행 시기를 맞추는 것
스레드 등 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.
- 실행 순서 제어를 위한 동기화
- 상호 배제를 위한 동기화
공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
💒공유 자원과 임계 구역
-
공유 자원
여러 프로세스 혹은 스레드가 공유하는 자원
전역 변수, 파일, 입출력장치, 보조기억장치 등
-
임계 구역
동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 함
레이스 컨디션
여러 프로세스가 동시다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
운영체제가 임계구역 문제를 해결하는 세 가지 원칙
- 상호 배제
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행
임계 구역에 어떤 프로세스도 진입하지 않았따면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기
한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가 임계 구역에 들어올 수 있어야 한다.
🔎동기화 기법
📣뮤텍스 락
- 상호 배제를 위한 동기화 도구
즉 자원에 동시 접근하지 않도록 만드는 도구다.
- 뮤텍스 락의 단순한 형태
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역의 잠금을 해제하는 역할 : release 함수
acquire 함수
- 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
- 반복적으로 lock을 확인하는 대기 방식을 바쁜 대기라고 한다.
release 함수
-
임계 구역에서 작업이 끝나고 호출하는 함수
-
임계 구역 전후로 함수를 호출하면 된다.
🔔세마포
- 뮤텍스 락과 비슷하지만, 더 일반화된 방식의 동기화 도구
- 공유 자원이 여러 개 있는 경우에도 적용이 가능한 도구
세마포의 구현 방법
- 임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
- 임계 구역 앞에서 기다리는 프로세스에 가도 좋다고 신호 주는 signal 함수
문제점과 해결 방법
프로세스의 순서 제어 방법
- 세마포의 변수 S를 0으로 두고
- 먼저 실행할 프로세스 뒤에 signal 함수,
- 다음에 실행할 프로세스 앞에 wait 함수를 붙인다.
📚모니터
- 사용자가 사용하기 편리한 도구
- 상호 배제를 위한 동기화, 실행 순서 제어를 위한 동기화 모두 가능
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단
- 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행 재개
상호 배제를 위한 동기화
- 인터페이스를 위한 큐
- 공유 자원에 접근하려는 프로세스를 (인터페이스를 위한) 큐에 삽입
- 큐에 삽입된 순서대로 (한 번에 하나씩) 공유 자원 이용
실행 순서 제어를 위한 동기화
-
조건 변수 이용
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수
-
조건 변수로는 wait과 signal 연산 수행 가능
-
조건 변수.wait()
대기 상태로 변경, 조건 변수에 대한 큐에 삽입
-
조건 변수.signal()
wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경