데굴데굴

06. 프로세스 동기화 - 1 본문

CS/운영체제

06. 프로세스 동기화 - 1

aemaaeng 2023. 7. 4. 16:54

데이터가 저장되는 곳이 있고 데이터를 이용해 연산을 수행하는 곳이 존재
한 storage box를 여러 execution box가 사용하고 있다면 Race condition의 가능성이 있다.
이 상태를 조율해줄 수 있는 방법이 필요

Race condition이 발생하는 경우

1. 커널의 코드를 실행 중일 때 인터럽트가 발생할 경우

커널에서 데이터의 값을 1 증가시키는 작업을 하고 있음
도중에 인터럽트가 발생하여 인터럽트 핸들러를 실행함
인터럽트 핸들러에서 데이터의 값을 1 감소시키는 작업을 함
-> 예상: 값이 원래 상태로 돌아와야 한다 (1 증가 -> 1 감소)

 

커널에서 인터럽트 핸들러로 넘어갈 때 작업하던 상태를 저장해두고 넘어감
인터럽트가 끝나고 다시 돌아왔을 때 이전 작업 상태를 다시 불러오기 때문에 인터럽트 핸들러가 했던 1 감소시키는 작업은 반영되지 않고 데이터는 값이 1 증가된 채로 끝난다.

 

💡 해결법

커널에서 중요한 데이터를 다루고 있을 때 인터럽트가 들어오게 되면 커널의 작업이 끝날 때까지 인터럽트를 수행하지 않는다

2. 프로세스가 시스템 콜을 하여 커널 모드로 실행 중인데 context switch가 일어나는 경우

프로세스 a와 프로세스 b가 있음
프로세스 a가 커널 모드로 진입해 데이터의 값을 1 증가시키는 작업을 하고 있었음
도중에 context switch가 발생하여 프로세스 b에게로 cpu가 넘어감
프로세스 b 또한 커널 모드에서 동일한 데이터의 값을 1 증가시킴
프로세스 a가 cpu를 돌려받아 다시 작업 수행
-> 예상: 데이터의 값은 2 증가해야 한다

 

1번의 경우와 비슷하게 이전 작업 상태를 불러와 실행하기 때문에 프로세스 b에서 했던 작업은 반영되지 않은 채 값이 1 증가된 채로 끝난다.

 

💡 해결법
어떤 프로세스가 커널 모드에 있을 때에는 할당 시간이 끝나도 cpu를 선점당하지 않도록 함
할당 시간의 편차가 생길 수는 있지만 real-time system이 아니기 때문에 race condition에서 발생할 수 있는 문제를 쉽게 해결할 수 있다.

3. 멀티 프로세서 시스템의 공유 메모리 안의 커널 데이터

여러 cpu가 동일한 데이터를 다룰 때 위 1, 2번 경우처럼 해결할 수 없다

 

💡 해결법

  1. 한 번에 하나의 cpu만 커널에 접근할 수 있게 한다
  2. 커널 내부에 있는 각 공유 데이터에 접근할 때마다 lock, unlock을 수행한다 (more efficient)

 

데이터의 일관성을 유지하기 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘이 필요하다

The Critical-Section Problem

n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 경우

프로세스의 일반적인 구조는 아래와 같다.

각 프로세스의 code segment에는 공유 데이터에 접근하는 코드인 critical section이 존재한다. (=임계 구역)

한 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없음. 계속 기다려야 한다.

'CS > 운영체제' 카테고리의 다른 글

07. Deadlock  (0) 2023.07.12
06. 프로세스 동기화 - 2  (0) 2023.07.06
05. CPU 스케줄링  (0) 2023.06.29
04. 프로세스 관리 - 3  (0) 2023.06.27
04. 프로세스 관리 - 2  (0) 2023.06.25
Comments