일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Operating System
- MAC address
- Spring
- grafana
- AWS
- Packet
- PostgreSQL
- aws s3
- EC2
- ip
- helm
- Trino
- jvm
- Vision
- JavaScript
- log
- java
- docker
- zookeeper
- tcp
- CSV
- kubeadm
- kubectl
- OS
- kubernetes
- Kafka
- Python
- CVAT
- airflow
- Network
- Today
- Total
JUST WRITE
Process 동기화 본문
이 글은 KOCW 강좌 중 경성대학교 양희재 교수님의 '운영체제' 강의를 정리한 글입니다.
Process 동기화
운영체제가 Process 관련해서 하는 일에는 크게 CPU Scheduling과 Process 동기화가 있다.
Process에는 Independent Process와 Cooperating Process가 있다.
Independent Process는 다른 Process와 아무런 영향 없는 독립적인 Process이다.
Cooperating Process는 다른 Process와 영향을 주고받는 Process를 말한다.
Process간 영향을 주면서 공유하는 자원에 일관성을 유지 못할 수도 있다.
Process 동기화는 Cooperting Process이 실행되면서 공유자원의 일관성을 유지하는 것을 말한다.
현재는 Process단위가 아닌 대부분 Thread 단위이다.
Critical Section
Multi-Thread Process에서 공유자원을 변경하는 부분을 Critical Section이라고 한다.
Critical Section은 동기화와 관련된 문제이다.
Critical Section를 해결하기 위해서는 아래 3가지 조건을 만족해야 한다.
- Mutual exclusion(상호배타)
- 1개 Thread만 진입 가능
- 1개 Thread가 Critical Section 수행 중이면 다른 Thread 진입 불가
- Progress(진행)
- 1개 Thread의 Critical Section 접근에 대한 결정은 유한 시간 내에 결정
- Bounded waiting(유한 대기)
- 대기하고 있는 Thread는 Critical Section에 유한 시간 내에 접근
Process/Thread 동기화
Process 동기화를 통해 이루려는 목적은 아래와 같다.
- Critical Section 문제 해결
- Process 실행 순서 제어
Semaphore
Semaphore는 동기화 문제 해결을 위해 만들어진 Software다.
Semaphore는 2가지 동작이 존재한다.
초기 표현 | 의미 | 현재 표현 |
P | test | acquire() |
V | increment | release() |
class Semaphore {
int value; // number of permits
Semaphore(int value) {
// ...
}
void acquire() {
value--;
if (value < 0) {
// add this process/thread to list
// block
}
}
void release() {
value++;
if (value <= 0) {
// remove a process P from list
// wakeup P
}
}
}
위 코드에서 변수 value는 Critical Section에 동시에 진입할 수 있는 Thread 수를 의미한다.
acquire()는 value값을 감소, 0보다 작으면 Critical Section에 진입 가능한 Thread가 초과되어서 진입을 막는다.
Queue나 List에서 대기하도록 block을 걸어준다.
release()는 value값을 증가, 0보다 같거나 작으면 대기 중인 Thread가 있으므로 Critical Section 수행하게 한다.
Semaphore는 Mutual exclusion의 용도로 사용한다.
위의 value값을 1로 정해서 1개의 Thread가 Critical Section을 수행 중이면 다른 Thread가 수행 못하게 한다.
sem.acquire();
// Critical Section
sem.release();
Semaphore로 Thread의 실행 순서를 조절할 수도 있다.
위의 value값을 0으로 정해서 Thread 간 acquire()와 release()의 순서 조절해서 Thread의 순서를 조정 가능하다.
Thread A | Thread B |
sem.acquire(); | |
Critical Section | Critical Section |
sem.release(); |
'OS' 카테고리의 다른 글
Monitor (0) | 2022.01.16 |
---|---|
Deadlock (0) | 2022.01.15 |
Process vs Thread (0) | 2022.01.12 |
CPU Scheduling (0) | 2022.01.11 |
Process (0) | 2022.01.09 |