← Blog로 돌아가기

2026년 4월 21일 · 조회수 0

CS / OS

[OS] 4. 프로세스 동기화

본 글은 인프런 강의를 바탕으로 정리한 개인 학습 기록입니다.
출처: <그림으로 쉽게 배우는 운영체제>



목차

1. 프로세스 간 통신
2. 공유자원과 임계구역
3. 세마포어
4. 모니터



1. 프로세스 간 통신


1) 메시지 전달 방식

  • 프로세스들이 메모리를 공유하지 않고 데이터를 주고받는 방식
  • 운영체제가 제공하는 통신 수단을 이용함

파이프

  • 운영체제가 만든 통로를 통해 데이터 전달
  • 스트림 형태의 단방향 통신
  • 송신 프로세스와 수신 프로세스가 동시에 실행되어야 함

메시지 큐

  • 보낸 데이터를 큐에 저장해 두었다가 받는 프로세스가 꺼내 감
  • 두 프로세스가 동시에 실행되지 않아도 됨
  • 양방향 통신 가능

소켓

  • 클라이언트-서버 방식으로 통신
  • 같은 컴퓨터뿐 아니라 네트워크를 통해 다른 컴퓨터와도 통신 가능
  • 양방향 통신 가능

2) 공유 메모리 방식

  • 여러 프로세스가 같은 메모리 영역을 함께 사용하는 방식
  • 데이터를 직접 읽고 쓸 수 있어 빠를 수 있음
  • 하지만 동시에 접근하면 문제가 생길 수 있음

3) 동기화 문제

  • 공유 메모리를 여러 프로세스나 스레드가 함께 사용하면 충돌이나 오류가 생길 수 있음
  • 이런 문제를 동기화 문제라고 함
  • 해결을 위해 다음과 같은 도구를 사용함
    • 세마포어
    • 뮤텍스
    • 모니터

4) 기타 IPC 방식

  • 시그널
  • 파일
  • RPC(원격 프로시저 호출)


2. 공유자원과 임계구역


1) 공유자원

  • 여러 프로세스나 스레드가 공동으로 사용하는 자원
  • 예:
    • 변수
    • 파일
    • 메모리 공간

2) 동기화 문제

  • 공유자원에 여러 작업이 동시에 접근하면 실행 순서에 따라 결과가 달라질 수 있음
  • 시분할 처리와 컨텍스트 스위칭 때문에 어떤 작업이 먼저 실행될지 예측하기 어려움

3) 경쟁조건

  • 여러 프로세스가 공유자원을 차지하려고 경쟁하면서 결과가 실행 타이밍에 따라 달라지는 현상
  • 이런 상황을 경쟁조건(Race Condition) 이라고 함

4) 임계구역

  • 공유자원에 접근하는 코드 중 동시에 실행되면 안 되는 부분
  • 이 구간에서는 한 번에 하나의 프로세스만 실행되어야 함

5) 예시

  • 현재 체력: 20
  • 두 작업이 동시에 실행됨
    • 공격: 체력 감소
    • 물약: 체력 증가

문제 상황

  • 공격 코드가 체력 20을 읽음
  • 중간에 물약 코드가 실행되어 체력을 70으로 바꿈
  • 다시 공격 코드가 예전 값 20을 기준으로 계산해 체력을 10으로 바꿈

결과

  • 기대값: 60
  • 실제값: 10
  • 원인: 같은 공유자원인 체력을 동시에 다뤘기 때문

6) 임계구역 문제 해결 조건

  • 동시에 임계구역에 들어갈 수 있는 프로세스는 1개만 허용
  • 여러 프로세스가 들어가려 하면 오직 하나만 진입
  • 임계구역에 들어간 프로세스는 가능한 빨리 나와야 함


3. 세마포어


1) 세마포어란

  • 세마포어는 정수형 변수
  • 현재 사용할 수 있는 자원의 개수를 의미함

2) 왜 필요한가

  • 여러 프로세스가 같은 공유자원에 동시에 접근하면 결과가 섞이거나 잘못될 수 있음
  • 이런 문제를 경쟁 조건이라고 함
  • 세마포어는 이런 동시 접근을 막아 줌

3) 기본 연산

  • wait()

    • 자원을 사용하려고 할 때 호출
    • 세마포어를 하나 얻을 수 있으면 진입
    • 없으면 기다림
  • signal()

    • 자원 사용이 끝났을 때 호출
    • 세마포어를 반납
    • 기다리던 다른 프로세스가 사용할 수 있게 함

4) 동작 예시

  • 공유자원: 체력 변수 1개
  • 세마포어 초기값: 1

흐름

물약 코드가 `wait(s)` 호출
세마포어를 얻고 임계구역 진입
공격 코드는 `wait(s)`를 호출하지만 세마포어가 없어서 대기
물약 코드가 작업을 마치고 `signal(s)` 호출
세마포어가 반납되면 공격 코드가 진입
공격 코드도 작업 후 `signal(s)` 호출

5) 대기 큐

  • 세마포어를 얻지 못한 프로세스는 대기 큐에서 기다림
  • 자원이 반납되면 대기 중인 프로세스가 차례로 실행됨

6) 카운팅 세마포어

  • 세마포어 값이 꼭 1일 필요는 없음
  • 공유자원이 여러 개라면 그 개수만큼 설정 가능
  • 예:
    • 프린터가 2대면 세마포어 값도 2
  • 이렇게 여러 개의 자원을 관리하는 것을 카운팅 세마포어라고 함

7) 한계

  • wait()signal()을 잘못 사용하면 오류가 생길 수 있음
  • 즉, 사용법이 복잡하면 실수할 가능성이 있음


4. 모니터


1) 모니터

  • 상호배제를 위한 동기화 메커니즘
  • 한 번에 하나의 스레드만 임계구역에 들어가게 함
  • 세마포어보다 사용이 더 단순함

2) 자바의 synchronized

  • 자바에서는 모니터를 synchronized 키워드로 구현함
  • synchronized가 붙은 메서드나 블록은 동시에 여러 스레드가 실행할 수 없음

3) 동작 방식

  • 어떤 스레드가 synchronized 메서드에 들어가 실행 중이면
  • 다른 스레드는 같은 객체의 다른 synchronized 메서드에도 바로 들어갈 수 없음
  • 즉, 한 번에 하나만 실행되도록 막아 줌

4) 예시

  • health라는 공유 변수가 있음
  • increase()decrease() 메서드에 synchronized를 붙임

댓글

댓글을 불러오는 중...

[OS] 4. 프로세스 동기화 | YEOWON'S PORTFOLIO