CS/운영체제

[Chapter 3] 개념 이해를 위한 운영체제 [병행성 - 개요]

devrabbit22 2025. 2. 24. 00:41

다중 프로그래밍 환경에서 실제로 실행 중인 프로세스는 하나이지만 다수의 프로세스들이 동시에 실행되고 있는 것처럼 보인다. 마찬가지로 다중 스레딩 환경에서도 실제로 실행중인 스레드는 하나이지만 다수의 스래드들이 동시에 실행되고 있는 것처럼 보인다. 이와 같은 환경에서 다수의 프로세스 혹은 스래드들이 동시에 실행되는 것을 프로세스 혹은 스래드의 "병행성(concurrency)"라고 부른다.

 

다중 프로그래밍 환경에서 다수의 프로세스들이 어떤 자원을 공유하면서 병행적으로 실행할 경우, 상호 영향을 미치게 되기 때문에 프로세스의 실행 결과 값이 달라질 수 있다. 마찬가지로 스래딩 환경에서도 동일한 프로세스에서 생성된 스래드들은 그 프로세스에게 할당된 자원들을 공유하면서 병렬적으로 실행되기 때문에 상호 영향을 미치게 되어 그 실행 결과 값이 달라질 수 있다.

ex)1부터 10까지의 합을 구하는 작업을 하나의 프로세스로 처리할 경우 그 실행 결과 값은 항상 55가 될 것이다. 

이러한 특성을 프로세스의 결정성(determinacy)라고 한다.

 

다중 프로그래밍 환경에서 다수의 프로세스들이 어떤 자원을 공유하면서 병행적으로 실행된 경우, 상호 영향을 미치게 되기 때문에 프로세스의 실행 결과 값이 달라질 수 있다. 마찬가지로 다중 스래딩 환경에서도 동일한 프로세스에서 생성된 스래드들은 그 프로세스에게 할당된 자원들을 공유하면서 병행적으로 실행되기 때문에 상호 영향을 미치게 되어 그 실행 결과 값이 달라질 수 있다.

이와 같이 프로세스 혹은 스래드들이 자원을 공유하면서 병행적으로 실행될 경우 상호 영향을 미치게 되면 프로세스 혹은 스래드의 결정성을 보장할 수 없게 된다. 따라서 프로세스 혹은 스래드들이 자원을 공유하면서 병행적으로 실행될 경우, 프로세스 혹은 스래드의 결정성 보장을 위한 운영체제의 기능이 요구된다.

생산자와 소비자 프로세스

생산자 프로세스와 소비자 프로세스가 공유 버퍼를 통하여 데이터를 주고 받을 경우 생산자 프로세스는 데이터를 생산하여 공유 버퍼에 저장하고, 소비자 프로세스는 공유 버퍼로부터 데이터를 가져와 소비한다. 두 프로세스는 공유 버퍼로 부터 데이터를 가져와 소비한다. 두 프로세스가 정상적으로 데이터를 주고 받기 위하여 생산자 프로세스는 공유 버퍼로부터 데이터를 가져와 소비한다. 두 프로세스는 공유 버퍼가 꽉 차면 기다리게 되고, 소비자 프로세스는 공유 버퍼가 비어있으면 기다려야 할 것이다. 즉 두 프로세스는 공유 버퍼를 공유하면서 병행적으로 실행하기 때문에 상호 영향을 받게 된다. 따라서 두 프로세스가 정상적으로 데이터를 주고 받기 위해서는 두 프로세스 간의 동기화(synchronization)가 요구된다.

공유 변수
char buffer[N]; /* 환형 큐 구조의 공유 버퍼 */
int counter = 0; /* 공유 버퍼에 저장된 데이터 개수 */
생산자 프로세스
producer(){
int in = 0;
char *nextp;
for(;;){
...
/* 새로운 데이터를 생성하여 nextp에 할당 */
...
while(counter == N)	/* 공유 버퍼가 꽉차면 기다림 */
;
buffer[in] = nextp; /* 공유 버퍼에 데이터 저장 */
in = (in+1) % N;
counter = counter+1; /* 공유 버퍼에 저장된 데이터 개수 증가 */
}
소비자 프로세스
consumer(){
int out = 0;
char *nextc;
for(;;){
while(counter == 0) /*공유 버퍼가 비어 있으면 대기 */
;
nextc = buffer[out]; /*공유 버퍼로부터 데이터 제거 */
out = (out + 1) % N;
counter = counter + 1;	/*공유 버퍼에 저장된 데이터 개수 감소*/
...
/* nextc에 할당된 데이터 소비 */
...
}
}

생산자 및 소비자 프로세스

 

생산자 프로세스는 counter 값이 buffer의 배열 크기(N)와 같게 되면 기다리고, 소비자 프로세스는 counter 값이 0이 되면 기다리도록 한다. 이러한 알고리즘으로 동기화시킴으로써 두 프로세스의 결정성이 보장될 것으로 기대한다. 

그러나 공유 변수 (buffer, counter)가 병행적으로 실행하는 두 프로세스에 의해 동시에 접근되는 것을 허용하고 있기 때문에 두 프로세스의 실행 결과에 대한 결정성은 보장되지 않는다.

 

다중 프로그래밍 환경에서 공유 자원에 대한 프로세스들의 접근이 발생하는 순서에 따라 프로세스들의 실행 결과 값이 달라질 수 있는 상황을 프로세스의 "경쟁 조건(race condition)"이라 한다. 이와 같이 다중 프로그래밍 환경에서 프로세스들이 자원을 공유하면서 병행적으로 실행될 경우 경쟁 조건이 발생하기 때문에 프로세스의 결정성을 보장하기 위한 운영체제의 기능이 요구된다.


Reference

개념 이해를 위한 운영체제

https://thdbs523.tistory.com/142

 

[운영체제/OS] 결정성, 생산자/소비자 프로세스, 경쟁 조건

병행성(concurrency): 여러 개의 프로세스 혹은 스래드들이 동시에 실행되는 것 결정성(determinacy): 동일한 입력에 대한 프로세스 혹은 스래드의 실행 결과는 항상 일정하다. 하지만 상호 영향을 주고

thdbs523.tistory.com