커널

12. 라즈베리파이 - 태스크 디스크립터(2)

corin13 2025. 7. 12. 11:34

sched.h 다시 열고 785, task_struct 이동

 

내리다 보면 pid 부분이 나옴

 

1026 pid, 프로세스의 id 담기는

1027, tgid : 쓰레드 그룹의 id 담기는

 -> 현재 프로세스가 쓰레드 그룹의 리더인 경우 값이 같음

 

793, __state : 프로세스의 실행 상태를 보여줌

807, flags :  프로세스의 세부 동작의 상태와 속성을 저장중

793, __state 807, flags 짝을 이룬다.

 

sched.h 열기

 

__state 들어갈 있는

TASK_RUNNING : CPU에서 실행중이거나 런큐에 대기중인 상태

TASK_INTERRUPTIBLE : 휴면 상태, 실행 재개 가능, cpu 점유 하는상태

TASK_UNINTERRUPTIBLE : 일반적인 시그널로는 깨어나지 못하는 상태 -> 일반적이지x

TASK_STOPPED : 프로세스가 정지된 상태. 일반적으로 프로세스가 디버거에 의해 정지되거나 시그널을 받아 실행이 중단된 상태

TASK_TRACED : 디버깅 중이거나 추적(traced) 중임을 나타냄. 일반적으로 디버거 같은 프로세스가 해당 프로세스의 실행을 감시하고 있을 나타남

=> 리눅스 시스템에서 확인되는 대부분은 TASK_INTERRUPTIBLE이며, TASK_RUNNING TASK_UNINTERRUPTIBLE 비정상적으로 많으면 시스템에 문제가 있는 경우가 많음

 

이외에도 EXIT이나 TASK_DEAD 다양한 상태에 따른 값이 나옴

 

flags 들어갈 있는 (플래그 설명은 주석 참고)

개만 살펴보면

PF_IDLE : IDLE 쓰레드 -> 작업을 하지 않는 쓰레드

PF_EXITING : 프로세스가 종료 과정에 있음

PF_WQ_WORKER : 워크 작업을 처리하는 쓰레드

PF_KTHREAD : 커널 쓰레드임

 

사용

linux/drivers/tty/sysrq.c 열기

 

357, send_sig_all : 모든 프로세스에게 시그널을 보내는 함수?

커널 쓰레드와 init(systemd) 프로세스의 경우 continue 시그널을 보내지 않음

 

 

다시 sched.h task_struct 돌아와서 932, exit_state

 

exit_state : 프로세스 종료 상태를 저장

3개의 상태가 존재

 

 

1040, real_parent : 처음 생성 당시 부모 프로세스의 태스크 디스크립터

1043, parent : 현재 부모의 태스크 디스크립터

자신을 생성한 프로세스가 살아있으면 real_parent parent 같음

부모 프로세스가 죽으면

do_exit -> exit_notify -> forget_original_parent -> find_new_reaper

과정을 통해 새로운 부모 프로세스를 지정

 

child부분을 보면 list_head 정의됨

부모 프로세스가 자식 프로세스를 생성할 연결 리스트의 자식 프로세스에 연결

부모가 여러 프로세스를 생성했으면 sibling 프로세스로 연결

 

list_head 아래에 정의

 

*next, *prev 같는 구조체

 

 

모든 프로세스는 tasks 연결됨

언제? copy_process

 

fork.c 열기

 

2142, copy_process에서 내리기

2596 task 내리면 task 연결하는 부분이 나옴

현재 태스크를 init_task.tasks 연결

 

 

1077, utime : 유저 모드에서 프로세스가 실행한 시각을 나타냄

1078, stime : 시스템 타임, 커널모드에서 프로세스가 실행된 시각

cputime.c 열기

 

utime 세팅

 

cputime 넣어 세팅하는 부분

u64 쓰면 보통 나노초를 말함

 

stime 세팅

 

다시 돌아가서 sched_info

920, sched_info : 프로세스의 스케줄링 정보를 저장

 

pcount : 특정 cpu에서 프로세스가 실행됐는지 카운팅

run_delay : 런큐에서 대기한 시간

last_arrival : 프로세스가 마지막에 cpu에서 실행된 시간

last_queued : 마지막으로 실행을 위해  대기열에 올라온 순간의 시간

 

stat.h 열기

 

last_arrival 검색 // sched_info_arrive context_switch 수행 직전에 호출

271 줄에 now 설정하는 부분이 보인다

 

core.c 열기

 

context_switch 검색

prepare_task_switch 호출

 

prepare_task_switch에서 sched_info_switch 호출

 

stat.h 열기

 

sched_info_switch에서 sched_info_arrive 호출하는 것을 있음

 

 

context_switch -> prepare_task_switch -> sched_info_switch -> sched_info_arrive 순으로 호출됨