内核将进程存放在叫任务队列的双向循环链表中,每项为task_struct(include/linux/sched.h),该结构比较大,32位的计算机上大概有1.7K
task_struct 通过slab分配器分配,以达到对象复用和缓存着色的目的。
task_struct 可以通过保存在进程的栈底(向下增长,向上增长的则在栈顶)的thread_info(asm/thread_info.h)结构中的task指针快速访问。
PID最大默认设置32767。/proc/sys/kernel/pid_max 可以修改该上限。
thread_info快速访问:
movl $-8192, %eax
andl %esp, %eax
屏蔽esp后13位,或是current_thread_info()->task.
当进程处于内核空间时(即进程上下文),struct task_struct *current当前进程,current->parent父进程, current->children子进程。
init进程的进程描述符为init_task(静态分配)。
进程创建:
fork, vfork, __clone 都是通过-> clone ->do_fork(kernel/fork.c)->copy_process
copy_process该函数完成进程创建的大部分工作,具体见(P19)
copy_process完成后返回do_fork,并有意让子进程先运行。
线程创建使用clone,具体标志来表明共享的资源(P21)。
内核线程与普通进程的区别:内核线程没有独立的地址空间mm指针为null,可以被抢占,调度
内核线程创建:kernel_thread(P22)
进程销毁过程:(P22);