Concurrent Process/Threads
- Compete(경쟁)
- Cooperation(협력)
- 동기화문제의 해결방법은 Lock
- Mutual Exclusion (상호 배제)를 보존해야 한다.
- Unlock
공유자원을 A가 lock(x) 하면 B는 A가 unlock(x)할 때까지 대기해야 x를 사용할 수 있다.
=> 동기화의 기본개념
은행 데이터베이스에서 x = 100;에 대해서
A-> 200 B->300
read(x), read(x),
Add x,200 Add x,300
write(x) write(x)
위와 같은 task가 동시에 진행될경우 x의 값이 잘못 write 될 수 있다.
=> 그래서 먼저 시작한 task가 lock을 걸어서 동기화 한다.
시차에 의해 다른 결과가 나올 수 있는 상황 : Race condition
- 자원을 놓고 경쟁한다. 여기서 자원은 데이터베이스의 데이터를 의미한다.
- 이 Race condition을 방지하기 위해 동기화기법을 사용한다.
read 연산은 데이터베이스를 바꾸지 않기 때문에 동시접속을 해도 괜찮지만 write연산은 상호 배제를 지켜야 한다.
6.2 Critical - Section
- 공유자원에 접근하거나 조작하는 코드 영역
6.3 Peterson’s Solution
6.4.3 Atomic Variables
- 변수를 기본적으로 Atomic Variable로 지정해주면 따로 동기화를 해주지 않아도 상호배제성을 가질 수 있다.
6.5 Mutex Locks
- 운영체제에서 제공하는 기본적인 lock(), unlock() 연산
- 한번에 하나의 스레드만 뮤텍스를 얻을 수 있다.
- race condition을 예방할 수 있다.
- Mutex => (Mutual Exclusive)
- 운영체제마다 naming이 다른데, acquire이 lock, release가 unlock이라고 한다.
mutex = 1;
void acquire () {
while (mutex != 1) {
/* mutex 값이 1이 될 때까지 기다린다.*/
}
/* 이 구역에 도착했다는 것은 mutex 값이 1이라는 것이다.
따라서 이제 뮤텍스 값을 0으로 만들어 다른 프로세스(혹은 쓰레드)가 접근하지 못하도록 막아야한다.
*/
mutex = 0;
}
void release() {
/* 임계 구역에서 나온 프로세스는 다른 프로세스가 접근할 수 있도록 락을 해제한다.*/
mutex = 1;
}
spin lock은 계속해서 사용가능한지 두드려보는것
- busy waiting이라고 한다. p.271
- 반복적으로 잠금 상태 확인
- run상태에서 계속 있는거
sleep - lock (sleep waiting)
- 스레드들이 wait(sleep)상태로 대기 하고 있음
- 그리고 그 대기열을 큐로 나타냄
SMP - 여러 프로세서가 하나의 메모리 공간을 공유하면서 동등하게 작업하는 아키텍쳐
메모리를 돌면서 동기화
6.6 Semaphores
- Mutex보다 좀 더 진화된 형태
- Semaphores에는 wait연산, signal 연산 두가지가 있다
- wait가 lock, signal이 unlock
- wait는 토큰을 획득하는 연산, signal은 토큰을 반납하는 연산
- p.273에서 S는 Semaphore 변수 ex) S=3 이면 스레드 3개 까지는 동시에 가능하다.
- busy waiting 방식
- Mutex는 S가 1인것 => Mutex는 Binary Semaphore라고 한다. 아니면 counting semaphore
- p.274
- 값을 하나빼고 S의 value값이 0보다 작으면 sleep상태에 들어감
- S가
semaphore의 spin lock
wait(S) {
while(S<=0);
S--;
}
Signal(S){
S++;
}
spin lock은 언제 유용할까
- smp나 multicore => cpu가 여러개 있을 때
- sleep(waiting)상태에 들어가면 context switching이 발생한다.
- 근데 context switching time이 만만치 않다.
- 그러느니 그냥 기다린다.
- 즉 락을 하고 언락 하는 주기가 짧으면 spin lock을 채용
semaphore의 sleep lock
typedef struct{
int value;
struct process *list;
} semaphore;
wait(semaphore *S){
S->value—; // 자원을 얻었으니 s를 1 줄인다.
if(S->value < 0){ // 자원을 다썼으면 이 프로세스를 리스트에 넣고 sleep한다.
add this process to S->list;
sleep();
}
}
signal(semaphore *S) {
S->value++; // 락을 푼다.
if (S->value <= 0) {
remove a process P fromS->list; //프로세스 P를 리스트에서 제거
wakeup(P); // P를 깨움
}
}
p.267
Test&Set Instruction
- 하드웨어적으로 하는 상호배제 방법
- 하드웨어적으로는 큐를 구현하기 힘들어서 spin - lock방법을 사용한다.
- 뭔말인지 모르겠다 gpt 찾아볼것
• ⁃ compare & swap => 가서 비교해보고 return되면 값에 따라서 기다리냐 아니냐
'[운영체제 정리]' 카테고리의 다른 글
Operating System Concepts 8장 Deadlock (2) | 2024.12.17 |
---|---|
Operating System Concepts 7장 Synchronization Example (2) | 2024.12.17 |
Operating System Concepts 5장 CPU Scheduling (2) | 2024.12.17 |
Operating System Concepts 4장 Threads & Concurrency (2) | 2024.12.17 |
Operating System Concepts 3장 Processes (1) | 2024.12.17 |