<병행(Concurrent)이란?>

같이 존재하고 있다는 뜻이며, 메모리에 다수의 프로세스가 같이 존재한다는 것을 의미한다.

한 개의 CPU가 있는 단일처리 시스템에서는 병행 프로세스 중 한 개만이 실제로 실행되지만 CPU의 처리 시간을 효과적으로 나눔으로써 겉으로는 병행 프로세스들이 동시에 처리되는 것이다.

병형과 병렬(Parallel)은 다르다. 병렬은 다중처리 시스템의 경우 여러 개의 프로세스가 동시에 실행하는 것을 말한다.


병행 프로세스들이 서로 간에 비동기적(Asynchronous)이라는 말은 다른 프로세스들이 어떤 상태에 있는지, 어떤 자원을 가지고 있는지, 어디까지 실행됐는지 등에 대해 모른 체 실행되고 있음을 의미한다.


공유된 자원이나 데이터에 대해 병행 프로세스들이 따라야 하는 룰이란 한 번에 한 프로세스만이 접근하도록 하고, 해당 자원에 대해 의도했던 실행을 완료하도록 보장 한다는 것을 의미한다.



ex1) 메모리에 있는 변수 count는 현재 값이 10이며, 프로세스 A는 이 값을 하나 증가시키는 일을, 프로세스 B는 하나 감소시키는 일을 한다고 하자.두 프로세스가 한 번씩 실행되었을 때의 결과 값은 누가 먼저 실행되든 여전히 10이어야 할 것이다.


A의 경우 먼저 메모리에서 count 값을 읽어 처리기 레지스터로 넣은 다음 1을 더하고 난 후, 처리기 레지스터에 들어 있는 결과 값 11을 메모리의 count 변수에 저장함으로써 실행을 완료한다.

여기서 중요한 점은 결과 값 11이 저장되기 전까지는 메모리의count 값이 10인 것을 명심하자.

B 역시 1을 뺀다는 것 외에는 A와 동일한 절차를 밟게 될 것이다.

정상적으로 실행됨을 가정하고 A가 먼저 실행되었을 경우 count11이 된 후 B에 의해 다시 10이 될 것이며, 반대로 B가 먼저 실행되었다면 9가 된 후 A에 의해 10이 될 것이므로 두 경우 모두 정확한 결과를 낳는다는 것을 알 수 있다.



ex2) 공유 변수 count에 대해 AB가 아무 제약 없이 실행되도록 했을 경우를 떠올려 보자.

먼저 Acount 값을 11로 증가시킨 후 저장하기 전에 CPU의 사용권이 B에게 넘겨진 후, Bcount에 대한 접근이 허용되면 B1을 빼기위해 먼저 메모리에 있는 count 값을 읽어오게 될 텐데 이때의 값은 여전히 10일 것이다.


B에 의해 9가 저장된 후 다시 A가 실행되면 이전에 CPU를 뺏긴 시점부터 시작할 것이고 결과적으로 처리기 레지스터에 있는 값 11을 저장하게 되어 count의 최종 값은 11이 될 것이며, 반대로 AB의 순서를 바꾸면 9가 저장될 것이다.


다중처리 시스템의 경우에는 두 프로세스가 동시에 실행될 수 있으므로 둘 다 10을 읽고 각자의 실행 결과를 저장하게 될 것이고, 결국 count의 최종 값은 조금이라도 늦게 저장하는 프로세스의 결과 값과 같이 11또는 9가 될 것이다.


, 한 프로세스의 공유 변수 count에 대한 조작 도중 다른 프로세스에게도 count에 대한 조작이 허용되면 부정확한 결과 값을 초래하게 된다.

다시 말해, 단일처리 시스템의 경우 정확한 결과 값을 위해서는 Acount에 대한 조작 도중 CPUB로 넘겨지더라도 Bcount에 대한 조작은 허용되어서는 안 된다는 점이다.



<상호배제>

프로세스들이 공유 데이터에 대해 서로 접근을 시도하는 상황을 경쟁 상태(Race Condition)라 한다.

경쟁관계에 있는 프로세스들로 인해 상호배제, 교착 상태(Deadlock), 기아(Starvation)와 같은 문제 발생한다.

, 상호배제란 한 번에 하나의 프로세스만이 임계영역에 들어가야함을 의미한다.

한 프로세스만 임계구역에 진입하고, 다수의 프로세스들이 하나의 공유 자원을 상호 배타적으로 사용할 수 있게 하면서 동시에는 수행할 수 없도록 한다.



 

다음 그림에서 트랙잭션 실행 순서에 따라 account 값은 10,000, 20,000, 0 원일 수 있다.

공유 변수(account)를 접근하고 있는 하나의 프로세스 이외에는 다른 모든 프로세스들이 공유 변수를 접근하지 못하게 제어하는 기법을 상호 배제라 한다.

 



 

<임계영역(Critical Section)>

두 개 이상의 프로세스가 동시에 사용할 수 없는 자원(임계자원(Critical Resource))에 대해 접근하고 실행하는 프로그램내의 코드 부분이다.

프로세스가 공유자료를 변경하는 영역이고,

하나의 프로세스만 공유 데이터에 접근하고 나머지 프로세스들은 공유 데이터에 접근할 필요가 있더라도 기다려야 한다.

임계구역은 가능한 한 빨리 수행되어야만 하며, 프로세스가 임계구역에 들어간 후 프로세스가 블럭 상태로 되어서는 안 된다.


[임계 영역 진입 순서]

임계영역에 들어가고자 하는 프로세스는 먼저 임계영역 내 다른 프로세스가 있는지를 확인

확인한 후 있다면 기다리고, 없다면 들어가면서 자신이 나올 때까지다른 프로세스가 들어오지 못하도록 한다.

임계영역을 벗어날 때는 자신이 나오는 사실을 알려 다른 프로세스가 들어올 수 있도록 한다.



Copyright2014 By 휴먼사이언스

 

posted by 경원구