OS

동기화

1space 2025. 6. 25. 09:50

혼자공부하는 컴퓨터구조 + 운영체제제책으로 공부한 내용을 정리한 글입니다.

동기화란

운영체제가 프로세스를 관리하는 서비스 중 중요한 두 가지는 스케줄링동기화입니다.

  • 앞에서는 "스케줄링"에 대해 공부했는데, 이제는 "동기화"에 대해 알아봅니다.
  • 즉, 여러 프로세스가 동시에 실행될 때 서로 영향을 주지 않도록 순서나 자원 접근을 조절하는 것이 동기화입니다.

 

동기화의 의미

현대의 컴퓨터 시스템은 여러 프로세스를 동시에 실행하는 구조입니다. 예를 들어:

  • 두 개 이상의 프로세스가 같은 데이터를 읽거나 쓸 수 있습니다.
  • 또는 한 프로세스가 수행하는 작업이 다른 프로세스에게 영향을 줄 수도 있습니다.

이때 발생할 수 있는 문제를 방지하기 위해 프로세스 간의 실행을 조율하는 방법, 즉 "동기화"가 필요합니다.

예를 들어:

  • 어떤 파일을 읽고 쓰는 프로세스가 있을 때, 먼저 쓰고 나중에 읽어야 하는데
  • 동시에 실행되면 읽는 프로세스가 잘못된 데이터를 읽을 수도 있습니다.

이처럼 두 프로세스가 어떤 순서로 실행되어야 하거나,
서로 동시에 같은 자원을 사용해서는 안 되는 상황에서, 운영체제는 동기화 기법을 제공합니다.

 

동기화가 필요한 경우

  1. 실행 순서 제어
    • 어떤 프로세스들이 순차적으로 실행되어야 할 때 순서를 조절하는 것
    • 예: 파일에 먼저 쓰고 그 다음 읽는 순서를 지켜야 할 때
  2. 상호 배제(Mutual Exclusion)
    • 둘 이상의 프로세스가 동시에 같은 자원을 사용하지 못하도록 제한하는 것
    • 예: 같은 변수나 파일을 동시에 접근하면 데이터가 꼬일 수 있으므로, 한 프로세스만 접근하게 해야 함

동기화는 단지 프로세스 간 순서를 조정하는 것뿐 아니라, 스레드(thread) 간의 실행 조정에도 매우 중요합니다.
특히 자바 같은 언어에서 멀티스레드 프로그래밍을 할 때 필수 개념입니다.

 

  • A, B, C, D 프로세스가 따로따로 있을 때, 서로 조율 없이 실행되면 경쟁 상태(race condition)가 발생할 수 있음
  • 동기화를 하지 않으면 각자 다른 순서로 실행되고, 결과가 달라질 수 있음

 

실행 순서 제어와 상호 배제 예시

🔸예제: Reader와 Writer 프로세스

  • Writer 프로세스는 Book.txt라는 파일에 데이터를 씁니다.
  • Reader 프로세스는 같은 Book.txt 파일에서 데이터를 읽습니다.
  • 이 두 프로세스가 무작위로 실행되면 어떤 일이 일어날 수 있을까요?

문제 상황

만약 Reader가 먼저 실행되어 쓰기 이전의 파일을 읽게 된다면, Writer가 쓴 정보가 반영되지 않은 잘못된 파일 상태를 읽게 됩니다.

  • 위쪽: Book.txt라는 공유 자원이 있고
  • 아래쪽 화살표: 좌측에서 Reader, 우측에서 Writer가 각자 이 파일을 접근

이처럼 두 프로세스가 같은 자원을 사용할 때, 동기화가 없으면 데이터의 일관성이 깨질 수 있습니다.

 

실제 실행 순서 비교

❌ 동기화가 이루어지지 않은 경우

 

동기화가 이루어진 경우

 

생산자와 소비자 문제

생산자와 소비자 문제란?

  • 운영체제에서 동기화가 필요한 대표적인 문제 상황 중 하나입니다.
  • 두 개의 프로세스가 존재합니다:
    • 생산자(producer): 데이터를 생성하여 버퍼에 넣습니다.
    • 소비자(consumer): 버퍼에서 데이터를 꺼내 소비합니다.

문제 발생 가능성

두 프로세스가 공유 자원인 버퍼(buffer)를 동시에 사용할 때 다음과 같은 문제가 발생할 수 있습니다:

  • 생산자가 데이터를 삽입하려고 하는데 버퍼가 가득 찬 경우
  • 소비자가 데이터를 꺼내려고 하는데 버퍼가 비어 있는 경우
  • 둘이 동시에 접근하여 데이터 손상이나 충돌이 생기는 경우
  • 이 문제는 공유 자원에 여러 프로세스가 접근할 때 발생하는 전형적인 동기화 문제입니다.
  • 따라서 동기화 기법을 통해 두 프로세스가 순차적으로 또는 서로 기다리며 자원에 접근하게 만들어야 합니다.

 

코드

생산자

생산자() {
    버퍼에 데이터 삽입
    "총합" 변수 1 증가
}

소비자

소비자() {
    버퍼에서 데이터 꺼내기
    "총합" 변수 1 감소
}

설명

  • 여기서 총합 변수는 버퍼에 현재 들어 있는 아이템의 수를 나타냅니다.
  • 생산자는 생산 후 총합을 증가시키고, 소비자는 소비 후 총합을 감소시킵니다.
  • 하지만 동기화가 없다면, 총합이 잘못 계산되거나 충돌이 발생할 수 있습니다.

 

공유 자원과 임계 구역

공유 자원 (Shared Resource)

  • 동시에 여러 프로세스가 접근하는 공동으로 사용하는 자원입니다.
  • 예시: 버퍼, 파일, 전역 변수 등

임계 구역 (Critical Section)

  • 공유 자원에 접근하는 코드 영역을 의미합니다.
  • 임계 구역 안에서는 한 번에 하나의 프로세스만 실행되어야 합니다.

임계 구역 문제 해결의 핵심

  • 두 개 이상의 프로세스가 동시에 임계 구역에 들어오면 데이터 일관성이 깨짐
  • 그래서 운영체제는 임계 구역 문제를 해결하는 기법을 갖고 있습니다.

레이스 컨디션 (Race Condition)

  • 두 개의 프로세스가 임계 구역을 서로 경합하듯 동시에 실행하려고 할 때 발생
  • 실행 순서에 따라 결과가 달라지는 비결정적 상황
  • 이 문제를 해결하려면 서로 번갈아 가며 임계 구역을 실행하게 해야 합니다.

총합 변수 증가/감소 예시 코드 분석

총합 1 증가 코드

r1 = 총합;      // 총합을 레지스터 r1에 복사
r1 = r1 + 1;    // r1 값을 증가
총합 = r1;      // 다시 메모리에 저장

총합 1 감소 코드

r2 = 총합;      // 총합을 레지스터 r2에 복사
r2 = r2 - 1;    // r2 값을 감소
총합 = r2;      // 다시 메모리에 저장

 

❗ 문제 상황 (동시에 실행될 때)

프로세스 A와 B가 동시에 총합을 수정하면?

→ 실제로는 한 번 증가, 한 번 감소해서 총합은 10이어야 하는데,
서로 엉켜버려서 총합이 9로 잘못 계산됨

 

동기화의 세 가지 조건 (상호 배제 해결 조건)

운영체제가 임계 구역 문제를 해결하기 위해 지켜야 할 세 가지 원칙이 있습니다:

상호 배제 (Mutual Exclusion)

  • 한 프로세스가 임계 구역에 진입했으면
  • 다른 프로세스는 절대 들어올 수 없다

진행 (Progress)

  • 어느 누구도 임계 구역에 들어가지 않은 상태일 때
  • 진입하고자 하는 프로세스가 있다면, 진입할 수 있어야 한다

유한 대기 (Bounded Waiting)

  • 한 프로세스가 임계 구역에 들어가고 싶어 할 때
  • 언젠가는 반드시 들어갈 수 있어야 한다
  • 즉, 무한정 기다리는 일이 생기면 안 된다

이 세 가지 조건을 만족해야만 진정한 의미의 동기화가 이루어졌다고 할 수 있습니다.

'OS' 카테고리의 다른 글

교착 상태  (0) 2025.06.26
동기화 기법  (0) 2025.06.25
CPU 스케줄링 알고리즘  (0) 2025.06.24
CPU 스케줄링 개요  (0) 2025.06.24
스레드  (0) 2025.06.24