📚병행 프로세스의 개요

📄병행성과 병행 프로세스

병행성은 여러 개의 프로세스 또는 쓰레드가 동시에 수행되는 시스템의 특성을 말한다. 한 프로세스나 쓰레드가 실행을 시작 후 종료상태가 되지 않은 상황에서 다른 프로세스나 쓰레드가 실행되는 상황을 의미한다. 이렇게 동시에 실행되는 프로세스 또는 쓰레드를 병행 프로세스라고 한다.

병행 프로세스의 실행 형태는 CPU 개수에 따라 다르다.

  • 한 개의 CPU
    하나의 CPU에서 실행되는 경우 프로세스가 짧은 시간 간격으로 번갈아 가며 실행되는 인터리빙 형식으로 실행된다. 여러 프로세스가 동시에 수행되는 것 처럼 보이지만 정확히 한번에 하나의 프로세스가 실행되는 방식이다.


  • 여러 개의 CPU
    각 프로세스가 각 CPU에서 온전히 실행되어 한번에 여러 개의 프로세스가 실행되는 병렬처리 형식으로 실행된다. 이렇게 여러 개의 CPU에서 프로세스가 실행되는 시스템을 멀티프로세서 시스템이라고 한다. 멀티프로세서 시스템에서 메모리 구조에 따라 프로세스가 실행되는 형태가 다르다.

    • 강결합 시스템
      여러 CPU가 하나의 기억장치를 공유한다. 그리고 하나의 운영체제가 모든 CPU와 시스템 하드웨어를 제어한다.

    • 약결합 시스템
      2개 이상의 독립된 컴퓨터 시스템이 네트워크로 연결된다. 각 시스템은 운영체제와 기억장치를 따로 가지고 있어서 독립적으로 운영되고 필요할 때 통신을 한다. 통신선을 통해 다른 시스템의 파일을 참조하고, 각 시스템의 부하를 조절하기 위해 부하가 적은 시스템에 작업을 보낼 수 있다. 시스템 간의 통신을 위해 메시지 전달이나 원격 프로시저 호출방식을 사용한다.


📄프로세스 간의 관계

  • 독립 프로세스
    독립 프로세스는 데이터와 자신의 상태를 다른 프로세스와 공유하지 않는다. 독립 프로세스의 실행은 결정적이고 재생 가능하다. 쉽게 말해, 다른 프로세스의 영향을 받지 않기 때문에 입력 데이터만 동일하면 실행 결과는 항상 동일하다는 의미이다.

  • 협렵 프로세스
    협력 프로세스는 다른 프로세스와 데이터와 자신의 상태를 공유한다. 협력 프로세스의 실행은 비결정적이고 재생 불가능하다. 쉽게 말해, 다른 프로세스의 영향을 받을 수 있기 때문에 입력 데이터가 동일하더라고 실행 결과가 달라질 수 있다는 의미이다.



📚병행성 문제

  • 상호배제 문제
    상호배제는 두 개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것이다. 임계영역이란 두 개 이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역을 말한다.

  • 동기화 문제
    동기화는 두 개 이상의 프로세스에 대한 처리순서를 결정하는 것이다. 상호배제도 임계영역에 대한 동기화 문제로 볼 수 있다.

  • 통신 문제
    프로세스 간 통신은 데이터를 공유하기 위해 반드시 필요한 것이다. 통신하는 방법에 따라 상호배제 또는 동기화 문제를 포함하여 다양한 문제가 발생할 수 있다.



📚세마포어

📄세마포어 정의

세마포어는 상호배제와 동기화 문제를 해결하기 위해 다익스트라가 제안한 도구이다. 세마포어 s는 정수형 공용변수로, 사용 가능한 자원의 수 또는 잠김이나 풀림의 상태를 값으로 갖는다. 처음 세마포어 s를 선언할 때 상황에 맞는 값으로 초기화한다. 세마포어 s는 2개의 기본연산 P와 V에 의해서만 사용될 수 있다. 연산 P는 네덜란드어로 검사(proberen)을 나타내고 연산 V는 증가(verhogen)을 나타낸다.

기본연산 P와 V에 대한 정의는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void P(semaphore s)
{
  if(s > 0)
  {
    s--;
  }
  else
  {
    현재 프로세스를 대기시킴;
  }
}

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


📄상호배제 해결

세마포어는 임계영역에 대한 상호배제 문제를 해결할 수 있다. 상호배제를 위해 한 프로세스가 임계영역을 수행 중이라면 다른 프로세스는 임계영역에 들어오면 안되고, 임계영역을 수행 중이던 프로세스가 임계영역을 벗어나면 다른 프로세스가 임계영역을 새로 수행할 수 있어야 한다.

임계영역에 대한 수행을 해도 되는지 체크하기 위해 임계영역 시작 부분에 진입 영역을 두고, 다른 프로세스가 임계영역 수행을 시작할 수 있도록 임계영역 끝 부분에 해제영역을 둔다.

상호배제 문제를 해결하기 위해 세마포어를 진입영역에 연산 P를 두고 해제영역에 연산 V를 둔다. 이때 세마포어 mutex의 초기값은 1로 둔다. 세마포어 mutex는 임계영역 수행의 시작 가능 여부를 나타낸다. 초기값 1은 아무도 임계영역을 수행하고 있지 않으므로 임계영역을 수행할 수 있는 것을 의미하고, 0은 임계영역을 수행할 수 없는 것을 의미한다.


📄동기화 해결

세마포어는 프로세스 동기화 문제를 해결할 수 있다. 프로세스 A가 코드 S1을 수행한 후 프로세스 B가 코드 S2를 수행하도록 동기화 하려면 코드 S2 앞에 연산 P를 두고 코드 S1 뒤에 연산 V를 두는 것입니다. 세마포어 sync의 초기값은 0으로 둔다.

세마포어 sync는 나중에 수행되어야 하는 코드 S2 수행의 시작 가능 여부를 나타낸다. 초기값 0은 먼저 수행되어야 하는 코드 S1이 아직 수행되지 않았으므로 코드 S2를 수행할 수 없는 것을 의미한다.



Leave a comment