Chapter 2, Process Management and Scheduling


2.2.1 Preemptive Multitasking
 Linux process 관리 구조를 알기 위해서는 process 실행의 두가지 모드를 알아야한다.(kernel mode와 user mode) 요즘 출시되는 CPU들은 최소한 두가지 다른 실행 모드가 존재하며, 한가지는 제한이 없는 권한을 가지고 실행되며 다른 한가지는 다양한 제한이 걸려있는 상태로 실행된다는 것이다.(제한이 있다는 것에 예를 들면, 특정 물리 메모리 영역을 접근하는 것 등이 될 것이다.) 이런 구분은 시스템의 어떤 한 부분을 간섭하는 것을 보호하고 시스템에 존재하는 process들을 잡아(?-다른 process들에게 넘어가거나 접근하는 것을 막는다는 뜻인가) 둘수있는 잠겨진 "새장과 같은" 것을 생성해줘야 한다. 

일반적으로 kernel은 자신이 가지고 있는 data 만 접근 가능하고 시스템에 있는 다른 application에게 간섭할 수 없는 user mode 안에 있다.(이 부분은 무슨 말인지 써놓고 무슨말인지 확실치 않다.)

만약 한 process가 system data나 함수들의 접근을 원한다면(후자는 모든 process들 사이에 공유된 자원을 관리한다, 예- filesystem 영역) 반드시 kernel mode로 변경하여 수행해야 한다. 물론 kernel mode에서 통제되고(만약 그렇지 않으면, 현재 만들어진 보호 매커니즘이 모두 불필요해지는 것이다. ) 명확히 정해진 루틴으로 실행되어야 한다. 이와 같은 것은 system call 이라는 특별한 함수를 통해 이루어진다. 자세한 사항은 13장에서 더 자세히..

user mode로 부터 kernel mode로의 전환은 interrupt에 의해서도 일어난다.(이것은 interrupt 발생시 자동으로 전환된다.) user application에서 의도적으로 호출되는 system call(system data나 함수를 이용 목적을 위해)과는 달리 독단적(?)으로 수행된다. -의도되지 않은 상태에서 발생함- interrupt의 발생은 현재 process실행과 무관하게 처리해 줄 수 있어야 한다. 예를 들면, 외부 블럭(block) 장치에서 요청한 data를 RAM 으로 복사 완료되면 이 data가 시스템의 어떤 process를 위한 것이었던 간에 interrupt는 발생하게 된다. 비슷하게, network 장치에서도 interrupt를 통해 data package 도착을 알려주게 된다. 반면, network으로 들어온 package는 interrupt를 받아 처리함에 있어 그 data는 현재 수행되고 있는 process에게 전달 된다.(외부 블럭 예제와는 다른 경우 인 것이다.) Linux는 interrupt를 다르게 처리를 하지만, 수행되고 있는 process들은 이같은 상황을 모르고 자신의 작업을 진행한다. 

Kernel의 선점 scheduling 모델은 어떤 상태의 process가 interrupt를 받는지에 대한 구조를 만들어 두었다.

□ Normal Process는 항상 interrupt를 받을 수 있다.(다른 process에 의한 interrupt 발생조차도 다 받는다). 중요한 process(오랫동안 keyboard 입력을 기다리는 편집기 등)
가 실행 상태가 되면 scheduler는 즉시 실행 할 것인지에 대한 결정을 내린다. 현재 그 process가 수행중일 때도 그 같은 고려를 한다. 이와 같은 선점은 시스템의 응답시간을 높이는데 중요한 역할을 했다.

□ 만약 kernel mode에서 system call을 수행하고 있을 때, 어떤 process도 CPU 사용을 취소할 수 없다. 즉, scheduler는 다른 process를 선택하기 이전에 system call의 수행을 완료를 해야한다는 것이다. 하지만 system call은 interrupt에 의해 잠시 보류될 수 있다. 

□ Interrupt는 user mode와 kernel mode에 있는 process들을 중지할 수 있다. 그것은 interrupt가 발생한 시점 부터 가능한한 빨리 처리해야 하는 중요한 것이기 때문에 가장 높은 우선순위를 가진다. 

Kernel 선점은 2.5 버전 개발을 진행하면서 선택사항으로(make menuconfig 수행된 메뉴) 추가되었다. 이 선택사항(option)은 kernel mode에서 system call을 수행 중일 때에도 급히(?) 처리해야 하는 다른 process가 생기면 교체될 수 있는 기능인 것이다.(물론 interrupt 핸들러가 수행중일 때는 불가하다.) 비록 kernel이 system call을 최대한 빨리 수행을 마쳐야 함에도 불구하고(빨리 수행해야하는 이유는 scheduler가 system call을 마무리 하여 다른 process의 수행권을 보장하고 진행하기 위함) 신뢰성있는 어떤 application들은 일정한 data 스트림을 요구하여 많은 시간이 필요하게 되는 경우가 있다. kernel 선점은 이와 같은 대기 시간을 줄이고 부드러운(?) program 실행을 가능하게 한다. 하지만 선점 기능은 하나의 CPU를 가진 시스템에서 병렬적인 접근이 많아지고 이것을 보호하기 위해 많은 data structure가 요구되기 때문에 증가된 kernel 복잡성으로 비용이 증가하게 된다. (향후, 2.8.3 장에서 자세히 다룬다.)

+ Recent posts