병행 프로세스 1

개요

최근에는 여러 프로세스가 단순히 순차처리가 아닌 병행처리될 필요가 많다.

음악 파일을 배경음악으로 재생하며 동시에 동영상도 틀어놓고 문서작업을 하는 등 운영체제는 이들을 병행으로 처리해야 한다.

특히 이렇게 병행처리되는 프로세스가 서로 상호작용하며 동작하는 경우에는 해결해야 할 다양한 문제가 존재한다.

따라서 해당 글에서는 병행 프로세스의 기본 개념과 함께 상호 배제와 동기화 문제에 대해 정리하고자 한다.

 

병행프로세스의 실행형태

- 1개의 CPU : 인터리빙 형식

- 여러개의 CPU : 병렬처리 형식

📍 멀티 프로세서 시스템에서의 메모리 구조에 따라

- 강결합 시스템(공유 메모리 구조)

: CPU는 여러 개 존재 , 메모리는 하나만 존재하는 구조

 > 여러 CPU들이 하나의 메모리를 공유 !

- 약결한 시스템(분산 메모리 구조)

: CPU 는 여러개 존재, 메모리도 여러개 존재

CPU마다 메모리가 별도로 존재 , 여러 개의 컴퓨터 시스템들이 독립적으로 존재하고 있고 통신선으로 연결되어 정보를 주고받을 수 있는 분산 메모리 구조이다.

 

- 차이점

강결합 시스템은 각각의 CPU끼리 정보교환을 하려고 할 때에는 메모리를 활용할 수도 있고 운영체제를 활용하여 정보교환이 가능하다.

프로세스간의 관계

독립프로세스

- 수행중인 다른 프로세스에 영향을 주지도 받지도 않음

- 데이터 및 상태를 다른 프로세스와 공유하지 않음

- 프로세스의 실행

 > 결정적 : 실행결과는 입력에 의해서만 결정됨

 > 재생 가능 :  같은 입력에 대해 항상 동일한 실행결과

협력 프로세스

- 수행중인 다른 프로세스와 영향을 주고받음

- 데이터 및 상태를 다른 프로세스와 공유

- 프로세스의 실행

 > 비결정적 :  실행결과는 실행순서에 좌우됨

 > 재생 불가능 : 같은 입력에 대해 항상 동일한 실행결과를 보장하지 못함

 

병행성 문제

- 협력 프로세스인 경우 발생 가능한 문제

> 상호배제

> 동기화

> 통신

 

상호배제

 : 2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것

* 임계영역  : 2개 이상의 프로세스가 동시에 사용하면 안 되는 공유 자원을 액세스 하는 프로그램 코드 영역

 

임계영역 없을때 = 동시 접근이 가능함 > 오류 팡팡
임계영역으로 묶었을때 (트랜잭션 처리)  >  상호배제 완룡

동기화

: 2개 이상의 프로세스에 대한 처리 순서를 결정하는 것

- 프로세스 동기화

* 상호배제 : 임계영역에 대한 동기화 문제

 

예시 요구사항 ) 

계좌 1에 있는 5만원 중에서 일부 금액(만원)을 인출해서 계좌 2에 입금을 하는 로직

- 정상적이게 서비스가 작동할 때

- 비정상적이게 작동할때

 

입금 프로세스 B가 먼저 작동할 수도 있으므로 출금 프로세스 A 와 입금 프로세스 B 와의 순서를 결정하는 동기화 작업이 필요하다.

통신

: 프로세스들이 데이터를 공유하기 위해 반드시 필요

- 프로세스 간 통신 (IPC)

> 통신 방법

- 하나의 변수 사용

- 메시지를 서로 주고받음

세마포어

: 상호배제와 동기화 문제를 해결하기 위한 도구

- Dijkstra가 제안

> 정수형 공용변수

- 저장값 :  사용 가능한 자원의 수 또는 잠김이나 풀림의 상태

* 변수에 담기는 정수형 값의 의미는 상황에 따라서 그 의미가 변한다.

> 상황에 맞춰 0 이상인 정수로 초기화

> 두 기본 연산 P 와 V 에 의해서만 사용됨

- 기본연산  : 인터럽트되지 않고 하나의 단위로 처리됨

연산 P

- 검사, 감소시키려는 시도

void P (semaphore s)
{
	if(s>0)
    		s--;
        else
        	현재 프로세스를 대기시킴;
}

> 매개변수로 받아온 s가 양의 정수값이면 세마포어의 값을 1 감소시킨다. 그 후 해당하는 세마포어 종료. 

그러나 s가 양의 정수값이 아니라면 p라는 연산을 호출한 프로세스를 대기시킨다.

연산 V

- 증가

void V(semaphore s){
	if(대기중인 프로세스 없음)
    		s++;	
    	else 
    		대기중인 프로세스 1개 진행;
}

> 받아온 세마포어의 값을 보기 전에 대기중인 프로세스가 있는지  여부 확인 

 

=> 각각의 세마포어마다 대기 큐 필요

 

상호배제 해결

> 상호배제를 위한 일반적인 요구사항

● 한 프로세스가 임계영역 수행 중

 ▷ 다른 프로세스는 임계영역에 진입해서는 안 됨

  임계영역 수행 중이던 프로세스가 임계영역 벗어남

▷ 누군가 하나는 임계영역을 새로이 수행할 수 있어야 함

● 임계영역 진입 못하고 대기하는 프로세스

 ▷ 적절한 시간 내에 임계영역 수행을 시작할 수 있어야 함

 

> 상호배제를 위한 임계영역 주변의 코드 영역

● 진입영역  : 임계영역에 대한 수행을 해도 되는 지 체크

● 해제영역 : 다른 프로세스가 임계영역 수행을 시작할 수 있도록 함

> 세마포어 이용

 

  세마포어 mutex 초기값은 1

  진입 영역 : P(mutex)

  해제 영역 : V(mutex)

  대기 큐는 FIFO 로 동작

동기화 해결

● 상황 :  프로세스 A가 코드 S1 을 수행한 후 프로세스 B가 코드 S2 를 수행하도록 동기화

● 세마포어 sync 초기값은 0