오래 못 할 짓 하지 않기

[ 운영체제 ] 16. Sychronization tool 본문

3학년 1학기/운영체제 (OS)

[ 운영체제 ] 16. Sychronization tool

쫑알bot 2024. 5. 6. 22:49
728x90

Sychronization 의 개념이나 필요한 기술들을 알아봤다.

 

이젠 어떤 Tool들이 있는지 알아보자.

크게 나누면 4가지가 있다.

 

● Mutex Locks

● Semaphores

● Monitors

● Liveness

 

 

● Mutex Locks

Mutex = Mutual Exclusive

 

▶ 특징 : 가장 간단한 방법이다.

 

▶ 모든 프로세스가 공유하는 하나의 열쇠의 역할을 하는 변수를 만들고

    Critical section에 진입할 때 열쇠를 받고, 나올 때 열쇠를 반납하는 개념이다.

 

 

열쇠를 받을 땐 acquire 함수를 사용한다.

Critical section에 들어갈 때는 열쇠를 false로 바꿔서

다른 프로세스들이 사용하지 못하게 한다.

 

반대로 열쇠를 반납할 땐 release 함수를 사용하여 

다른 프로세스들도 열쇠를 사용할 수 있게 한다.

 

 

각각의 함수는 Atomic하게 수행되어야 하고

함수 내부에서 중단되어 Context switch가 일어나면 안 된다.

https://velog.io/@moonheekim0118/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%AE%A4%ED%85%8D%EC%8A%A4%EC%99%80-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4

 

▶ 한계

  acquire 에 열쇠가 release될 때까지 묶여있는 Spinlock 꼴이 날 수가 있다.

  Busy waiting을 일으키는 Mutex Lock = Spinlock

 

 Busy waiting 안 하는 방법으로는 Waiting queue에 보내는 게 있는데

 context Switch 비용때문에 조금 난감

 

 

 

● Semaphore
수기 신호

Mutex Lock보다는 더 정교한 방법이다.

 

S라는 Integer 를 만들고, 이는 Critical section에 들어갈 수 있는 Process의 개수를 나타낸다.

 

참고할 건 , Process가 여러 개 있을 때 실행 순서를 보장하지는 않는다. 

Mutual Exclsion을 위한 Tool이다.

 

 

 

 

엘레베이터라고 생각하면 될 것 같다.

 

Wait ▶ 탄다.

= While ( 탈 자리 없으면 기다림 ) ; 
    내가 탔으니 탈 수 있는 자리 -1

 

Signal ▶ 내린다.

= 탈 수 있는 자리 +1

 

 

 

근데 이것도 Spinlock이 걸린다. 근데 순서는 어느정도 보장함

 



 

▶ 해결책 

 Sleep으로 Waiting queue에 보내버리기

 

 

 

우선 Semaphore를 위한 구조체를 만들어서, 그 안에 Waiting queue와, S = value를 만든다.

 

 

- Wait에 있던 반복문 →  Sleep으로 Queue에 넣는다.

- Signal에서는 Wake로 Queue에서 빼온다.

 

Semaphore 도 Atomically 하게 실행되어야 한다.

 


모니터

https://min-h-study-review.tistory.com/250

 

세마포 방법은 사용자가 다루기 번거롭다는 단점이 있다. 

 

 

모니터는 동기화를 위한 Higher level 프로그램으로

상호배제 / 순서제어 를 위해 사용된다.

 

 [ 상호 배제 ] 

공유 자원을 사용하려고 하려는 프로세스와 Thread는 

반드시 모니터 Interface를 통해서 자원에 접근해야 한다.

 

해당 Interface를 위한 Queue가 있고, 이를 통해 공유 자원으로 들어간다.

 

 

 

이렇게 제공받은 기능을 통해 상호 배제가 보장되므로 우리는 이를 신경쓰지 않아도 된다. 

 



 [ 순서 제어 ] 

모니터는 공유자원을 사용하려고 하는 Process 나 Thread 에 대해서 

조건 변수를 사용하여 실행순서를 제어한다.

 

조건 변수에 대한 큐는 상호 배제를 위한 큐와 구분된다.

 

 

왼쪽에 있는 상호배제를 위한 큐가 4 3 2 1 로 이름이 붙어있다고 가정하자.

 

2번 프로세스가 1번 프로세스보다 먼저 실행되어야 하지만, 큐에서 순서를 바꿀 수는 없다. 

이 때 1번이 조건 변수 x혹은 y 큐에 들어가서 길을 비켜준다.

그런 다음 1이 비킨 공간으로 2가 공유 자원에 먼저 접근하여 실행하고, 

1은 조건 변수 큐에서 대기하다가 signal이 오면 공유 자원에 접근하여 연산을 실행한다.

 

 

 

(출처)
1. 
유튜브 한빛미디어



2.

https://velog.io/@moonheekim0118/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%AE%A4%ED%85%8D%EC%8A%A4%EC%99%80-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4