본문 바로가기

Programming/OS[운영체제]

[OS/운영체제] Synchronization(동기화)

2024.09.16 - [Programming/OS[운영체제]] - [OS/운영체제] 공유자원 경쟁상태 (Synchronization 사전 지식)

 

[OS/운영체제] 공유자원 경쟁상태 (Synchronization 사전 지식)

동기화를 통해 여러 프로세스나 쓰레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 오류나 비정상적인 결과를 방지할 수 있습니다.Synchronization 포스팅에 앞선 선수 지식에 대한 포스팅입니

tete-all.tistory.com

공유자원 경쟁 상태에 대해서 아직 선수가 되어있지 않으신 분들은 이 글로!

 

1. Mutex(Mutual exclusion) - 상호배제

책 : 임계 영역(공유 자원)

크루 : 프로세스 또는 쓰레드

사서 : mutex lock

 

이라고 가정해보고 진행하겠습니다.

 

 

뮤텍스란 Mutual exclusion의 축약어 이고 한국어로는 상호 배제라 합니다.
하나의 프로세스가 임계 영역에 내에 있다면
프로세스의 동작이 끝날 때까지
 다른 프로세스가 임계 영역으로 들어올 수 없도록 제한하는 알고리즘입니다.

 

운영체제에서는 뮤텍스를 위해 Lock이라는 매커니즘(오른쪽 사진)을 제공하는데요,

크루1(프로세스1)이 사서(mutex lock)에게 책(임계 영역)에 접근하겠다는 의사를 밝히면
사서는 책을 이용하는 사람이 없는 것을 확인하고
크루1이 진입하는것을 허용하고 크루1은 lock을 겁니다.
 
크루2(프로세스2)가 사서(mutex lock)에개 책(임계 영역)에 접근하려고 의사를 밝히면
이미 책은 lock이 걸려있어서 접근할 수 없습니다.
 
크루1이 책을 다 읽으면 lock을 해제하면서 임계 영역을 빠져나갑니다.
이제 크루2가 임계 영역에 진입하고 lock을 겁니다.

 

이렇게 하나의 프로세스가 임계 영역에 lock이 걸려있는지 아닌지 검증하는 과정에서

Spin Lock이라는 성능 이슈 사항이 생기게 됩니다.

 

2. Spin Lock (스핀락)

 

앞서 하나의 프로세스가 임계 영역에 접근할 때 lock을 건다고 말씀드렸습니다.

다른 프로세스가 임계 영역에 접근할 때 lock이 걸려있는지 걸려있지 않은지 확인하는

while(락이_이미_걸려있다면()) 을 계속 실행하게 될 것입니다.

lock이 풀릴 때서야 반복문을 탈출 할 수 있게 됩니다.

 

사서는 여러명의 크루들이 임계 영역에 접근하려고 할 때

그 요청들에 대해서 반복해서 응답을 해줘야하는 이슈가 발생하게 됩니다. 

 

3. 다른 방식의 lock

spin lock 이슈를 해결하고자 다른 방식을 lock을 이용할 수도 있습니다.

 

크루1이 전과 같이 임계 영역에 접근하고 lock을 걸고
크루2가 임계 영역에 접근하려고 lock을 확인한 후 
lock이 걸려있으면 대기실에 간 후 크루2는 대기실에 가서 잠(block)을 취합니다.
 
크루1이 임계 영역을 벗어난 후 크루2는 잠(block)에서 깨는 약간의 시간 (ready)후 
Context switch를 한 후 임계 영역에 접근할 수 있게 됩니다.

 

오른쪽의 코드를 보면 while문이 아니라 if 문이 있는것을 확인하실 수 있지요!

while 반복문을 돌지 않으니 이 방식이 스핀 락의 경우보다 더 낫다고 생각하실 수 있는데요

 

만약 공유 자원 사용시간이 Context switch시간 보다 짧다면 스핀 락의 경우가 더 나은 성능을 발휘할 수 있습니다.

스핀 락의 경우 계속해서 lock이 걸린지 확인하는데 그 소요시간이 

block -> ready -> context switch 시간보다  짧다면 스핀락을 이용하는게 낫겠지요

 

4. Semaphore (세마포어)

 

세마포어의 경우 여러권의 책(임계영역)을 관리할 수 있습니다.

 

또한 장부에는 읽을 수 있는 책의 갯수(bookCount), 대기자 명단이 있습니다.

하나의 크루가 임계영역에 접근할 때마다 bookCount는 -1이 감소하게 됩니다.

크루1이 사서에게 의사를 밝히면 
사서는 bookCont숫자를 확인하고 0보다 크니 들여보냅니다.
bookCount가 0일 때
크루6은 임계 영역에 들어가지 못하고 대기실로 보내지고 잠이 들게 됩니다. 이 때도 bookCount는 -1 감소합니다.
 
임계영역에서 동작을 완료한 크루1이 빠져나가면 bookCount가 +1 증가합니다.
사서는 대기실에서 크루6을 깨우고 임계 영역에 들여보냅니다.

 

즉, bookCount를 확인하면서 공유 자원의 접근을 관리하고 대기자 명단을 통해 다음에 접근할 수 있는 프로세스를 확인할 수 있습니다.

 

 

 

  • 공유_자원의_수 : bookCount
  • sem_wait.   : 임계 영역에 접근 시 실행 / 진입 여부 확인 / bookCount -1
  • sem_signal : 임계 영역을 벗어날 시 실행 / bookCount +1