본문 바로가기
Programming/DevOps, Tools

[운영체제] 병행 프로세스

by kghworks 2023. 5. 14.

멀티프로세서 환경

 이번 포스팅에선 운영체제에서 병행 프로세스의 개념이 무엇인지 알아보고, 병행프로세스로 인해 발생하는 문제와 해결방안을 검토해 봅니다.

 

목차

  • 병행 프로세스
  • 병행성 문제
  • 세마포어
  • 세마포어를 활용한 병행 프로세스 문제 해결
  • 프로세스 간 통신

병행 프로세스

 병행성 (concurrency)이란 2개 이상의 프로세스 (스레드)가 동시 수행되는 시스템의 특성입니다. 이때 2개 이상 수행 중인 프로세스들을 병행 프로세스라고 합니다.

 

윈도우 운영체제의 많은 프로세스들 (작업 관리자)

 

interleaving 형식

 한 개의 CPU로 여러 개의 프로세스를 연산합니다.

 사용자는 동시에 프로세스들이 진행되는 것처럼 보이지만 정확히 '동시'에 하나의 프로세스만 연산할 수 있습니다. 사용자 의도를 무시하고  하나의 CPU를 이용하여 스케줄링에 따라 진행되기 때문에 동시에 여러 프로세스가 진행된 것처럼 보입니다.

 

 

병렬 처리 (parallel) 형식

 병렬 처리 (parallel) 형식은 2개 이상의 CPU로 실제로 동시에 여러 프로세스를 연산하는 것을 말합니다. 멀티프로세서 환경이라고도 합니다.

 

  • 강결합 시스템 : 2개 이상의 CPU가 하나의 메모리를 공유
  • 약결합 시스템 : 2개 이상의 CPU가 각각의 메모리를 가짐, 메모리 간에 통신할 수 있는 통신선이 별도 필요

 

독립 프로세스

  • 수행 중인 다른 프로세스에 영향을 주고받지 않음
  • 데이터, 상태를 다른 프로세스와 공유 안 함
  • 프로세스 실행
  • 결정적 : 입력에 의해서만 실행결과를 결정
  • 재생가능 : 동일 입력에는 항상 동일한 실행 결과

 

협력 프로세스

  • 수행 중인 다른 프로세스와 서로 영향을 주고받음
  • 공유 데이터 : 데이터, 상태 등
  • 프로세스 실행
  • 비결정적 : 실행결과는 실행 순서에 좌우
  • 재생 불가능 : 동일 입력에 대해 항상 동일한 실행결과 보장 못함

병행성 문제

 병행 프로세스들이 협력 프로세스일 경우 서로 상태와 데이터를 주고받을 수 있고, 공유 자원 (ex. RDBMS 데이터)에 동시에 접근한다면 문제가 발생할 수 있습니다. 이때 자주 등장하는 예가 은행 계좌 예시입니다.

임계영역 예제 : 은행 계좌

임계영역

: ex. 은행 계좌 잔금 데이터에 접근하는 코드 영역 (입금, 출금, 이체 등)

 2개 이상의 프로세스가 동시에 사용하면 안 되는 공유자원이 있을 때, 이 공유자원에 액세스 하는 프로그램 코드 영역을 말합니다.

협력 프로세스 환경에서 접근 가능할 경우 임계영역에 대한 적절한 처리를 해두지 않으면 병행성 문제를 야기합니다.

 

병행성 문제를 해결할 수 있는 조치

  • 상호배제 : 2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하게 하는 것
  • 동기화 : 2개 이상의 프로세스에 대한 처리 순서를 결정하는 것
  • 통신 (IPC) : 프로세스 간에 데이터를 공유

 

상호 배제 구현 조건

  1. 한 프로세스가 임계영역 수행 중 : 다른 프로세스는 임계영역 진입 불가
  2. 임계영역 수행 중인 다른 프로세스가 임계영역을 벗어남 : 다른 하나는 임계영역을 수행 가능해짐
  3. 임계영역에 진입하지 못한 채 대기하는 프로세스 : 적절 시간 내에 임계영역 수행을 시작할 수 있어야 함 (기아 상태 방지)

세마포어 (Semaphore)

 Dijkstra 가 제안한 상호배제와 동기화를 구현하기 위한 도구입니다. 아래와 같은 장치들을 사용합니다.

 

  • 정수형 공용변수 : 사용 가능 자원수 or 잠김/풀림 상태를 저장
  • 상황에 따라 0 이상의 정수로 초기화
  • 두 기본연산 P와 V에 의해서만 실행
  • 기본연산 : 인터럽트 되지 않고 하나의 단위로 처리
  • 세마포어마다 대기 큐 필요
public synchronized void p(Semaphore s) {
    if (s > 0) {
        s--;
        // 프로세스 진행
    } else {
        // 현재 프로세스 대기
    }
}

public synchronized void v(Semaphore s) {
    if (existWaitingProcess()) {
        s++;
    } else {
        // 대기 프로세스 1개 진행
    }
}

 

세마포어를 이용한 상호 배제 구현

조건 : 대기 큐 1개 필요

  1. 진입영역 : 임계영역 수행 가능여부 체크 (조건 1)
  2. 임계영역
  3. 해제영역 : 다른 프로세스가 임계영역이 수행 가능하게 처리 (조건 2, 3)

 

세마포어 mutex 초기값 : 1

  1. 진입영역 : mutex--;
  2. 임계영역 : 수행
  3. 해제영역 : 대기큐 확인해서 프로세스 실행 (동기화) or 1로 수정

아래는 세마포어의 공용변수 mutex를 이용하여 상호배제를 구현한 수도코드입니다.

 

public static int mutex = 1; // 세마포어 공용변수

... 

P(mutex);
임계영역();
v(mutex);

세마포어를 활용한 병행 프로세스 문제 해결

생산자-소비자 문제

생산자-소비자 문제

  • 생산자 : 버퍼에 데이터를 넣는 프로세스
  • 소비자 : 버퍼에서 데이터를 꺼내는 프로세스
  • 문제 정의 : 두 협력 프로세스 사이에 하나의 버퍼를 두고 발생하는 문제

 

상호 배제 구현 필요성

  • 버퍼에 데이터를 넣는 동안 데이터를 꺼낼 수 없음 (조건 1)
  • 버퍼에서 데이터를 꺼내는 동안 데이터를 넣을 수 없음 (조건 1)

 

동기화 필요성

  • 버퍼가 가득 참 : 생산자 대기
  • 버퍼가 빔 : 소비자 대기
// 생산자
while (true) {
    p(empty); // 버퍼 사용 가능여부 확인
    p(mutex)
    // 임계영역 진행 - 데이터 생산
    ...
    v(mutex);
    v(full);
}

//소비자
while (true) {
    p(full); // 버퍼 사용 가능여부 확인
    p(mutex)
    // 임계영역 진행 - 데이터 소비
    ...
    v(mutex);
    v(empty);
}

 

판독기-기록기 문제

판독기-기록기 문제

여러 협력 프로세스 사이에 공유자원에 대하여 판독기, 기록기 상황을 다룸

  • 판독기 : 데이터를 읽는 프로세스
  • 기록기 : 데이터를 쓰는 프로세스

 

상호 배제 필요성

  • 하나의 기록기가 공유자원에 데이터를 쓰는 중에 다른 기록기나 판독기는 공유자원 접근 불가능 (조건 1)
  • 공유자원에 데이터를 쓰고 있을 때 누구도 접근 불가능
  • 공유자원에 데이터를 읽고 있을 때 누구도 쓰기 불가능
  • 단, 여러 판독기는 동시에 공유자원 데이터 읽기 가능

협의점 : 판독기가 읽는 상황에서 새로운 판독기와 기록기가 들어온다면 어느 것에 우선순위 부여할 것인가

 

제1 판독기-기록기 문제

  • 판독기가 공유자원에 접근 중일 때, 
  • 큐에 있는 기록기보다 판독기에 우선순위를 부여
  • 판독기는 즉시 공유자원 접근 가능

 

문제점 : 기록기의 기아상태 유발 가능성 (판독기가 계속 접근해 오면 기록기는 무한 대기)

// 기록기
p(writ);
// 임계영역 진행 - 데이터 기록
...
v(writ);

// 판독기
p(mutex);
rcount++;
if (rcount == 1) {
    p(wrt);
}
v(mutex);
// 임계영역 진행 - 데이터 판독
...
p(mutex);
rcount--;
if (rcount == 0) {
    v(wrt);
}
v(mutex);

 

제2 판독기-기록기 문제

  • 판독기가 공유자원에 접근 중일 때,
  • 큐에 있는 판독기보다 기록기에 우선순위 부여
  • 대기 중인 기록기가 있다면 새로운 판독기는 공유자원 접근 불가능

 

문제점 : 판독기의 병행성능 떨어짐, 판독기 기아상태 유발 가능성 (기록기가 계속 접근해 오면 판독기는 무한 대기)

public static int rd = 1;
public static int wrt = 1;
public static int mutex1 = 1;
public static int mutex2 = 1;
public static int mutex3 = 1;
public static int rcount = 1;
public static int wcount = 1;


// 기록기
p(mutex2);
wcount++;
if (wcount == 1) {
    p(rd);
}
v(mutex2);
p(wrt);
// 임계영역 진행 - 데이터 기록
v(wrt);
p(mutex2);
wcount--;
if (wcount == 0) {
    v(rd);
}
v(mutex2);

// 판독기
p(mutex3);
p(rd);
p(mutex1);
rcount++;
if (rcount == 1) {
    p(wrt);
}
v(mutex1);
v(rd);
v(mutex3);
// 임계영역 진행 - 데이터 판독
...
p(mutex1);
rcount--;
if (rcount == 0) {
    v(wrt);
}
v(mutex1);

프로세스 간 통신

: InterProcess Communication

 

병행 프로세스가 서로 데이터를 공유하는 방법으로 아래 2가지가 있습니다.

  • 공유 메모리 방법
  • 메시지 전달 방법

한 운영체제에서 두 방법 함께 사용이 가능합니다.

 

공유 메모리 방법

협력 프로세스가 공유자원인 메모리 공간 안에서 동일한 변수를 사용하는 것입니다. 커널의 개입 없이 공유메모리로부터 읽고 씁니다.

 

사용 예

  • 생산자-소비자 문제의 유한 버퍼
  • 판독기-기록기 문제의 공유자원

대량 데이터 교환에서 고속 통신 가능

프로그래머가 통신상 발생 가능 문제 해결

 

메시지 전달 방법

  • 협력 프로세스가 메시지를 주고받을 때 시스템 (커널)을 호출
  • 호출 메서드 : send(), receive()
  • 소량 데이터 교환에 적합
  • 운영체제가 통신상 발생 가능 문제 해결

 

논리적 구조

메시지 전달방법의 논리적 구조

 

 

통신 링크 : 메시지가 지나다니는 통로

 

  • 연결 대상: 협력 프로세스 서로
  • 두 프로세스 사이 링크 개수 : 1개 이상
  • 방향성 : 단방향, 양방향
  • 통신 링크 용량 : 무한, 유한, 0

 

통신링크 용량

  • 무한 : 통신링크 큐 존재, 송신자 대기 없음
  • 유한 : 큐 존재, 큐가 가득 차면 송신자가 대기
  • 0 : 큐가 없음, 수신자가 메시지를 받을 수 있을 때까지 송신자 대기

 

통신링크 무한 용량
통신링크 유한 용량
통신링크 큐 없음

 

직접통신

  • 두 프로세스가 직접 서로를 지정하여 메시지 전달
  • 오직 하나의 통신링크 자동 설정
  • 하나의 통신링크는 오직 두 프로세스만 연관
  • 양방향
  • 대칭 / 비대칭형 주소지정 존재
  • 비대칭형 주소지정은 수신자가 여러 송신자와 통신링크를 가질 경우 사용

메시지전달 방법 > 직접 통신
직접통신 > 대칭형 주소지정

 

직접통신 > 비대칭형 주소지정

 

간접통신

  • 프로세스 사이에 우편함을 통해 메시지 전달
  • 같은 우편함을 이용하는 통신링크 설정
  • 여러 우편함을 이용하면 여러 통신링크 존재
  • 하나의 통신링크가 여러 프로세스와 연관 가능
  • 단방향 또는 양방향

간접통신

 

우편함이 수신 프로세스에 소속

  • 수신자 하나
  • 통신링크 단방향
  • 수신 프로세스 종료 시 우편함 사라짐

우편함이 수신 프로세스에 소속

 

우편함이 운영체제에 소속

  • 수신자 여럿
  • 한순간에 하나의 수신자만 가능
  • 운영체제가 수신자 관리
  • 통신링크 양방향

우편함이 운영체제에 소속

댓글