본문 바로가기

나름컴공이라공/Linux Kernel

Linux Kernal Internal > Ch3 태스크 관리(2)

☆★☆2016.01.07 작성☆★☆

☆★☆참고책 _리눅스 커널 내부구조(저자_백승재, 최종무)☆★☆

 

5. 태스크 문맥

* system context

- 태스크 정보 유지 위해 할당한 자료구조

ex) task_struct, 파일 디스크립터, 파일 테이블, 세그먼트 테이블, 페이지 테이블...

* memory context

- text, data, stack, heap 영역, 스왑공간...

* hardware context

- 문맥 교환시, 태스크 현재 실행 위치 정보 유지

 

* task_struct 자료 구조 변수

- /usr/src/linux-headers-3.19.0-25/include/linux/sched.h 에서 확인 가능

① task identification

- 태스크를 인식하기 위한 변수들

ex) pid, tgid, 해쉬 관련 필드 등

② state

- 태스크 생성에서 소멸까지의 상태를 관리하는 state 변수

- TASK_RUNNING(0), TASK_INTERRUPTIBLE(1), TASK_UNINTERRUPTIBLE(2), TASK_STOPPED(4), TASK_TRACED(8), EXIT_DEAD(16), EXIT_ZOMBIE(32)

③ task relationship

- 태스크의 가족관계

ex) 현재 태스크를 생성한 부모 태스크의 task_struct을 가르키는 real_parent 필드,

현재 부모 태스크의 task_struct을 가르키는 parent 필드

④ scheduling information

- 스케줄링 관련된 변수

ex) prio, policy, cpus_allowed, time_slice, rt_priority 등

⑤ signal information

- 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘

⑥ memory information

- 태스크는 자신의 명령어와 데이터를 text, data, stack, heap 영역에 저장 -> 이 공간에 대한 위치와, 크기 접근 제어 정보 등을 관리하는 변수

⑦ file information

- 태스크가 오픈한 파일들은 task_struct에서 files_struct 구조체 형태인 files라는 변수형태로 접근 가능

⑧ thread structure

- 문맥 교환을 수행할 때 태스크가 현재 어디까지 실행되었는지 기억해놓는 공간

⑨ time information

- 태스크의 시간 정보를 위한 변수

ex) start_time, real_start_time 등

⑩ format

- 리눅스는 지원가능한 도메인에서 컴파일 된 프로그램도 재 컴파일 없이 수행 가능

⑪ resource limits

- 태스크가 사용할 수 있는 자원의 한계를 의미(배열로 구현, 최대 16개의 한계 설정 가능)

 

6. 상태 전이와 실행 수준 변화

* 상태 전이 : 당장 제공해 줄 수 없는 자원을 요청했을 떄, 대기 후 다시 수행하는 것

* 상태 전이 종류

① 태스크 종료하고 exit()함수 호출 시, 태스크에 할당되어있던 자원을 커널에 반납한 상태로 전이 EXIT_ZOMBIE

이 상태에서 부모 태스크가 wait()함수 호출, 자식 태스크의 상태는 EXIT_DEAD로 전이

부모는 자식 태스크의 정보를 갖고, 자식의 자원은 모두 반환하고 최종 종료

(자식보다 부모가 먼저 죽으면, 고아 태스크의 부모를 init태스크로 바꾸고, 최종 종료)

② TASK_RUNNING(running) 상태에서 수행 중이던 태스크가 할당된 자원을 모두 사용 or 높은 우선순위 태스크로 인해 TASK_RUNNING(ready) 상태로 전이

③ 정지 신호를 받은 태스크는 TASK_STOPPED 상태로 전이

sigcont 신호를 받으면 다시 TASK_RUNNING(ready) 상태로 전환

④ TASK_RUNNING(running) 상태에 있던 태스크가 요청 완료를 기다리거나 자원 대기해야 할 필요가 있으면 TASK_INTERRUPTIBLE 상태로 전이

 

* TASK_RUNNING(running) 실행 권한에 따른 상태

- 사용자 수준의 실행(프로그램, 라이브러리 함수 수행 상태)

- 커널 수준의 실행(커널 프로그램 일부분 수행 상태)

- 사용자 수준의 실행 < 커널 수준의 실행

 

* 사용자수준에서 커널 수준으로의 전이 방법

- 시스템 호출의 사용

: 태스크가 시스템 호출시, 리눅스의 커널에 트랩이 걸리고, 태스크의 상태가 커널 수준의 실행 상태로 전이되어 커널의 시스템 호출 처리 루틴으로 제어가 넘어감

- 인터럽트의 발생

: 인터럽트가 발생하면 리눅스 커널에 인터럽트가 걸리고, 실행 중이던 태스크가 사용자 수준에서 동작하고 있으면 커널 수준의 실행 상태로 넘어감

 

* thread_union 스택

- 리눅스는 c와 어셈블리로 작성되었기 때문에 스택이 필요

- 태스크 생성시 task_struct 구조체와 8KB 스택 할당

 

- 프로세스 디스크립터 thread_info를 포함하고 task_struct가르키는 포인터(*task), 스케줄링 필요성 여부 플래그, 태스크의 포맷 필드 포함

- 작업 시 사용자와 커널 수준의 변화 작업 상황은 pt_regs(레지스터)에 저장