데이터를 활용해 명령어에 따라 실행을 하는 실행 장치는 다음과 같은 과정으로 데이터를 가져오고, 실행 후 저장한다.

①메모리에서 데이터를 가져온 뒤, ②데이터를 활용해 명령어에 따라 실행한다. ③실행 결과를 다시 메모리에 저장한다.

이 과정에서 같은 데이터를 가져오려는 실행장치가 여러 개이면 어떤 실행장치가 해당 데이터를 먼저 가져가고, 결과를 먼저 저장했는지에 따라

결과가 달라질 수 있다는 문제가 발생한다. 


먼저 예시1)은 사용자가 기대하는 기대하는 결과값이 storage box에 저장되는 경우이다. 

예시 2)는 데이터 로드 순서, 실행 순서가 섞이면서 오류가 난 경우이다. 


예시1)

            

(a) A에서 storage box에 있는 데이터 5를 로드한다.

(b) A를 실행 한 결과 값 6 이 storage box에 저장되고, 이 값을 B에서 로드한다.

(c) C를 실행 한 결과 값 5 가 storage box에 저장되어 최종 값은 5가 된다. 

  


예시2)

         


(a) A가 storage box에 있는 데이터 5를 로드한 뒤, A가 실행되기 전 B가 storage box에 있는 데이터 5를 로드한다.


(b) A가 실행된 후 결과 값인 6이 storage box에 저장된다.


(c) B가 실행된 후 결과 값인 4가 storage box에 저장된다. 

          


위에 나타난 예시처럼 하나의 저장공간을 여러 프로그램들이 공유하여 사용하는 경우 결과 값이 달라질 수 있으며 

이러한 상황을 race condition (경쟁 상태) 이라고 한다. 


race condition이 발생할 수 있는 경우는 다음과 같다. 


a. kernel 수행 중 인터럽트 발생시 

b. process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어난 뒤 다른 process에서도 system call을 하여 kernel mode를 수행할 경우

c. multiprocessor에서 shared memory 내의 kernel data




a. kernel 수행 중 인터럽트 발생시






커널모드에서 count++을 수행하게 되면 세단계를 거친다.

① 메모리에서 cpu레지스터로 count값을 load

② cpu에서 count값 증가

③ 증가 시킨 값을 메모리에 저장


이 과정에서 인터럽트가 중간에 걸려 count값을 감소하는 코드가 실행된다면, 최종 결과값은 기존 count 값이어야 한다. (kernel:count++)+(interrupt:count--)=count

그런데 결과값은 count에서 1증가한 count+1값이 나온다.

그 이유는 interrupt에서 count값 감소 전에 이미 kernel에서 cpu레지스터로 count값을 load해 갔기 때문이다.


해결방법: kernel mode에서 수행 중에는 interrupt disable로 설정



b. kernel모드에서 context switch가 발생하는 경우





각 프로세스는 자신만의 address space를 가지고 있어 data sharing이 없다

그러나 system call을 통해 kernel mode에서 프로세스 수행시에는 kernel address space의 data를 access하게 된다.

이 작업 중간에 CPU를 다른 프로세스에서 preempt해서 이 프로세스가 kernel mode에서 수행하게 되면 race condition이 발생하게 된다. 



프로세스A에서 커널모드로 수행 중 increment 수행을 하기 위해 데이터를 load하고나서, 

프로세스A의 할당 시간이 끝나고 다른 프로세스에게 CPU할당이 되어야 한다. 

프로세스B가 CPU할당을 받은 뒤에 커널모드에서 increment를 수행한다. 예상결과 값은 기존 count에서 2증가한 count+2 지만 1만 증가한 상태가 된다.


해결방법: 커널모드에서 수행 중일 때는 할당시간이 끝나도 CPU를 preempt하지 않음. 커널모드에서 사용자 모드로 돌아갈 때 preempt한다. 



c. multiprocessor에서 shared memory 내의 kernel data




어떤 CPU가 먼저 count값을 load하고 언제 load하느냐에 따라 결과 값이 달라질 수 있다.


해결방법: (1) 한번에 하나의 CPU만이 커널에 들어갈 수 있게 하는 방법

             (2) 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 lock/unlock을 하는 방법

                  : 처음에 접근한 CPU가 공유데이터를 가져갔을 때 그 데이터에 lock을 걸어서 다른 CPU가 가져가지 못하게 하고 

                   먼저 접근한 CPU가 처리를 끝내고 저장하고 나서는 unlock을 해서 다른 CPU가 공유데이터를 가져갈 수 있도록 한다.



'컴퓨터 공부 > 운영체제' 카테고리의 다른 글

network  (0) 2016.03.28
1. 컴퓨터 시스템 구조와 프로그램 실행  (2) 2016.01.16

+ Recent posts