Linux进程管理(1)
进程是执行期间的程序及其它所包含的资源的总称。
进程通过fork()系统调用产生,该系统调用通过复制一个现有进程来创建一个全新的进程。fork()调用一次返回两次:一次回到父进程、一次回到新创建的子进程。
进程描述符及任务结构
内核把进程放在task list的双向循环链表中,其中每一项都是一个task_struct结构(即进程描述符)。task_struct结构比较大(32位机器上约1.7K),包含了内核管理进程所需的全部信息。
Linux通过slab分配器分配task_struct结构,以达到对象复用和缓存着色的目的。
每个进程通过pid来标识,默认最大值为32768,可以通过/proc/sys/kernel/pid_max修改。
thread_info结构
struct thread_info {
struct task_struct *task; /* main task structure */
struct exec_domain *exec_domain; /* execution domain */
unsigned long flags; /* low level flags */
unsigned long status; /* thread-synchronous flags */
__u32 cpu ; /* current CPU */
int preempt_count ; /* 0 => preemptable, <0 => BUG */
mm_segment_t addr_limit ; /* thread address space:
0-0xBFFFFFFF for user-thead
0-0xFFFFFFFF for kernel-thread
*/
void *sysenter_return;
struct restart_block restart_block ;
unsigned long previous_esp; /* ESP of the previous stack in case
of nested (IRQ) stacks
*/
__u8 supervisor_stack [0];
};
该结构在内核栈的尾端分配。
如何查找当前正在运行进程的进程描述符
为什么要屏蔽掉低13位(当THREAD_SIZE为8192时):
内核中的栈是从高地址到低地址,thread_info和内核栈(内核态堆栈)共享同一块内存, 而每个任务的thread_info在内核栈的尾端分配.
本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2012/04/05/2433253.html,如需转载请自行联系原作者