[운영체제] 프로세스 동기화: race condition, critical section, mutual exclusion

·2024년 7월 1일
0

운영체제

목록 보기
4/10

하나의 목적을 가지고 동시다발적으로 수행되는 프로세스는 서로 영향을 준다.

이런 프로세스를 Cooperating Process 라고 부른다.

서로 영향을 주다 보니, 공유하고 있는 데이터에 대해 동시에 접근할 경우 의도하지 않은 데이터 불일치가 발생할 수 있다.

따라서 프로세스 동기화(Process Syncronization)가 필요하다.


프로세스 동기화는

프로세스의 실행 순서를 알맞게 제어하고, (실행 순서 제어)
동시에 접근할 수 없는 자원에 하나의 프로세스만 접근하여 데이터의 일관성을 유지하도록 하는 과정이다. (mutual exclusion)


실행 순서 제어

Book.txt 파일에 값을 저장하는 Writer 프로세스와
Book.txt 파일의 값을 읽는 Reader 프로세스가 존재한다고 가정해 보자.

우리가 원하는 값을 저장하고, 후에 그 값을 읽어들이는 것이 당연한 과정이다.

따라서 Reader 프로세스는 Writer 프로세스가 실행되어
Book.txt 파일 안에 값이 존재해야만 실행되어야 한다.

이처럼 프로세스를 올바른 순서대로 실행하기 위해 실행 순서 제어가 필요하다.


mutual exclusion

mutual exclusion을 잘 보여주는 고전적인 예시가 있다.

Producer-Consumer 문제

  • 생산자: 제품을 계속해서 생산
  • 소비자: 제품을 계속해서 소비
  • 생산자와 소비자는 제품의 총합 데이터를 공유
생산자() {
		버퍼에 데이터 삽입
		총합 += 1
}
소비자() {
		버퍼에서 데이터를 빼냄
		총합 -= 1
}

물건이 처음에 10개 있다고 가정을 하고,
생산자와 소비자가 각각 100000번 실행되었을 때, 그대로 10개가 남아 있을까?


아마 그렇지 않을 수도 있다.

앞서 말한 것처럼, 프로세스들이 제대로 동기화되지 않았기 때문이다.

소비자가 생산자의 작업이 끝나기 전에 총합을 수정한다면??????
생산자가 소비자의 작업이 끝나기 전에 총합을 수정한다면??????! 💦

동시에 접근해서는 안 되는 자원(총합)에 동시에 접근했기 때문에 이런 문제가 발생한다.

따라서 mutual exclusion은 통해 동시에 접근할 수 없는 자원에는 하나의 프로세스만 접근할 수 있도록 하는 것이다.


공유 자원

여러 프로세스들이 공유하는 자원을 공유 자원 이라고 한다.
공유 자원 중에는 동시에 실행해서는 안 되는 자원이 존재한다.
(ex. 위의 producer-consumer 문제의 총합)


Critical Section(임계 구역)

  • 동시에 실행해서는 안 되는 자원에 접근하는 코드 영역을 critical section 이라 부른다.
  • 이 영역에서는 하나 이상의 프로세스가 실행될 수 없다.
  • 따라서 두 개 이상의 프로세스가 critical section에 진입하고자 하면, 하나는 대기해야 한다.
  • 실행 중이던 프로세스의 작업이 마무리되면 대기 중이던 프로세스가 critical section 에 진입한다.

Race Condition

  • 잘못된 실행으로 여러 프로세스가 critical section 의 코드를 실행한 경우
  • 데이터의 일관성이 깨진다

생산자가 총합에 1을 더하는 경우를 풀어서 써 보면

r1 = 총합
r1 = r1 + 1
총합 = r1

마찬가지로 소비자가 총합에서 1을 빼는 경우를 풀어서 써보면

r2 = 총합
r2 = r2 - 1
총합 = r2

각각의 코드 한 줄이 실행되는 도중 context switching이 일어난다면 race condition이 발생한다.


mutual exclusion을 위한 동기화의 3가지 조건

mutual exclusion

한 프로세스가 critical section에 진입했다면, 다른 프로세스는 critical section에 진입할 수 없다.

progress

critical section에 어떤 프로세스도 진입하지 않았다면, critical section에 들어가고자 하는 프로세스는 들어갈 수 있어야 한다.

bounded waiting

한 프로세스가 critical section에 들어가고 싶다면, 언젠가는 critical section 에 진입할 수 있어야 한다.
== 프로세스가 critical section에 진입하기 위해 무한정 대기해서는 안 된다.



Reference

혼자 공부하는 운영체제

0개의 댓글

관련 채용 정보