Chapter 3
- 章节名:Chapter 3
- 2011-06-25 09:28:38
task_struct是描述process的主要结构。以前静态分配在每个进程的内核栈页面的底部,只需直接将stack pointer取整就可以获得。从2.6开始,使用slab allocator动态分配,原位置则放置一个thread_info结构,并有一个指针指向task_struct。 PID的类型为pid_t,通常为int,但早期内核将其定义为short int,导致最多只能有32768个进程。现代内核为了兼容性仍保留此限制,但可通过/proc/sys/kernel/pid_max修改。 fork()调用copy_process()来完成大部分的工作。 vfork()与fork()相比,只是节省了复制页表项的开销,代价就是父进程阻塞直至子进程调用exec,其间不允许写内存,否则父进程就废了。一个改进fork的思路是采用COW page table entries。 Kernel threads没有address space,它们的mm指针为NULL,仅在kernel space运行。Kernel threads必须通过kthread_create()产生,该函数把创建kernel thread的信息挂在kthread_create_list上,而具体的工作则由[kthreadd]这一kernel thread统一完成,它的唯一任务就是检查kthread_create_list是否要创建kernel_thread,最终还是交给do_fork。从rest_init()函数的实现中可以看出,[kthreadd]从init进程产生,因此获得PID=2。之所以要由kthreadd来统一完成创建工作,是因为kernel thread和普通进程一样,都要从一个已有的进程fork出来。直接复制当前进程也许不具备kernel thread必须的属性(比如说不能有address space),所以必须由[kthreadd]来复制。
说明 · · · · · ·
表示其中内容是对原文的摘抄