Critical section
- 임계 구역(critical section) 또는 공유변수 영역: 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부
- 두 개의 프로세스가 동시에 접근하지 않도록 만들기 위해 공유 데이터 접근 이전에 entry section을 통해 lock을 걸어 동시 접근을 막음
충족 조건
- Mutual Exclusion(상호 배제)
- 어떤 프로세스가 이미 들어가 있으면 다른 프로세스는 들어가면 안 된다.
- Progress
- 아무도 들어가 있지 않은 상태에서 critical section에 들어가고 싶으면 접근할 수 있게 해야 한다.
- Bounded Waiting
- 기다리는 시간이 유한해야 한다. (특정 프로세스 입장에서 지나치게 오래 기다리는 starvation을 막아야 함)
- ex. 프로세스가 세 개 있는 경우 둘이 번갈아가며 사용하고 하나는 배제되는 경우
해결 Algorithm
Algo1
- turn : 누구 차례인지를 말해주는 변수
- 본인의 차례가 아닌 경우 while 문에 들어가 대기 / 상대방에 critical section에서 나오면(차례를 바꿔줌) critical section에 들어갔다가 수행 후 턴을 바꿈
- progress 조건 만족 X => why? 무조건 교대로 하는 방식 -> 한쪽이 들어가지 않는다면 다른 한쪽은 영원히 못 들어가는 경우 발생 => algo2
Algo2
- flag : 각각의 프로세스가 가지는 변수로, 본인이 critical section에 들어가고자 하는 의사표시
- 상대방이 의사를 가지고 있다면 양보하는 방식
- 둘 다 의사표시를 한 경우(flag를 든 경우) 서로에게 양보하는 문제 발생 => algo3
Algo3
- turn과 flag 변수 모두 사용
- 상대방이 의사도 있고 상대방 차례일 경우에만 기다림 -> 둘 중 하나라도 미충족시 내가 들어감
- 경우의 수를 다 따져보는 방식(조건 모두 충족)
- but, bust waiting(=spin lock!) : 상대방이 CPU를 잡은 경우 나는 계속 while문을 돌아야 함 => 비효율적(while문만 돌다 CPU 할당 시간을 다 쓰는 문제 발생 가능)
Synchronization Hardware
- 하드웨어적으로 하나의 instruction이 제공되면 위의 과정이 수월해질 수 있음
- 어떤 데이터를 읽고 쓰는 걸 하나의 instruction으로 처리할 수 없기에 CPU를 빼앗는 문제를 간단히 해결 가능
- ex. a == 0일 경우, 읽고 쓰고 a를 1로 바꿈. 이 과정에서 test_and_set만 lock을 확인하고 없다면 내가 lock을 함과 동시에 사용하면 됨
- 하드웨어적으로 값을 읽고 쓰는 걸 automatic 하게 만들 수 있다면 lock을 걸고 푸는 게 쉬어짐
cf) semaphores
- 프로그래머 입장에서 연산을 통해 lock을 걸고 푸는 걸 지원
https://core.ewha.ac.kr/publicview/C0101020140404144354492628?vmode=f
반효경 [운영체제] 12. Process Synchronization 1
설명이 없습니다.
core.ewha.ac.kr
'study > CS study' 카테고리의 다른 글
Process Synchronization 3 (0) | 2021.09.15 |
---|---|
Process Synchronization 2 (0) | 2021.09.06 |
CPU Scheduling 2 / Process Synchronization 1 (0) | 2021.08.31 |
CPU Scheduling 1 (0) | 2021.08.09 |
Process Management 1&2 (0) | 2021.08.02 |