(1) 상태 전이와 실행 수준 변화
: 특정 태스크가 당장 제공해 줄 수 없는 자원을 요청한다면 커널은 이 태스크를 잠시 '대기' 하도록 만든 뒤 다른 태스크를 먼저 수행시키며, 태스크가 요청했던 자원이 사용가능해지면 다시 '수행'시켜 줌으로써 보다 높은 시스템 활용을 제공한다.


○ EXIT_ZOMBIE 상태
: 태스크가 자신이 해야할 일을 다 끝내고 exit()호출하여 그 태스크가 유지하던 자원을 대부분 커널에게 반납한 상태이며, 단지 자신이 소멸된 이유 / 사용한 자원의 통계 정보를 부모 태스크에 알리기 위해 유지하고 있는 상태.

○ EXIT_DEAD 상태
: ZOMBIE 상태에서 부모 태스크가 wait() 등의 함수를 호출하여 자식의 정보를 가져가고, 지원을 모두 반납한 상태.

※ 부모태스크가 먼저 죽으면 부모 태스크는 init 태스크로 바뀌고, 주기적으로 좀비 태스크를 없애기 위해 wait()함수를 호출한다.

○ TASK_RUNNING 상태
:  실제 수행중인 태스크의 상태 (running)과 수행되던 태스크가 자신에게 할당된 CPU 시간을 모두 사용하여 다시 준비중인 상태(ready)

○ TASK_INTERRUPTIBLE 상태
: 실행 상태에 있던 태스크가 특정한 사건을 기다려야 할 대기상태로 전환되어 기다리는 사건에 따라 특정 큐(queue)에 매달려 대기중인 상태. 대기하는 동안 자신이 기다리는 그 사건 외에는 일체 방해받아선 안되는 경우가 있을 수 있는데 이 경우가 TASK_UNINTERRUPTIBLE이다. 이후에 기다리고 있던 사건이 발생하면 대기 상태에 있던 태스크가 다시 준비(ready)상태로 전이하게 되며 다시 다른 태스크들과 함께 스케줄링 되기 위해 경쟁한다.


(2) TASK_RUNNING(running) 상태의 수준
: 실제로 실행중인 TASK_RUNNING(running) 상태는 다시 사용자 수준 실행 상태와 커널 수준 실행 상태로 구분할 수 있다.

○ 사용자 수준 실행 (user level running)
: CPU에서 사용자 수준 프로그램의 제작자가 만든 프로그램이나 라이브러리 함수를 수행하고 있는 상태로 사용자 수준의 권한으로 동작.

○  커널 수준 실행 (kernel level running)
: CPU에서 커널 프로그램의 일부분을 수행하고 있는 상태로, 사용자 수준 권한보다는 더 강력한 커널 수준 권한으로 동작.

※ 사용자 수준에서 커널수준 실행상태로 전이하는 방법
: 시스템 호출을 사용한 방법과 인터럽트를 발생 시키는 방법이다.


(3) 커널 수준의 프로그램
: 커널 수준의 프로그램은 바로 리눅스 그 자체이다. 리눅스도 C와 어셈블리로 작성된 소프트웨어기 때문에 수행되기 위해서는 스택을 피요로 한다. 


- 리눅스 커널은 태스크가 생성될 때마다 태스크 별로 task_struct 구조체와 8KB의 스택을 할당해 준다.
- 8KB의 스택은 thread_union이라 불리며, thread_info구조체도 포함되어 있다. (프로세스 디스크립터)
- Pt_regs는 수행을 마친 태스크가 사용자 수준 실행상태로 복귀하기 이전 수행 작업에 대한 정보가 저장된다.


by 민트앤라떼 2012. 6. 25. 13:33