- 정리의 기반은 학교 강의 노트와 [Operating System Concepts]를 참고하였습니다.
22-1학기 운영체제를 들으면서 중간고사에 대비하면서 정리해놓은 개념들입니다…ㅎ 다른 핵심 내용이나 기본이라고 생각되는 내용들은 제외하고 제가 시험에서 중요하다고 생각하는 것들만 중구난방으로 정리되어있습니다.
Critical section
- 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드의 일부
Spinlock
- software lock
- context switch
- 계속 기다림
busy waiting = 무한 루프를 돌면서 다른 스레드에게 CPU를 안내어 주는 것
- lock과 unlock 과정이 짧아서 락하는 경우가 드물 때 사용
싱글 코어에서는 무의미함(락을 풀려면 context switch가 어차피 일어나기 때문에 cpu를 낭비할 수 있다.)
- Spinlock으론 Synchronization 문제를 해결하기엔 부족하므로 High-level Synchronizaion이 필요하다 -> Semaphores, Mutexes
High-level Synchronization : 하드 웨어 기반 해결책은 프로그래머가 사용할 수 없으므로 상위 수준의 소프트웨어 도구 존재
Peterson’s Solution
증명 조건
1. 상호 배제
1
2
3
* 프로세스 P(i)가 반드시 flag[j] == false 이거나, turn == i 라면 1 번은 항상 만족하게 된다.
* 만약 flag[0], flag[1]이 모두 true라고 하더라도, turn 값에 따라 임계 구역에 한 프로세스만 진입 가능하므로 위 코드의 while문을 두 프로세스가 모두 통과할 수 없다.
* 또한 정해진 프로세스가 임계 구역에 있을 동안 flag과 turn 값이 변경되지 않으므로, 상호 배제 조건은 지켜진다.
2. 진행에 대한 요구 조건을 만족한다는 사실(progress)
3. 대기 시간이 한없이 길어지지 않는다는 사실(bounded waiting)
- 2, 3번은 동시에 증명 가능
- 이 방법은 최신 컴퓨터 아키텍처에서 작동한다고 보장되지 않는다.
Semaphores
1. 가용한 자원의 개수로 초기화 2. wait() 연산 수행, 세마포어의 값 감소 3. 자원 방출, signal() 연산 수행, 세마포어 값 증가
- if 세마포어 값 == 0, 모든 자원 사용중
- wait() :
- busy-waiting 대신 프로세스가 자신을 일시 중지
- value가 0보다 작으면, 모든 자원이 사용중이기 때문에 sleep모드로 들어감
- sleep() : sleep()모드인 프로세스는 다른 프로세스가 signal 연산을 실행하면 재시작(wait 큐 -> ready 큐)
- value값이 음수 = 대기흐고 있는 프로세스들의 수
Mutexes(Binary Semaphores라고도 불린다.)
1. 임계 구역 진입 전 락 획득
2. 탈출할 때 락 반환
- acuire()이 락 획득
- realse()가 락 반환
- available이라는 boolean 변수 : lock 가용 여부
Bounded-buffer 문제
생성자 프로세스가 버퍼 중 빈 곳에 데이터를 쓸 때 인터럽트가 발생하면 다른 프로세스에게 공유 자원이 넘어가고, 그러면 이 두 프로세서 중 하나 이상은 데이터가 유실될 수 있다.
공유 버퍼에 락을 걸고, 데이터를 넣은 후 비어있는 위치를 바꾸고 락 해제
소비자 프로세스에서도 어떤 프로세스가 데이터를 꺼낼 때 인터럽트가 발생하여 공유 자원이 다른 프로세스에 넘어가게 되면 두 프로세스가 하나의 데이터를 가져간다.
공유 버퍼에 락 걸고, 데이터를 꺼낸 후 내용이 있는 버퍼 위치를 찾아 이동 후 락 해제
Reader-Writer 문제
데이터베이스에서 Writer가 임계 구역에 있을 때 Reader가 와서 데이터를 꺼내가거나 다른 Writer가 있으면, 데이터가 이상해진다. Read는 다수여도 되지만, Writer는 한명이 접근하면 그 외에는 접근 불가로 만들어야 한다.