[리눅스 커널 구조 원리] #5. 태스크

문연수·2025년 3월 18일
0

1. task_struct 구조체 필드

 프로세스의 속성 정보를 표현하는 구조체는 task_struct 구조체로 이를 통해 프로세스 정보를 관리한다. ps -ely 같은 명령을 입력했을 때 나오는 정보들도 task_struct 의 필드 정보를 출력한 것이다.

- 핵심 필드 정보

* 기본 필드

  • char comm[TASK_COMM_LEN]: 프로세스의 이름을 저장한다.
  • pid_t pid, tgid: pidProcess ID 의 약자로 프로세스마다 부여되는 정수형 값이다. tgid 는 스레드 그룹 아이디를 표현하는 정수형 값이다. 해당 프로세스가 스레드 리더인 경우는 tgidpid 가 같고, 자식 스레드인 경우 tgidpid 가 다르다.

* 프로세스 상태

unsigned int __state

 프로세스의 실행 상태 정보를 저장하는 필드로 위 삽화의 값들을 가질 수 있다. 대표적으로
TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE 이 있으며 대부분의 프로세스는 TASK_INTERRUPTLBE 상태이다. 시스템에 TASK_RUNNINGTASK_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 는 프로세스의 종료 코드를 저장하는 필드이다.

2. 프로세스 간의 관계

  • struct task_struct *real_parent
    자신을 생성한 부모 프로세스의 태스크 디스크립터 주소를 저장하는 필드
  • struct task_struct *parent
    부모 프로세스의 태스크 디스크립터 주소를 저장하는 필드
  • struct list_head children
    부모 프로세스가 자식 프로세스를 생성할 때 등록하는 연결하는 연결 리스트.
  • struct list_head sibling
    같은 부모 프로세스로 생성된 프로세스의 연결 리스트의 주소를 저장하는 필드.

 여기에서 real_parentparent 필드가 함께 존재하는데, 그 이유는 자신을 생성한 부모 프로세스가 소멸하게 될 경우 parentinit 프로세스로 바뀌기 때문이다. 이 경우에는 real_parentparent 가 달라질 수 있다.

https://hwchen18546.wordpress.com/2014/04/10/linux-trace-task_struct/

childrensibling 이 가르키는 대상은 같을텐데 왜 두 개의 필드를 동시에 마련하는지 의문이 들 수 있다. 그 이유는 부모 프로세스도 누군가의 자식 프로세스이기 때문이다.

3. 프로세스 연결 리스트

 모든 task 는 task_struct 의 필드 멤버인 tasks 연결 리스트로 연결되어 있다. 이는 copy_process() 과정에서 전역 변수인 init_tasktasks 필드로 연결된다.

4. 프로세스 실행 시각 정보

태스크 디스크립터에는 프로세스의 실행 시각 정보를 알 수 있는 다음의 필드를 제공한다:

  • 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() 를 호출 하게 된다.

profile
2000.11.30

0개의 댓글

관련 채용 정보