Linuxias
Developer's Delight
Linuxias
  • Category
    • AI
      • Deep Learning
      • Machine Learning
      • Data Science
      • Framework
      • MLOps
      • Paper-Review
      • Tips
    • Android
      • Kotlin
      • Component
      • Compose
      • Compose UI
      • Material
      • Testing
    • Software Architecture
      • Architecture Pattern
      • Design Pattern
      • Requirement Engineering
    • Linux
      • Compile & Link
      • Command & Tool
      • Container
      • Debugging & Testing
      • Profiling
      • Kernel Analysis
      • Server
      • Shell Script
      • System Programming
    • Language
      • Carbon
      • C,C++
      • C#
      • Java
      • Python
    • ETC
      • Data Struct | Algorithm
      • git
      • Security
    • Book
    • 경제공부
      • 세금
      • 부동산
hELLO · Designed By 정상우.
Linuxias

Developer's Delight

Linux/Kernel Analysis

[Linux Kernel] Process - Task struct(프로세스 서술자)

2014. 7. 6. 17:59
반응형

프로세서에 대해 간단히 설명했었다.

이번 시간에는 프로세스 서술자에 대해서 한번 알아보기로 한다.

커널은 프로세스들을 task_list라고 부르는 환형 양방향 링크드리스트를 이용하여 관리, 저장한다.

서로서로 연결되어 있다면?? 현재 실행중인 프로세스에서 다른 프로세스 서술자의 정보를 확인할 수 있다는 것인가? 그 부분에 대해서는 아래에서 알아보도록 하자.



task_list의 각 항목을 프로세스 서술자라고 하며 <linux/sched.h>에 struct task_struct 형식으로 되어있다. 아래가 task_struct가 가진 정보들이다.


1179 struct task_struct {
1180         volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
1181         void *stack;
1182         atomic_t usage;
1183         unsigned int flags;     /* per process flags, defined below */
1184         unsigned int ptrace;
1185 
1186 #ifdef CONFIG_SMP
1187         struct llist_node wake_entry;
1188         int on_cpu;
1189         struct task_struct *last_wakee;
1190         unsigned long wakee_flips;
1191         unsigned long wakee_flip_decay_ts;
1192 
1193         int wake_cpu;
1194 #endif
1195         int on_rq;
1196 
1197         int prio, static_prio, normal_prio;
1198         unsigned int rt_priority;
1199         const struct sched_class *sched_class;
1200         struct sched_entity se;
1201         struct sched_rt_entity rt;
1202 #ifdef CONFIG_CGROUP_SCHED
1203         struct task_group *sched_task_group;
1204 #endif
1205         struct sched_dl_entity dl;
                  .
                  .
                  .
1613 };



라인 수 만 보더라도, 굉장히 많은 정보를 가진 구조체 임을 알 수 있다. 하지만 이 구조체 안에 커널이 프로세스를 관리하는 데 필요한 모든 정보를 가지고 있다는 것을 생각해보면, 이 정도는 그렇게 큰 구조제가 아님을 알 수 도 있을 것이다. task_struct 내의 정보를 하나하나 설명하긴 힘들지만, 사용 중인 파일, 프로세스의 주소 공간, 프로세스 상태 등 프로세스를 설명할 수 있는 많은 정보가 있다.



task_struct 구조체는 스택영역에 할당 되는데 슬랩할당자(Slab allocator)를 이용하여 동적으로 task_struct를 만들어 thread_info라는 새로운 구조체를 스택에 할당한다. 여기서 슬랩 할당자는 나중에 좀 더 자세히 알아보자. 저장되는 위치는 스택에 끝 부분에 저장되는데 스택이 아래쪽으로 확장되는 경우에는 제일 아래쪽에, 스택이 위로 할당되는 경우에는 제일 위쪽에 할당된다.

thread_info 구조체 내용을 한번 확인하자.


struct thread_info {
 67         struct task_struct      *task; /* main task structure */
 68         struct exec_domain      *exec_domain; /* execution domain */
 69         unsigned long           flags; /* low level flags */
 70         unsigned long           status; /* thread-synchronous flags */
 71         __u32                   cpu; /* current CPU */
 72         __s32                   preempt_count; /* 0 => preemptable,< 0 => BUG*/
 73         mm_segment_t            addr_limit; /* thread address space */
 74         struct restart_block    restart_block;
 75 
 76         struct cpu_context      cpu_context;
 77 };


thread_info 구조체 내에는 task_struct와 더불어 몇가지 주요 정보를 저장하고 있다.커널은 각 프로세스를 어떻게 구별할까? 쉽게 생각하면 프로세스 마다 번호를 하나씩 붙이는 것이다. 그 번호가 바로 PID(프로세스 인식 번호)라고 한다. 이 번호를 이용하여 프로세스를 구별하게 된다. 프로세스는 시스템 내 /proc/sys/kernel/pid_max를 이용하여 조절할 수 있다.



보통 커널 내부에서 태스크에 접근할 때에 task_struct 구조체 포인터를 사용한다. 위에서 설명했듯이 환형 양방향 링크드리스트로 이루어져있고, 그 리스트내에 모든 프로세스가 연결되어 있으니, 리스트를 이용하여 다른 프로세스의 서술자들을 빠르게 찾을 수 있다. 사용하는 방법은 현재 태스크의 프로세스 서술자를 이용하여 위치를 찾고, 다른 프로세스로 리스트를 이용해 탐색하는 방식이다.


다음은 프로세스 상태에 대해 블로깅 하겠습니다.










반응형
저작자표시 비영리 변경금지 (새창열림)

'Linux > Kernel Analysis' 카테고리의 다른 글

[Linux] Writing udev rules, udev 규칙 작성법에 관하여..  (1) 2015.10.31
[Linux Kernel] 프로세스 상태 분석  (0) 2014.07.17
[Linux Kernel] 프로세스란?  (1) 2014.07.01
[Linux Kernel] Kobject에 대하여  (0) 2014.06.27
[Linux Kernel] 리눅스 커널 Configuring  (0) 2014.06.27
    'Linux/Kernel Analysis' 카테고리의 다른 글
    • [Linux] Writing udev rules, udev 규칙 작성법에 관하여..
    • [Linux Kernel] 프로세스 상태 분석
    • [Linux Kernel] 프로세스란?
    • [Linux Kernel] Kobject에 대하여
    Linuxias
    Linuxias
    I want to be a S/W developer who benefits people.

    티스토리툴바