신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

프로세스는 병행하게 또는 병렬로 실행될 수 있습니다.

 

 

 

하지만, 이러한 병행,병렬적인 동작은 데이터의 무결성에 어떠한 문제를 야기 시킬 수 있습니다.

 

어떤 문제가 있을지 알아보겠습니다.

 

Process Synchronization 

Buffer를 가지고 예를 들어 보겠습니다.

 

[생산자 Code]

while(true){
    while(counter == BUFFER_SIZE)
        /* do nothing*/
    ;
 
    buffer[in] = nextProduced;
    in = (in + 1) % BUFFER_SIZE;
    counter++;
}​

버퍼 용량이 꽉차 있으면 "do nothing",

버퍼 용량이 남아 있으면 "item"(data)을 넣고 "counter"를 증가 시킵니다.

 

[소비자 Code]

while(true){
    while(counter == 0)
        /* do nothing*/
    ;
 
    nextConsumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    counter--;
}​

버퍼에 "item"이 없다면 "do nothing",

버퍼에 1개 이상의 "item"이 있다면 그 "item"을 반환 하고 "counter" 를 감소 시킵니다.

 

 

위 2개의 코드를 개별적으로 본다면 아무런 문제도 없어 보입니다.

하지만, 처음에 말했듯이 프로세스는 병행적으로 수행 되기 때문에, 문제가 발생할 수 있습니다.

 

counter++, counter-- 의 수행은 기예어로구현할때

 

reg1 = counter
reg1 = reg1 + 1
counter = reg1​

 

reg2 = counter
reg2 = reg2 - 1
counter = reg2

 

와 같이 구현 됩니다. 이 총 6개의 문장이 순서가 뒤섞여 실행이 된다면, 어떤일이 벌어질까요?

 

 

"item을 넣고 item을 빼는 역할"을 할때

기존 버퍼에 5개의 item이 들어가 있었다고 가정 하겠습니다.

그렇다면 하나의 item을 넣으면 6개가 될테고, 다시 item을 뺀다면 item의 총 개수는 다시 5개가 될겁니다.

 

 

하지만 순서가 뒤섞여서 아래와 같은 순서로 실행된다면

 

reg1 = counter (reg1 = 5)
reg2 = counter (reg2 = 5)
reg1 = reg1 + 1 (reg1 = 6)
reg2 = reg2 - 1 (reg2 = 4)
counter = reg1 (counter = 6)
counter = reg1 (counter = 4)

값은 4라는값이 나옵니다.

 

 

위와 같이 부정확한 값이 나올 수 있습니다. 이런 문제가 발생하는 원인은 무엇일까요?

그건 두개 이상의(여러개의) 프로세스가 동시에 공유변수인 counter 를 참조하고 조작하기 때문입니다.

 

 

동시에 여러개의 프로세스가 동일한 자료를 접근하여 조작하고,

그 실행 결과가 특정 순서에 의존하는 상황을 race condition(경쟁 상황) 이라고 합니다.

 

 

경쟁상황으로 부터 보호하기 위해서는...

한순간에 하나의 프로세스만이 공유변수(counter)에 접근/조작 할 수 있도록 해야합니다.

즉, 로세스간 동기화(Process Synchronization)가 필요한 이유가 되겠습니다.

 

 

 

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기