프로세서에 대해 간단히 설명했었다.
이번 시간에는 프로세스 서술자에 대해서 한번 알아보기로 한다.
커널은 프로세스들을 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 |