Operating System Concepts 6장 Synchronization Tools

[운영체제 정리] · 2024. 12. 17. 17:26

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되면 값에 따라서 기다리냐 아니냐