컴퓨터 구조 & 운영체제/운영체제

[운영체제] 프로세스와 스레드의 동기화 개념

ReBugs 2023. 7. 2.

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


동시다발적으로 실행되는 프로세스와 스레드들은 공동의 목적을 수행하기 위해 서로 협력하며 영향을 주고받기도 한다.

이렇게 협력하여 실행되는 프로세스와 스레드들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화가 되어야 한다.

프로세스 동기화란 프로세스 사이에 동기화를 하는 것을 말한다. 현재는 대부분 쓰레드 기준으로 문맥 교환이 일어나기 때문에 스레드 동기화라고도 불린다.

이 글에선 동기화의 전체적 개념을 다루므로 프로세스 동기화와 스레드 동기화의 개념을 구분 짓지 않았으면 좋겠다.

프로세스뿐만 아니라 스레드도 동기화 대상이다.
정확히 말하면 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.
이 글에서는 대부분의 전공서 표현에 따라 프로세스 동기화라고 칭하겠다.

 

 

동기화(Synchronization)의 의미

프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미한다.

프로세스들 사이의 수행 시기를 맞추는 것은 크게 아래 두 가지를 일컫는다.

  • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
  • 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

즉, 동기화에서는 실행 순서 제어를 위한 동기화가 있고, 상호 배제를 위한 동기화가 있다.

 

실행 순서 제어를 위한 동기화 : reader writer problem

예를 들어, 아래와 같은 프로세스가 있다고 가정하자

  • Writer : Book.txt 파일에 값을 쓰고 저장하는 프로세스
  • Reader : Book.txt 파일에 저장된 값을 읽어들이는

두 프로세스는 무작정 아무 순서대로 실행되어서는 안 된다.

Reader 프로세스는 Writer 프로세스 실행이 끝나야 비로소 실행할 수 있기 때문이다.

Writer 프로세스가 Book.txt에 값을 저장하기도 전에 Reader 프로세스가 Book.txt를 읽는 것은 올바른 실행 순서가 아니다.

->Reader 프로세스는 Book.txt 안에 값이 존재한다는 특정 조건이 만족되어야만 실행 가능

 

상호 배제(mutual exclusion)를 위한 동기화 : Bank account problem

상호 배제는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다.

즉, 한 번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화이다.

 

예를 들어, 현재 계좌의 잔액은 10만 원이 있고, 아래의 프로세스가 있다고 가정하자

  • 프로세스 A : 현재 잔액에 2만 원을 추가하는 프로세스
  • 프로세스 B :  현재 잔액에 5만 원을 추가하는 프로세스

프로세스 A와 B가 실행되는 과정은 아래와 같다.

이제 프로세스 A와 B가 동시에 실행되었다고 가정한 상태에서 동기화가 제대로 이루어지지 않은 경우에는 17만 원이 계좌에 남지 않을 수 있다.

이유는 아래와 같다.

문맥 교환 과정에서 A프로세스의 실행 과정에서 더한 값을 저장하기 전에 문맥 교환이 일어나서 12+5가 아니라 10+2라는 연산이 이뤄졌다.

즉, A프로세스의 실행 과정이 완전히 끝나기 전에 B프로세스가 시작되었기 때문이다.

 

동기화가 이루어진 상태에서 A프로세스와 B프로세스가 실행되었다고 가정하면 실행 과정은 아래와 같다.

 

이렇게 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화이다.

 


 

공유 자원과 임계 구역

위의 상호 배제를 위한 동기화에서 '잔액'이라는 공동의 자원을 두고 작업을 했다 이러한 자원을 공유 자원이라고 한다.

또한, 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역이라고 한다.

  • 공유 자원(shared resource) : 여러 프로세스 혹은 스레드가 공유하는 자원(전역 변수, 파일, 입출력장치, 보조기억장치 등)
  • 임계 구역(critical section) : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있다. 이를 레이스 컨디션(race condition)이라고 한다.

 

운영체제는 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.

  • 상호 배제(mutual exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행(process) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기(bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안 된다)

레이스 컨디션이 발생하는 근본적인 이유

우리가 프로그래밍하는 고급 언어는 실행 과정에서 저급 언어로 변환되어서 실행된다.

변수를 증가 또는 감소시키는 코드는 고급 언어에서는 한 줄로 작성할 수 있지만, 컴퓨터 내부에서는 여러 줄의 저급 언어로 변환되어 실행된다.

 

컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어날 수 있다.

저급 언어를 실행하는 과정에서 문맥 교환이 일어난다면 아래와 같은 문제가 발생한다.

 

이때, 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계구역에 동시에 접근하지 못하도록 관리하는 것을 의미한다.

댓글