오래 못 할 짓 하지 않기
[ 운영체제 ] 9. 프로세스 동기화 본문
[ 배경 ]
프로세스들을 동시다발적으로 실행되며 , 그 과정에서 서로 협력하며 영향을 주고 받는다.
그 과정에서 자원의 일관성도 보장해야한다.
이를 위해 필요한 것이 프로세스와 스레드의 동기화 이다.
* 실행의 문맥을 갖는 모든 대상 = 동기화의 대상
따라서 스레드도 동기화의 대상이다.
하지만 편의상 그냥 프로세스 하나만 명칭으로 붙인다.
동기화
: 프로세스들의 수행 시기를 맞추는 것
1. 실행 순서 제어를 위한 동기화
: 프로세스를 올바른 순서대로 실행하기
예) reader writer problem
- Writer : Book.txt 파일에 값을 저장하는 프로세스
- Reader : Book.txt 파일에 저장된 값을 읽어들이는 프로세스
→ 이 두 프로세스는 무작정 실행되어서는 안 된다. 실행의 순서가 있기 때문에
+ Reader 프로세스는 ' Book.txt 안에 값이 존재한다. ' 는 특정 조건이 만족되어야 실행 가능하다.
따라서 동시에 실행된다고 하더라도 Writer가 선행되어야 실행 가능
2. 상호 배제
: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
= 한 번의 하나의 프로세스만 접근해야 함
예) Bank account problem
현재 계좌 잔액 : 10만원
- 프로세스 A : 현재 잔액 +2만원 추가
→ 1. 잔액 조회
2. 조회된 잔액 +2만원
3. 더한 값 저장
- 프로세스 B : 현재 잔액 +5만원 추가
→ 1. 잔액 조회
2. 조회된 잔액 +5만원
3. 더한 값 저장
A1 → A2 → A3 → B1 → B2 → B3 이 순서가 아니다.
프로세스와 스레드는 정해진 순서대로 이쁘게 실행되지 않는다.
A1 → A2 → B1 → B2 → A3 → B3 이 순서로 돌아간다.
A가 끝나기도 전에 B가 같은 자원에 접근하여 동작을 수행했기 때문에 이런 일이 발생한다.
따라서 하나의 프로세스가 자원에 접근하여 실행되고 있다면,
문맥교환이 이루어지더라도 앞선 프로세스가 자원을 다 쓸 때까지 기다려야한다
= 상호 배제를 위한 동기화
예) Producer & Consumer problem
- 물건을 계속 생산하는 생산자 ( 프로세스 or 스레드 )
- 물건을 계속 소비하는 소비자 ( 프로세스 or 스레드 )
' 총합 ' 변수 공유
이걸 생산자 100000번 , 소비자를 100000번 실행했을 때 '총합'은?
0이 안 나오거나 에러가 생김
= 동기화가 이루어지지 않아서 발생하는 문제
= 동시에 접근해서는 안 되는 자원에 동시에 접근해서 발생한 문제
공유 자원 / 임계 구역
● 공유 자원 : 여러 프로세스 혹은 스레드가 공유하는 자원
ex) 전역 변수 , 파일 , 입출력 장치 , 보조기억 장치
● 임계 구역 : 동시에 실행하면 문제가 생기는 자원에 접근하는 코드 영역
ex) 앞 예시 '총합' 변수 , '잔액' 변수
하나의 프로세스가 임계 구역에 먼저 들어갔다면
다른 프로세스들은 기다렸다가 앞선 프로세스가 임계 구역에서 나왔을 때 들어갈 수 있다.
임계 구역에 동시에 접근했을 때 자원의 일관성이 깨지는 것을 레이스 컨디션이라고 한다.
● OS가 임계 구역 문제를 해결하는 3가지 원칙
= (상호 배제를 위한 동기화를 위한 3가지 원칙)
1. 상호 배제 ( Mutual exclusion )
: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.
2. 진행 ( Progress )
: 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
3. 유한 대기 ( Bounded waiting )
: 한 프로세스가 임계 구역에 진입하고 싶다면 언제가는 임계 구역에 들어올 수 있어야 한다.
( 임계 구역에 들어오기 위해 무한정 대기해서는 안 된다 ).
(출처)
유튜브 한빛미디어
'3학년 1학기 > 운영체제 (OS)' 카테고리의 다른 글
[ 운영체제 ] 10. 교착 상태 (0) | 2024.01.13 |
---|---|
[ 운영체제 ] 9. 프로세스 동기화 기법 (0) | 2024.01.12 |
[ 운영체제 ] 8. CPU 스케줄링 알고리즘 (0) | 2024.01.10 |
[ 운영체제 ] 7. CPU 스케줄링 (0) | 2024.01.09 |
[ 운영체제 ] 6. 프로세스 / 스레드 확인 (with Python) (0) | 2024.01.08 |