CS/OS

[OS] Process Synchronization - 프로세스 동기화 (강의 내용)

JWonK 2023. 4. 28. 12:54
728x90
반응형

  • 공유하고 있는 데이터에 대해서는 데이터 일관성 문제가 발생할 수 있음
  • 공유 변수에 대한 접근을 순서화 해줄 필요가 있음
  • 'Consumer'와 'Producer'는 count라는 광역 변수를 공유하여 버퍼라는 데이터를 공유하는 프로세스

 

 

 

 

  • count라는 광역 변수를 사용하여 채우는 것

 

 

 

  • count 광역 변수를 사용하여 데이터를 소비하는 것

 

 

 

 

  • assembly 언어를 사용하여 표현할 수 있음 (위 Critical Section)
  • 어느 instruction이 마지막에 실행되냐에 따라 값이 변하는 현상 : Race Condition

 

 

 

 

  • Critical Section은 공유하고 있는 변수 사이 변경이 있을 때 많이 일어남
  • 따라서 Critical Section에 들어가는 process는 하나만 되도록 해야함
  • 그래서 위 과정 전에 entry section을 거쳐야함 -> critical section으로 값을 변경하고 -> 나오면서 exit secion을 통해 다른 process가 진행될 수 있도록 여지를 만들어줘야함

→ 공유하고 있는 변수를 변경하기 위해서는 critical section이 요구되는데 그 때 발생할 수 있는 데이터 일관성의 문제를 해결하기 위해 entry section과 exit section 과정이 필요하다.

 

 

 

  • Critical-Section을 해결하기 위한 3가지 조건
    • Mutual Exclusion : critical section에 어느 한 process가 들어가게 되면 다른 프로세스는 접근할 수 없다
    • Progress : 어느 한 프로세스가 critical section에 접근하고자 하면 그 사전과정이 뒤로 연장되서는 안된다. 여기서 사전과정이란, section에 접근할 수 있도록 해주는 과정
    • Bounded Waiting : 정해진 만큼만 기다리면 critical section에 들어갈 수 있도록 해줘야 함

[가정]

- 모든 프로세스는 실행되는데 어느 정도 시간이 걸린다

- 실행하는 데에 상대적인 속도로 가정한 것이 아무 것도 없다.

 

 

  • 두 개 프로세스 사이에서만 적용할 수 있음
  • LOAD와 STORE instructions은 atomic하다고 가정한다. 즉, interrupt되지 않는다.
  • 두 개 사이 turn(턴 교환 : 순서 의미)과 flag(준비 상태를 표현) 변수를 공유한다.

 

 

 

  • 두 가지 process가 경합하고 있는 과정
  • 위 코드가 3가지 조건을 모두 만족하는가? : 만족한다. 

조건 1 : turn (i or j)에 의해 만족

조건 2 : flag[i or j] = T or F에 의해 만족

조건 3 : flag가 변경과 while문 조건에 의해 만족

 

 

 

 

  • critical section 접근하고자 하는 n개의 프로세스에 우선순위 부여
  • 작은 우선순위인 process를 critical section 허용

 

 

  • choosing[i] = T : 우선순위 부여 받는 과정 중, F : 우선순위 부여 x

 

 

 

  1. choosing[i]가 T가 되어 우선순위 부여 상태 가능으로 등록
  2. 지금까지 발행된 우선순위 최대값 + 1 값으로 부여
  3. choosing[i] = F로 우선순위 부여 끝
  4. 다른 프로세스 우선순위 부여 상태 확인 
  5. 할당받은 번호가 0이 아니고 [우선순위 번호, process id값] 상태 확인으로 i보다 작은 값이 존재하면 while문에 걸려 no nothing이 된다.
  6. critical section 과정
  7. exit section으로 우선순위를 다시 0으로 전환

 

 

 

  • 하드웨어적 동기화 방법
  • 프로세스가 2개 일 때는 ciritical section 진입과 동시에 다른 interrupt 접근을 제한한다. 오직 하나의 process만 가능
    • 멀티프로세스에서는 비효율적
  • 현대에는 atomic - non-interruptable한 기능 제공
    • TestAndSet
    • Swap
  • 아래에서 설명

 

 

  • 초기의 target값 반환, 초기에는 false

 

 

 

  • 처음 *lock은 false여서 while문을 들어가게 되면 해당 target은 true로 된다. 그럼 Do noting상태가 되고 다음에 들어오는 것은 waiting해야한다. 이 상태를 Busy waiting or Spinlock이라고 한다. 
  • 작업이 끝나고 나오게 되면 lock을 FALSE로 하여 상태를 초기화한다.
  • Pj가 먼저 들어왔고, TestAndSet을 먼저 실행 함. 초기 값이 F였으니 while 통과, lock 값이 True로 변환, 간발의 차로 뒤늦게 들어온 Pi는 return값이 True, While문에 걸린다.
  • 조건 모두 만족? 멀티프로세스일 때는 Bounded Waiting 조건 만족 x
  •  

 

 

  • 초기 lock은 false, key라는 로컬 변수 가지고 있음
  • 위 코드는 하나의 프로세스만 표현
  • 오른쪽 시나리오보고 이해
  • 세 가지 조건 만족? - 멀티프로세스는 Bound waiting 보장 못함

 

 

728x90
반응형