task_struct
구조체 필드 프로세스의 속성 정보를 표현하는 구조체는 task_struct
구조체로 이를 통해 프로세스 정보를 관리한다. ps -ely
같은 명령을 입력했을 때 나오는 정보들도 task_struct
의 필드 정보를 출력한 것이다.
char comm[TASK_COMM_LEN]
: 프로세스의 이름을 저장한다.pid_t pid, tgid
: pid
는 Process ID
의 약자로 프로세스마다 부여되는 정수형 값이다. tgid
는 스레드 그룹 아이디를 표현하는 정수형 값이다. 해당 프로세스가 스레드 리더인 경우는 tgid
와 pid
가 같고, 자식 스레드인 경우 tgid
와 pid
가 다르다.![]() |
---|
unsigned int __state |
프로세스의 실행 상태 정보를 저장하는 필드로 위 삽화의 값들을 가질 수 있다. 대표적으로
TASK_RUNNING
, TASK_INTERRUPTIBLE
, TASK_UNINTERRUPTIBLE
이 있으며 대부분의 프로세스는 TASK_INTERRUPTLBE
상태이다. 시스템에 TASK_RUNNING
과 TASK_UNINTERRUPTLBE
상태인 프로세스가 많다면 이는 시스템에 문제(데드락, 특정 프로세스 스톨)가 있는 경우일 수 있다.
![]() |
---|
unsigned int flags |
프로세스 세부 동작 상태와 속성 정보를 저장하는 필드. PF_XXX
로 시작하는 매크로를 OR
연산한 결과를 저장한다. 대표적으로 다음의 플래그들이 있다:
PF_IDLE
: 아이들 프로세스PF_EXITING
: 프로세스가 종료 중인 상태PF_EXITPIDONE
: 프로세스가 종료를 마무리한 상태PF_WQ_WORKER
: 프로세스가 워크 스레드인 경우PF_KTHREAD
: 프로세스가 커널 스레드인 경우![]() |
---|
int exit_state |
int exit_code |
exit_state
는 프로세스의 종료 상태, exit_code
는 프로세스의 종료 코드를 저장하는 필드이다.
struct task_struct *real_parent
struct task_struct *parent
struct list_head children
struct list_head sibling
여기에서 real_parent
와 parent
필드가 함께 존재하는데, 그 이유는 자신을 생성한 부모 프로세스가 소멸하게 될 경우 parent
가 init
프로세스로 바뀌기 때문이다. 이 경우에는 real_parent
와 parent
가 달라질 수 있다.
![]() |
---|
https://hwchen18546.wordpress.com/2014/04/10/linux-trace-task_struct/ |
children
과 sibling
이 가르키는 대상은 같을텐데 왜 두 개의 필드를 동시에 마련하는지 의문이 들 수 있다. 그 이유는 부모 프로세스도 누군가의 자식 프로세스이기 때문이다.
모든 task 는 task_struct
의 필드 멤버인 tasks
연결 리스트로 연결되어 있다. 이는 copy_process()
과정에서 전역 변수인 init_task
의 tasks
필드로 연결된다.
태스크 디스크립터에는 프로세스의 실행 시각 정보를 알 수 있는 다음의 필드를 제공한다:
u64 utime
u64 stime
struct sched_info sched_info.last_arrival
last_arrival
필드는 마지막에 CPU
에서 실행된 시간을 나타낸다.last_arrival
필드는 sched_info_arrive()
함수에서 초기화한다. context_switch()
함수 내에서 컨텍스트 스위칭을 수행하기 직전에 prepare_task_switch()
함수가 호출되고 이 함수(더 정확하게는 그 아래의 sched_info_switch()
함수)가 sched_info_arrive()
를 호출 하게 된다.