오래 못 할 짓 하지 않기

[ 운영체제 ] 14. 동기화 (Synchronization) 본문

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

[ 운영체제 ] 14. 동기화 (Synchronization)

쫑알bot 2024. 4. 19. 15:33
728x90

Synchronization

● 배경

Process가 서로 communication 하는 법으로는

 

- Message passing

- Shared memory

 

두 가지가 있다.

 

이런 경우에는 주로 Shared memory에서 Conflict 가 생기는데

그에 대해 대표적인 예시가 Producer - consumer problem이다.

 

● Interleaved problem

                                                                     "나뭇잎 사이사이에 뭐가 들어온다."

 

 

 

이 흐름은 저번에 했음.

 

주의해서 봐야하는 건 Produer와 Consumer에 있는 counter ++ , -- 이다.

 

▼ 저걸 Assembly Language로 바꿔보면 다음과 같다.

 

근데 만약에 counter ++ 관련 3개의 줄에서

 

만약 2번째 줄에서 context switch가 일어난다면 어떻게 될까?

 

 

만약 counter = 5 로 시작했다고 가정해보자.

 

< Producer >

P1 : reg1 에 5를 담음
P2 : reg1 의 값에서 1을 더함 (reg1 == 6)

'>>아직 counter값은 업데이트 X라서 counter == 5임.'


< Consumer >

C1 : reg2 에 5를 담음 
C1 : reg2 의 값에서 1을 뺀다 (reg2 ==4)

'>>counter 값 업데이트 X couter ==5'

< 다시 Producer >
P3 : Counter에 reg1 값을 넣는다.
    '>> Counter == 6'
    
    
< 다시 Consumer >
C3 : Counter에 reg2 값을 넣는다.
    '>> Counter == 4'

 

 

생각해보면 Counter ++,-- 한 번씩 하면 그대로 5여야 하는데 4 or 6 이 나온다.

 

 

● Interleaved problem

 

어디서 context swich가 일어나냐에 다라 결과가 달라진다.
실행 순서에 따라 결과가 달라진다.

 

● 원인 

경쟁상태 : 여러 프로세스가 같은 데이터를 동시에 접근하고 수정하려고 하는 상황

 

 

 

 

● 해결법

Only one process can access and maipulate the data at a time

 

 

 


The Critical Section Problem

 

 

프로세스들은 Critical section이란 걸 가지고 있다.

이는 Shared Data나 정보들을 수정하는 부분이다. 

 

그래서, 이 때 섞이지 않아야 하므로

Critical Section에 하나의 프로세스가 들어가면, 다른 process는 들어가서는 안 된다.

 

 

따라서, Critical Section problem의 해결법은

Process가 Share data 에 대해 같이 일을 할 때, 동기화 하는 구조를 디자인하는 것이다.

 

 

● Process의 구조

 - Entry section : Critical section 로 들어가기 위한 Permsion Request

 

 - Critical section : Shared resources 를 다루는 곳

 

 - Exit section : Critical  section에서 나간다고 알리는 곳

 

 - Critical section : Shared resources 를 다루지 않는 곳 

 

 

 


Critical Section Problem 에 대해 필요한 것

 

● Mutual Exclusion (상호 배제)

: 하나의 Process가 Critical section에서 돌아가고 있으면, 다른 Process는 거기서 작업 X

 = 하나의 Process만 Ciritcal section에서 동작할 수 있다.

 

● Progress ( Deadlock 있으면 X )

: crtical section에 실행되는 게 없는데 critical 에 들어가려고 하는 상황이면

  process가 무기한으로 기다려줄 수 없음. 

 

(뒤에 누가 기다리고 있으면 적당히 하다가 나와야 함)  

 

이런 상황이 있으면 안 됨

 

ex) 얘들아 이거 하자


A: B하면 함

B : C하면 함

C : A하면 함

 

서로가 서로를 기다리고 있음

 

 

● Bounded Waiting ( 횟수 제한 )

: Process들이 Critical section에 몇 번 들어갈 수 있는지 횟수를 정해두어야 한다.

(Critical section으로 입장을 신청하고 받아들여지는 사이에 확인되어야 함)

 

 

 



 

Critical  - Section

Os 가

 

i) Non - Preemptive 

 - 비선점이면 프로세스가 작업하는 중에 빼앗길 일이 없다.

  > Context switch 생기지 않음

  > Race condition 에서 자유롭다.

 

ex) 내가 count ++ 이거 다 끝낼 때까지는 count -- 관련된 놈 실행이 안 된다.

 

근데 비선점이면 OS가 유연하게 돌아가거나 빨리 끝내야하는 걸 끝내는 게 잘 안 됨

 

ii) Preemptive 

 - 선점 가능될 수 있음

 > 근데 그 이외 기능들 때문에 장점이 더 많음

 > real-time process 에 적합하다.

 

 

 

(출처)

한동대학교 고윤민교수님 - 운영체제