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在内核栈的尾端分配.

 

原文地址:https://www.cnblogs.com/feisky/p/2433253.html