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는 병행 가능 → 동시에 실행 가능.S3는S1, S2가 끝난 뒤 실행.S5, S6는S4이후에 실행.S7은S5, 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 BUFSIZEout = (out + 1) mod BUFSIZE
- 동기화:
- 생산자: 버퍼가 가득하면 대기.
- 소비자: 버퍼가 비어 있으면 대기.
- 핵심: 모드 연산으로 순환 버퍼 구현.
결론
- 선행 그래프는 병렬 실행 가능 영역을 시각화하고, 포크‑조인은 실제 코드로 변환한다.
- 상호 배제는 공유 자원의 무결성을 보장하며, 생산자‑소비자 문제는 실시간 버퍼 교환 예제로 동기화 메커니즘을 확인한다.
- 이 모든 개념은 병렬 프로세싱에서 성능과 안정성을 동시에 달성하기 위한 기초이다.