Post

04 OS - 병행프로세스와 상호배제

04 OS - 병행프로세스와 상호배제

1. 병행프로세스

1. 독립 프로세스

  • 다른 프로세스와 공유 메모리, 변수, 자원 등을 사용하지 않으며, 어떤 프로세스의 실행 여부나 결과에 영향을 주지도 받지도 않는 구조
  • 종류
    • 단일 프로그래밍 : 하나의 프로세스가 CPU를 점유하여 종료된 후 다음 프로세스를 실행
    • 다중 프로그래밍 : 여러 프로세스가 메모리에 동시에 올라가 있으며, CPU는 문맥교환(context switch)을 통해 프로세스들을 번갈아가며 실행
    • 다중 처리 : 2개 이상의 CPU를 사용하여 물리적으로 여러 프로세스를 병렬로 실행

2. 협력 프로세스

  • 협력 프로세스는 다른 프로세스와 데이터를 공유하거나 통신하며 공동 작업을 수행하는 구조
  • 예시
    • 두 프로세스가 하나의 파일 또는 공유 메모리를 동시에 접근하는 경우
    • 생산자-소비자 모델 (Producer-Consumer)
    • 파이프라인 처리, 클라이언트-서버 모델

3. 병행프로세스 해결 과제

  • 상호배제 : 공유 자원 접근 시 동시 접근 방지
  • 프로세스 간 통신 (IPC) : 메시지 큐, 파이프, 공유 메모리 등을 통한 데이터 교환
  • 일관된 실행 결과 보장 : 실행 순서에 관계없이 동일한 결과가 나와야 함 (레이스 컨디션 방지)

2. 상호배제

1. 상호배제

  • 병행 프로세스 환경에서 하나의 프로세스가 공유 자원을 사용하는 동안, 다른 프로세스가 동시에 해당 자원에 접근하지 못하도록 보장하는 것
  • 상호배제 만족 조건
  • 동시 접근 금지: 둘 이상의 프로세스가 동시에 공유 자원에 진입할 수 없어야 함.
  • 진행 조건 (Progress): 어떤 프로세스가 임계 구역에 들어갈 수 있을지는 시스템의 속도나 프로세서 수와 관계없이 결정되어야 함.
  • 한정된 대기 (Bounded Waiting): 프로세스는 유한한 시간 내에 임계 구역에 들어갈 수 있어야 하며, 무기한 기다리면 안됨
  • 비선점성 (No Preemption): 이미 임계 구역에 진입한 프로세스를 다른 프로세스가 강제로 중단시킬 수 없어야 함.

2. 임계영역

  • 두 개 이상의 프로세스가 공유 자원(예: 변수, 버퍼, 파일 등)을 접근할 수 있는 코드 영역
  • 임계 영역은 하나의 프로세스만 진입 가능해야함
  • 일반적인 구조
    1
    
    Entry Section → Critical Section → Exit Section → Remainder Section
    
  • Entry Section: 임계 구역 진입을 위한 조건 검사 및 락 획득
  • Exit Section: 임계 구역 탈출 후 락 해제
  • Remainder Section: 공유 자원과 무관한 일반 실행 영역

3. 생산자 소비자 문제

  • 비동기적으로 실행되는 두 프로세스(또는 스레드)가 공유 버퍼를 통해 데이터를 주고받는 고전적 동기화 문제
  • 생산자 프로세스는 데이터를 버퍼에 저장하고, 소비자 프로세스는 버퍼에서 데이터를 읽어감
  • 해결해야 하는 문제
    • 동기화(Synchronization) : 소비자가 읽기 전에 생산자가 데이터를 먼저 써야 함
    • 공유 자원 보호 : 버퍼는 임계 영역이므로 동시 접근이 불가
    • 버퍼 오버플로우 : 생산자는 버퍼가 가득 찼을 경우 대기해야 함
    • 언더플로우 방지 : 소비자는 버퍼가 비었을 경우 대기해야 함

3. 상호배제 방법

1. 상호 배제 방법

분류방법설명
고급 수준소프트웨어로 해결데커의 알고리즘, 크누스의 알고리즘, 핸슨의 알고리즘 등
 소프트웨어가 제공세마포, 모니터 등
저급 수준하드웨어로 해결TestAndSet(테스) 등

2. 데커의 알고리즘 🔖

  • 병행 프로그래밍의 상호배제 문제를 풀 수 잇는 첫번째 해결책으로 알려짐.
  • 각 프로세스는 플래그를 설정할 수 있고, 그 플래그를 기준으로 진입여부를 결정함.
  • 특징
    • 특별한 하드웨어 명령문이 필요없음.
    • 임계 영역 바깥에서 수행중인 프로세스가 다른 프로세스들이 임계영역에 들어가는걸 막지 않음.
    • 임계 영역에 들어가기를 원하는 프로세서를 무한정 기다리게 하지 않음.

3. TestAndSet(테스) 명령어 🔖

  • 하드웨어 수준에서 상호배제를 보장하는 원자적 명령어
  • 공유 플래그(락 변수)를 검사하고 동시에 값을 변경함
  • 특징
    • 한 명만 임계 영역 진입 가능 (다른 프로세스는 반복 확인)
    • Busy Waiting(바쁜 대기) 발생 가능
    • 다중 프로세서 환경에서도 동기화 가능

4. 세마포 🔖

  • 정수 값을 가지는 동기화 객체로, 자원 개수를 제어하는 데 사용
  • 두 가지 기본 연산:
    • P() 또는 wait() : 자원을 얻음 (값 감소)
    • V() 또는 signal() : 자원을 반환 (값 증가)
  • 특징
    • 상호배제 및 동기화 모두 가능
    • 이진 세마포(0,1 값만)는 락처럼 사용
    • 잘못 사용 시 교착 상태 발생 가능

5. 모니터 🔖

  • 고급 언어 수준에서 제공되는 동기화 도구 (소프트웨어 기반)
  • 임계영역은 모니터 안의 메소드로 구성되고, 하나의 스레드만 진입 가능
  • 조건 변수(Condition Variable)로 상태 변화에 따라 스레드 대기/재개
  • 특징
    • 병행 제어를 구조적으로 안전하게 구현
    • 바쁜 대기를 피하고, 자바나 파이썬에서도 기본 제공
This post is licensed under CC BY 4.0 by the author.