이 포스트는 한빛미디어에서 진행하는 혼공학습단 13기에 참여한 후 작성했습니다.

동기화

프로세스 동기화란, 프로세스들 사이의 수행 시기를 맞추는 것이다. 이런 프로세스 동기화에는 2가지 종류가 있다.

실행 순서 제어를 위한 동기화

예를 들어, Book.txt라는 파일에 값을 저장(Write)하는 프로세스와 Book.txt의 내용을 조회(Read)하는 프로세스를 서로 동시에 실행하면 안된다. 반드시 Write 프로세스가 먼저 실행되고, Read 프로세스가 먼저 실행되어야 제대로 프로세스가 실행된다.

상호 배제를 위한 동기화

**상호 배제(Mutual Condition)**는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘이다. 예를 들어, 같은 계좌에 동시에 입금할 경우, 어느 한 프로세스의 결괏값을 저장하기 전에 다른 프로세스가 잔액을 읽어 들이고 값을 저장하려고 한다면 엉뚱한 금액이 저장될 것이다. 이 문제를 해결하기 위해 상호 배제를 위한 동기화가 필요하다.

가장 유명한 예시는 생산자와 소비자 문제(Producer-Consumer Problem)이다. 이런 문제 상황들이 발생하는 이유는 동시에 접근해서는 안 되는 자원(공유 자원)에 동시에 접근했기 때문이다.

공유 자원과 임계 구역

공유 자원과 임계 구역 (출처: 혼자 공부하는 컴퓨터 구조+운영체제 p.346)

공유 자원과 임계 구역 (출처: 혼자 공부하는 컴퓨터 구조+운영체제 p.346)

**공유 자원(Shared Resource)**은 2개 이상의 프로세스를 동시가 실행되면 문제가 발생한다는 특징이 있다. 이러한 공유 자원은 전역 변수, 파일, 입출력장치, 보조기억장치 등이 될 수 있다.

**임계 구역(Critical Section)**은 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역이다. 또, 잘못된 실행에 따라 여러 프로세스가 동시다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있는데, 이를 **경쟁 조건(Race Condition)**이라고 한다.

**경쟁 조건(Race Condition)**이 발생하면 데이터 일관성이 지켜지지 않는 문제가 발생한다. 그렇다면 이러한 경쟁 조건이 발생하는 근본적인 이유는 무엇일까?