[OS] 병행 프로세스와 상호배제

Manx·2022년 5월 3일
0

운영체제

목록 보기
5/12

병행 프로세스

운영체제가 프로세서를 빠르게 전환해 마치 프로세스 여러 개를 동시에 실행하는 것처럼 보이게 하는 것

공유 영역 : 모든 프로세스가 동시에 공유, 메모리 자원은 공유 영역에서 병렬(parallel)로 사용

병행성

  • 여러 프로세스를 이용하여 작업을 수행하는 것
  • 시스템 신뢰도를 높이고 처리 속도 개선, 처리 능력을 높이는 데 중요하다.

문제점

  • 각 프로세스들은 서로의 존재를 모름 (비동기적)

  • 병행 수행중인 비동기족 프로세스들이 공유 자원에 동시에 접근할 때 문제가 발생

  • 임계 영역 (Critical Section) : 공유 자원을 접근하는 코드 영역

  • 상호 배제 : 동시에 임계 영역에 진입하는 것을 막는 것

상호 배제(mutual exclusion)

  • 병행 프로세스에서 공유 자원이 사용되고 있을 시 다른 프로세스가 접근할 수 없도록 막는 방법
  • 읽기 연산은 공유 데이터에 동시에 접근해도 문제가 발생하지 않는다.

상호 배제의 조건

  1. 두 프로세스는 동시에 공유 자원에 진입 불가
  2. 프로세스의 속도나 프로세서 수에 영향을 받지 않음
  3. 공유 자원을 사용하는 프로세스만 다른 프로세스 차단 가능
  4. 프로세스가 공유 자원을 사용하려고 너무 오래 기다려서는 안됨

생산자-소비자 문제

  • 운영체제에서 비동기적으로 수행하는 모델
  • 생산자 프로세스가 생산한 정보를 소비자 프로세스가 소비하는 형태

생산자는 버퍼가 꽉 차면 더이상 생산 불가, 소비자는 버퍼가 비면 데이터 소비 불가

무한 버퍼를 이용한 생산자-소비자 알고리즘

코드

  • 생산자 프로세스는 생산하는 새로운 원소를 지역변수 nextProduced에 저장
  • 소비자 프로세스는 원소를 지역변수 nextConsumed에 저장

공유 데이터의 선언

#define BUFFER_SIZE 10
typedef struct {
	DATA data;
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int counter = 0;

생산자 프로세스

item nextProduced;

while(true) {
	// 버퍼가 가득 차 있을 경우 계속 while문에 머뭄
	while (counter == BUFFER_SIZE);
    buffer[in] = newxtProduced;
    // 유한 버퍼
    in = (in + 1) % BUFFER_SIZE;
    counter++;
}

소비자 프로세스

item nextConsumed;

while(true) {
	// 버퍼가 비어있을 경우 아무 일도 하지 않음
	while (counter == 0);
    nextConsumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    counter--;
}

경쟁 상태

  • 동시에 공유 데이터 접근 시, 접근 순서에 따라 실행 결과가 달라지는 상황
  • 공유 데이터에 마지막으로 남는 데이터의 결과를 보장할 수 없다.
  • 읽기와 쓰기 명령을 동시에 실행해야 한다면, 기본적으로 읽기 명령을 먼저 수행 후 쓰기 명령을 수행한다.

경쟁 상태의 예방

  • 병행 프로세스들을 동기화해야 함 (임계 영역을 이용한 상호배제로 구현)
  • counter를 한 순간에 하나의 프로세스만 조작할 수 있도록 해야 함.

Reference

운영체제:그림으로 배우는 구조와 원리 - 한빛 아카데미

profile
백엔드 개발자

0개의 댓글