Post

프로세스 동기화란?

프로세스 동기화란?

핵심 내용 요약

  • 동기화의 개념: 동기화는 동시에 실행되는 프로세스들이 협력하여 올바르게 실행되고 자원의 일관성을 보장하는 기법입니다.
  • 실행 순서 제어: 프로세스가 올바른 순서대로 실행되도록 합니다.
  • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 합니다.
  • 임계 구역: 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역을 의미합니다.
  • 상호 배제 원칙: 상호 배제, 진행, 유한 대기를 포함한 세 가지 원칙으로 관리합니다.

동기화의 의미

동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고받으며 협력하여 실행될 수 있습니다.

예를 들어, 워드 프로세서에는 사용자로부터 입력을 받는 프로세스, 입력한 내용의 맞춤법을 검사하는 프로세스,
입력한 내용을 화면에 출력하는 프로세스 등이 있습니다.

이러한 프로세스들은 각기 다른 독립적인 프로세스이지만, 공동의 목표를 위해 협력합니다.

프로세스 동기화는 이들 프로세스들이 올바른 순서대로 실행되도록 하고,
동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하도록 하는 것을 의미합니다.

실행 순서 제어

동기화의 첫 번째 역할은 실행 순서 제어입니다.

예를 들어, Writer 프로세스가 Book.txt 파일에 값을 저장하고,
Reader 프로세스가 Book.txt 파일에서 값을 읽어 들이는 경우를 생각해보겠습니다.

Reader 프로세스는 Writer 프로세스가 값을 저장한 후에 실행되어야 합니다.

그렇지 않으면 Reader 프로세스가 값을 읽기 전에 Writer 프로세스가 값을 저장하지 않아
올바르지 않은 데이터를 읽게 될 수 있습니다.

상호 배제

동기화의 두 번째 역할은 상호 배제(mutual exclusion)입니다.
이는 공유 자원에 동시에 접근하는 것을 방지하는 기법입니다.

예를 들어, 두 개의 프로세스가 동시에 은행 계좌에 접근하여 돈을 입금하는 경우,
올바르게 동기화되지 않으면 잘못된 계좌 잔액이 저장될 수 있습니다.

공유 자원과 임계 구역

공유 자원

공유 자원(shared resource)은 두 개 이상의 프로세스가 동시에 접근하면 문제가 발생할 수 있는 자원을 의미합니다.

이는 전역 변수, 파일, 입출력 장치, 보조 기억 장치 등이 될 수 있습니다.

임계 구역

임계 구역(critical section)은 공유 자원에 접근하는 코드 중에서 동시에 실행하면 문제가 발생하는 코드 영역을 의미합니다.

두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 하나의 프로세스만 접근할 수 있어야 합니다. 임계 구역에 먼저 진입한 프로세스가 작업을 마치기 전까지 다른 프로세스는 대기해야 합니다.

상호 배제를 위한 동기화

상호 배제를 위해 운영체제는 아래 세 가지 원칙을 지켜야 합니다:

  • 상호 배제(Mutual Exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 진입할 수 없습니다.
  • 진행(Progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면, 진입하고자 하는 프로세스는 진입할 수 있어야 합니다.
  • 유한 대기(Bounded Waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 진입할 수 있어야 합니다. 무한정 대기해서는 안 됩니다.

예시: 생산자와 소비자 문제

생산자와 소비자 문제는 동기화 문제의 대표적인 예시입니다.

생산자는 버퍼에 물건을 넣고, 소비자는 버퍼에서 물건을 빼는 과정에서 총합이라는 데이터를 공유합니다.

동기화가 제대로 이루어지지 않으면, 예기치 않은 결과가 발생할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int sum = 0;

int main() {
    std::cout << "초기 합계: " <<  sum << std::endl;
    std::thread producer(produce);
    std::thread consumer(consume);
    producer.join();
    consumer.join();
   
    std::cout << "producer, consumer 스레드 실행 이후 합계: " <<  sum << std::endl;
    return 0;
}

void produce() {
    for(int i = 0; i < 100000; i++) {
        sum++;
    }
}

void consume() {
    for(int i = 0; i < 100000; i++) {
        sum--;
    }
}

이 코드를 동시 실행하면, 동기화가 이루어지지 않은 경우 총합이 잘못 계산될 수 있습니다.

sum++의 경우:
  temp = sum + 1;
  sum = temp;
의 과정을 거치기 때문에 중간에 문맥교환이 일어난다면 문제가 발생 할 수 있다.

하지만, PS로 얻은 지식덕에 ++sum은 괜찮다고 추측했고, 실행해보니 정상 작동했다. (큰 의미는 없다)

결론

프로세스 동기화는 운영체제에서 매우 중요한 개념으로,

프로세스들이 협력하여 올바르게 실행되고 자원의 일관성을 보장하는 데 필수적입니다.

이를 위해 실행 순서 제어와 상호 배제를 구현하며, 임계 구역 문제를 해결합니다.

확인 문제

  1. 동기화의 의미에 대한 옳은 설명을 다음 보기에서 찾아 쓰세요. (상호 배제, 실행 순서 제어, 임계 구역)
    (                         ) - 프로세스를 올바른 순서대로 실행하기.
    (                         ) - 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기.
  2. 임계 구역에 대한 설명으로 옳지 않은 것을 고르세요.
    - 임계 구역에서 여러 개의 프로세스가 동시에 실행해도 무방하다.
    - 임계 구역에서 여러 프로세스가 동시에 실행할 경우 레이스 컨디션이 발생합니다.
    - 임계 구역에서 실행되는 프로세스가 있다면 다른 프로세스는 기다려야 합니다.
    - 운영체제는 임계 구역을 관리합니다.
This post is licensed under CC BY 4.0 by the author.