Chapter 2, Process Management and Scheduling


2.2 Process Life Cycle
 하나의 Process는 항상 실행 준비가 된 상태가 아니다. 때때로, Process는 외부 자원의 event 를 기다리고 있는 경우가 있다.(text 편집기에서 keyboard 입력 대기를 위한 경우). 이런 경우는 event(keyboard 입력)이 있을 때까지 process는 실행 될 수 없다. 

scheduler는 process들의 교체를 할때 시스템에 있는 모든 Process의 상태를 알고 있어야 한다. 이는 할일이 없는 process임에 불구하고 CPU 시간을 할당하는 일은 없어야 한다는 것이다. 시간 할당과 중요한 점은 각 process의 상태를 전환(예, 실행 상태 --> 대기상태)시키는 일이다. 예를 들어, 만약 하나의 process가 주변 장치의 data를 기다리고 있다면, scheduler는 process의 상태를 data가 도착할 때까지 실행 대기 상태로 변경해줘야 한다. 

하나의 process는 다음과 같은 상태를 가진다
□ Running -- Process는 실행 중이다. 
□ Waiting  -- Process는 실행 가능한 상태이지만 CPU 를 다른 process가 점유하여 사용 중이기 때문에 기다리는 상태이다. 이 상태의 process 는 scheduler에 의해 다음으로 실행 가능하다. 
□ Sleeping -- Process는 잠든(?) 상태이고, 수행될 수 없다. 외부 장치에 의해 data나 event를 기다리고 있는 상태이며, process가 event를 받기 전까지 scheduler가 선택할 수 없다. 

시스템은 하나의 process table에 그것들의 상태들과 관계없이(running, waiting, sleeping) 모든 process들을 저장한다. 그렇지만, sleeping 상태의 process는 scheduler가 실행 준비가 되지 않은 상태을 알고 있어야 함으로 특별히 "표시"를 해 둔다. 또한 외부 event를 기다리고 있는 process가 event가 발생시 적절한 시점에 깨어나 수행할 수 있도록 다수의 Queue 로 관리하고 있다. 

그림 2-2

실행 가능한 process의 queue에 다양한 상태전의를 알아보도록 하자. 하나의 process가 실행 가능한 상태이지만, 다른 process가 CPU를 점유하고 있는 상태라 CPU를 사용하기 위한 대기 상태이다. (이것의 상태는 "Waiting" 이다). 그것은 scheduler가 CPU 시간을 할당 할 때까지 "waiting" 상태로 남아있을 것이다. 일단 scheduler가 선택을 하면, 그 process의 상태는 "running"으로 바뀔 것이다. (그림 2-2 의 4번 전이)

scheduler가 process의 CPU 자원 사용을 그만 두게 하기로 결정했다면, 그 process의 상태는 "running"에서 "waiting"으로 변경된다. (그림 2-2 의 2번 전이), 그리고 새롭게 cycle을 시작한다. "Sleeping" 상태는 두 가지 경우가 있는데, 하나는 signal을 받아 방해(interrupt) 받을 수 있는 것과 그렇지 못한 것이다. 이시점에서는 sleeping의 경우의 수는 다루지 않는다. 

만약 process가 event를 기다리고 있는 상태라면, 그 process의 상태는 "running"에서 "sleeping" 상태로 변경된다. 하지만, sleeping 상태의 process는 바로 running 상태로 변경이 이루어지지 않는다. 일단 기다리던 event가 발생했을 경우, 그 process는 waiting(그림 2-2의 3번 전이)로 변경되고 다음 번 실행을 기다리게 된다. 

Program 실행이 종료되면(사용자가 application을 종료한 경우 등), process의 상태는 running에서 stopped로 변경된다(그림 2-2  에서 5번 전이)

위에 설명되지 않은 process의 특별한(?) 상태가 있는데, 그것은 "zombie" 상태이다. 이름에서도 알수 있듯이, process가 죽었지만 어찌된 영문인지 여전히 살아있는 상태로 보이는 것이다. 다시 말하면, 그 process들은 사용하던 자원(RAM, 주변장치의 연결 등)을 반납하고 다시는 실행될 수 없는 상태로 소위 죽은 것이다. 그렇지만 process table에 그것들을 위한 공간이 존재하기 때문에 살아있는 것처럼 보인다는 것이다. 

Process가 Zombie 상태로 들어가는 경우는, UNIX 시스템의 process 생성과 종료 구조에 관련되어 있다. 하나의 program가 종료하는 상태는 두 가지가 있다.. 한가지는, 다른 process나 사용자에 의해서 강제 종료되어지는 경우다.(이런 경우는 대게 SIGTERM 이나 SIGKILL signal을 종료대상 process에게 전달되어 이루어진다.-이는 process가 일반적으로 종료하는 경우와 동등한 효과를 가진다), 다른 한가지는, child process가 종료되는 시점에 parent process가 이미 wait4 시스템 콜을 실행하여 child의 종료상태를 parent가 받는 경우이다. 결국 parent process가 child의 종료상태를 인지하고 kernel에게 알려줘야 한다는 것이다. 그 시스템 콜은 child process에게 할당된 자원을 kernel이 해제해주게 된다. 

위에 기술했던 상황 모두 zombie 상태는 발생하게 된다. 하나의 process는 종료와 process table에서 제거되는 시점 사이에 잠시 zombie 상태를 거처간다. 어떤 경우는(parent process가 잘못 구현되어 wait 시스템 콜을 호출하지 않고 종료한 경우), child process가 종료상태를 parent에 알려주지 못한 상태에서 종료를 하여 썼던 자원은 해제가 되었겠지만 시스템의 다음 rebooting 까지 process table을 차지 할 수 있다.(zombie 상태로 오래 남아있는 경우다) 이것은 pstop 명령어로 확인 될 수 있다. process table에 남아 있는 zombie 상태는 kernel의 아주 작은 영역을 차지하고 있어 큰 문제가 되질 않는다. 


* Site
1. Linux kernel newbies
   Comment : 간략하게 둘러본 결과, 각종 문서의 링크가 잘 정리 되어 있고 "FAQ" 을 보면 kernel compile 방법에서 부터 참고할 만한 것이 있다. 

2. LinuxChix Kernel Hacking Lessons 

3. Linux Kernel Mailing list
   URL : https://lkml.org/
   Comment : bug 및 patch 사항

4. Linux Weekly News
   URL : http://lwn.net/
   Comment : Linux Weekly News 이다. 여기는 매주 업데이트 되지만, 구독을 하지 않는다면 한주전의 사항만 확인 가능하다. 

* 도서

1. Linux Kernel in a Nutshell
    - Greg Kroah-Hartman, O'Reilly Media, Inc. (December 14, 2006)
    - kernel build 및 간략한 개발 방법 등.
    - E-book (pdf version) 등을 검색하여 얻을 수 있다.

2. Understanding the Linux Kernel, 3rd Edition
    - Daniel Bovet, Marco Cesati, O'Reilly Media, Inc. (November 14, 2006)
    - 내용이 방대하고 자세히 나온 책, 차근차근 읽어 나가기엔 너무 지루 한듯.
      발췌용으로 자세히 알고 싶은 부분을 중점으로 읽으면 좋을 듯하다.
    - 한글판이 있음, E-book (pdf version) 등을 검색하여 얻을 수 있다.

3. Linux Kernel Development, 3rd Edition 
    - Robert Love, Addison Wesley (2010)
    - 적당한 분량의 책, 물론 읽기에는 조금 벅찬 듯
    - 2rd Edition은 한글판을 본 듯 한데, 3rd Edition은 모르겠음. 

4. Linux Device Drivers
    - Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman

5. Professional Linux Kernel Architecture
    - Wrox, Wolfgang Mauerer
    - 현재 틈틈히 보고 있는 책, 책의 분량은 방대하며 소스 레벨에서 하나 하나 설명해 놓은 책, 정리하며 봐야 할듯 
      - E-book (pdf version) 등을 검색하여 얻을 수 있다.

+ Recent posts