본문 바로가기
Computer Science/OS

[OS] 병행성 문제

by seaweed_one 2023. 4. 23.
728x90

안녕하세요.

이번 포스팅에서는 지난번에 이어 병행프로세스에 대하여 알아보겠습니다.

오늘은 병행프로세스에서 발생할 수 있는 문제들과 해결방법에 대해 포스팅해보려고 합니다.

 

병행성 문제 

병행성 문제는 협력 프로세스인 경우에 발생 가능합니다.

대표적으로는 아래와 같은 문제들이 존재하는데요.

  • 상호배제 
  • 동기화 
  • 통신 

이렇게 협력 프로세스는 병행성과 관점에서 상호배제, 동기화, 통신과 관련한 다양한 문제가 발생할 수 있습니다.

 

상호배제 

상호배제를 이해하기 위해서는 먼저 임계영역이라는 개념을 알 필요가 있습니다.

두 개 이상의 프로세스가 동시에 사용할 수 없는 공유자원을 임계자원이라고 합니다.

이러한 임계자원에 접근할 수 있는 프로그램 코드 영역을 임계영역이라고 칭합니다.

상호배제란 이러한 임계 영역을 2개 이상의 프로세스가 동시에 수행하지 못하도록 하는 것입니다.

 

예를들어 은행에 입출금을 한다고 생각해 봅시다.

두 사람이 동시에 한 계좌에 입금을 한다고 했을 때, 계좌라는 공유 자원에 두 입금 프로세스가 동시에 접근을 한다면 금액에 오류가 발생하겠죠.

해서 한 프로세스가 먼저 입금을 마친 뒤 잔고가 올라가면, 다른 프로세스가 해당 계좌에 입금을 해야 할 것입니다.

 

동기화 

프로세스 동기화와 관련된 문제로 2개 이상의 프로세스에 대해 처리 순서를 결정하는 것을 의미합니다.

위에서 설명한 상호배제 문제는 사실상 임계영역에 대한 동기화 문제라고 볼 수 있습니다.

 

통신 

프로세스 간 통신을 IPC라고 하는데요.

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

병행프로세스 수행 시 통신과 관련된 문제가 발생할 수 있습니다.

 

통신방법은 하나의 변수를 사용하는 방법과 메시지를 주고받는 방법으로 나눠지며 아래와 시스템 특성에 따라 사용하게 됩니다.

하나의 변수 사용 : 강결합시스템

메세징 방법 : 약결합시스템 혹은 강결합 시스템이지만 운영체제를 통해서 통신해야 하는 경우에 사용 

 

 

병행성 문제의 해결 

위에서 알아본 상호배제와 동기화 문제 해결을 위한 도구로 세마포어가 있습니다.

 

Semaphore

세마포어의 개념 

세마포어는 보통 정수형 공용 변수로 사용하는데요.

변수의 저장 값은 사용가능한 자원 수 또는 잠김이나 풀림의 상태로 세팅합니다.

상황에 따라 다르지만 대부분의 경우 0 이상의 정수로 초기화를 하게 되며 기본연산에 의해서만 사용됩니다.

 

세마포어의 기본연산 

P와 V라는 두 기본연산이 존재하고 두 기본연산에 의해서만 사용됩니다.

기본연산은 연산이 수행 시 인터럽트 되지 않고 하나의 단위로 처리되며 연산 끝까지 작업을 하게 됩니다.

 

연산 P

검사하고 감소시키려는 시도의 연산입니다.

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

 

연산 V

증가 연산입니다.

대기 프로세스가 있는지 먼저 확인 후 변수를 증가시킵니다.

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

각 세마포어는 개별적인 대기 큐가 필요합니다.

 

세마포어의 개념에 대해 알았으니 이제 세마포어를 활용한 문제 해결에 대하여 알아보겠습니다

 

상호배제 해결 

상호배제 해결을 위해서는 아래와 같은 규칙이 필요합니다.

  1. 한 프로세스가 임계영역에서 작업 수행 중인 경우 다른 프로세스는 임계영역에 진입해서는 안됨.
  2. 임계영역에서 수행 중이던 프로세스가 임계영역을 벗어난 경우 다른 프로세스가 임계영역을 새로이 수행할 수 있어야 함.
  3. 임계영역 진입을 대기하는 프로세스는 적절한 시간 내에 임계영역 수행을 시작할 수 있어야 함 

해서 상호배제 해결을 위해서는 임계영역 주변의 코드영역에 진입영역과 해제영역을 아래와 같이 설정합니다.

  • 진입영역 : 임계영역에 진입해도 되는지 체크 
  • 해제영역: 다른 프로세스가 임계영역 수행을 시작할 수 있도록 함

 

해당 진입영역과 해제영역 설정을 세마포어의 P, V 연산으로 수행할 수 있습니다.

진입영역은 P연산으로, 해제영역은 V 연산으로 수행합니다.

세마포어 mutex의 초기값은 1로 설정합니다.

대기큐는 FIFO 알고리즘으로 동작합니다.

 

동기화 해결 

프로세스 A와 B가 존재한다고 가정해 보겠습니다.

만약 A프로세스가 코드 A를 수행 후 B프로세스가 코드 B를 수행하도록 하고 싶은 경우에는 어떻게 해야 할까요?

먼저 세마포어 sync의 초기값을 0으로 설정합니다.

코드 A가 끝나는 시점에 V연산을 수행하며 대기 중인 프로세스를 확인합니다.

코드 B를 시작 전 P 연산을 수행한다면 두 프로세스 사이의 동기화를 해결할 수 있을 것입니다.

728x90

'Computer Science > OS' 카테고리의 다른 글

[OS] 교착 상태  (0) 2023.04.24
[OS] 협력프로세스  (0) 2023.04.24
[OS] 병행프로세스  (0) 2023.04.17
[OS] 프로세스 스케줄링 알고리즘  (0) 2023.03.15
[OS] 프로세스 스케줄링  (0) 2023.03.13