컨텍스트 스위칭
프로세스 A와 B가 존재한다. A가 running, B는 ready 상태이다. 이 때 어떤 이유로 A가 ready, B가 running 상태가 되는 경우가 곧 발생할 것이다. 먼저 실행 중인 A에 대한 데이터는 현재 레지스터에 존재할 것이다. 그리고 ready 상태인 B는 메모리에 존재할 것이다. 하지만 이제 B가 실행되어야 하기 때문에 A는 레지스터를 B에 양보해주어야 한다. 그리고 A에 대한 데이터는 어떻게 해야할까? 그냥 버리면 될까? 아니다. A에 대한 데이터는 B가 실행을 마친 후에 A가 실행될 수 있으므로 계속 가지고 있어야 한다. 즉, 현재 레지스터에 존재하는 A에 대한 데이터는 메모리에 저장되어야 한다.
<출처: http://www.cs.odu.edu/~cs471w/spring10/lectures/Processes.htm>
마땅한 이미지가 없어서 구글에서 처음 보기엔 복잡해 보이는 이미지를 선택할 수 밖에 없었다. 위 그림에는 P0와 P1 두 개의 프로세스가 있다. 먼저 P0가 실행 중이다. 그러던 중에 interrupt 혹은 system call이 발생하였다.(지금은 프로세스를 멈춰야 하는 상황이 발생하였다 정도로 이해하고 넘어가자) P0은 이제 실행 상태가 아닌 ready(idle) 상태가 된다. P0가 running(excuting) 상태에서 ready(idle) 상태로 변할 때, 프로세스와 실행에 대한 데이터는 레지스터에 존재한다. 이 데이터를 메모리에 저장한다. 이 내용이 위 그림에서 'save state into PCB0'이라고 설명된 부분에 관한 것이다.
위 그림에서 P0 다음에는 어찌저찌 해서(...으로 표시되어 있는 부분) P1이 실행된다. P1이 실행되기 위해서 메모리에 존재하는 P1에 관련된 데이터를 레지스터에 올려야 한다.(reload state from PCB1) P1이 실행되었다가 다시 ready 상태로 변경되면서 자신의 데이터를 메모리에 저장해야 한다.(save state into PCB1)
또 어찌저찌 해서(...으로 표시되어 있는 부분) P0가 다시 실행된다. 앞에서 P0의 데이터는 메모리에 저장해둔 것이 기억나는가? 그 데이터를 읽어서 레지스터에 올리고, P0를 이전 멈추었던 시점에서 이어서 실행한다.
프로세스를 이것저것 우선순위에 따라 변경하기 위해서는 프로세스 데이터를 레지스터와 메모리 사이를 왔다갔다 하며 복사해야 한다. 이런 일련의 과정을 context switching(컨텍스트 스위칭)이라고 한다.
다음 그림은 컨텍스트 스위칭을 잘 보여주고 있다.(윤성우 저 '윈도우 시스템 프로그래밍')
I/O가 생각나는가?
메모리와 레지스터 사이의 데이터 이동도 I/O이다. 즉, 컨텍스트 스위칭 과정에서 I/O가 발생한다. 빈번한 I/O 발생은 overhead를 발생시킨다. 실행되는 process의 수가 많고, 빈번한 컨텍스트 스위칭이 발생한다면, 이는 성능을 떨어뜨린다. 하지만 I/O가 발생할 때, 멍~하게 기다릴 수도 없는 노릇이다. I/O가 발생할 때, CPU를 게속 사용하려면 컨텍스트 스위칭은 피할 수 없다.
잘 보고 갑니다.
답글삭제네, 감사합니다~
삭제