alt

4주차

Shared on April 16, 2026

병렬 프로세싱과 동기화 개념

개요

  • 목적: 시퀀셜 코드에서 병렬 실행을 가능하게 하는 선행 그래프포크‑조인 모델을 소개하고, 공유 자원을 안전하게 다루는 상호 배제생산자‑소비자 문제를 해결하는 방법을 설명한다.
  • 대상: 운영체제·병렬 프로세싱 수업에서 사용되는 핵심 개념을 빠르게 복습하고자 하는 학습자.

핵심 개념

용어정의핵심 포인트
선행 그래프 (Precedence Graph)명령어 간의 실행 순서를 지시하는 방향 그래프- 사이클이 있으면 순서 모순 발생 → 비순환 그래프가 필요
포크‑조인 (Fork‑Join)프로세스를 분기(포크)하고, 다시 합성(join)하는 패턴- 병렬 블록(parallel)과 조인(join) 명령어 사용<br>- join은 특정 수의 프로세스가 끝날 때까지 대기(예: join 2)
상호 배제 (Mutual Exclusion)공유 자원에 한 번에 하나의 프로세스만 접근하도록 보장- 임계 영역(critical section) 사용<br>- 자물쇠·키 방식으로 구현
프로듀서‑컨슈머 (Producer‑Consumer)생산자와 소비자가 공유 버퍼를 이용해 데이터를 교환- 순환 버퍼(모드 연산 활용)<br>- 버퍼가 가득/비어 있을 때 동기화 필요

상세 내용

1. 선행 그래프

  • 정의: 명령어 간의 선후 관계를 표현한 방향 그래프.
  • 특징:
    • S1, S2는 병행 가능 → 동시에 실행 가능.
    • S3S1, S2가 끝난 뒤 실행.
    • S5, S6S4 이후에 실행.
    • S7S5, S6, S3이 모두 끝난 뒤 실행.
  • 사이클 방지: 그래프에 순환이 있으면 선행 관계가 모순 → 비순환이 필수.

2. 포크‑조인 모델

  • 포크 (Fork):
    • 부모 프로세스가 자식 프로세스를 생성.
    • fork L1 같은 명령으로 같은 코드 흐름을 두 프로세스에 복제.
  • 조인 (Join):
    • 지정된 수의 프로세스가 끝날 때까지 대기.
    • 예: join 2 → 두 프로세스가 끝날 때까지 기다림.
    • 내부 구현: count를 감소시키며 0이 되면 실행 재개.
  • 예시: fork L1 // 부모: S2 실행 // 자식: S3 실행 join 2 S4 실행

3. 상호 배제 구현

  • 자물쇠·키:
    • 진입: 키가 있는지 확인 → 없으면 대기.
    • 출구: 사용 후 키 반납.
    • 동작: 진입과 출구는 한 머신 사이클 내에서 원자적으로 수행.
  • 임계 영역:
    • 공유 자원 접근 구간.
    • turn 변수를 사용해 공정성 보장.
  • 예시 코드(가상): while(key == 0) { /* 대기 */ } key = 0; // 잠그기 critical_section(); key = 1; // 반납

4. 생산자‑소비자 문제

  • 구성:
    • 버퍼: 고정 크기 배열.
    • 포인터: in, out 위치.
    • 카운터: 버퍼에 저장된 항목 수.
  • 연산:
    • in = (in + 1) mod BUFSIZE
    • out = (out + 1) mod BUFSIZE
  • 동기화:
    • 생산자: 버퍼가 가득하면 대기.
    • 소비자: 버퍼가 비어 있으면 대기.
  • 핵심: 모드 연산으로 순환 버퍼 구현.

결론

  • 선행 그래프는 병렬 실행 가능 영역을 시각화하고, 포크‑조인은 실제 코드로 변환한다.
  • 상호 배제는 공유 자원의 무결성을 보장하며, 생산자‑소비자 문제는 실시간 버퍼 교환 예제로 동기화 메커니즘을 확인한다.
  • 이 모든 개념은 병렬 프로세싱에서 성능과 안정성을 동시에 달성하기 위한 기초이다.