Linux内核进程

概念

    处于执行期的程序以及相关资源的总称

进程描述符及任务结构

    内核把进程的列表存放在叫做任务队列(task list)的双向链表中,链表中的每一项都是task_struct称为进程描述符(process descriptor),该结构定义在<linux/sched.h>文件中
    struct task_struct
    {
unsigned long state;
int prio;
unsigned long policy;
struct task_struct *parent;
struct list_head tasks;
pid_t pid;
    };

分配进程描述符

    linux通过slab分配器分配task_struct, slab分配器动态在栈顶或者栈底创建一个新的结构struct thread_info
    struct thread_info
   {
struct task_struct   *task;
struct exec_domain   *exec_domain;
__u32      flags;
__u32      status;
__u32      cpu;
int      preempt_count;
mmsegment_t      addr_limit;
struct restart_block restart_block;
void      *sysenter return;
int      uaccess_err;
   };


进程描述符的存放

    PID标识每个进程,pid_t,默认最大值32768(短整型的最大值),可以通过修改/proc/sys/kernel/pid_max来提高上限,可以通过current宏查找当前正在运行的进程描述符
    current_thread_info()->task;

进程状态

TASK_RUNNING(运行)--进程是可执行的;或者正在执行,或者在运行队列中等待执行
TASK_INTERRUPTIBLE(可中断)--进程正在睡眠(被阻塞)
TASK_UNINTERRUPTIBLE(不可中断)--处于此状态的任务对信号不做响应
_TASK_TRACED--被其他进程跟踪的进程
_TASK_STOPPED--进程停止执行
    函数
set_task_state(task, state);

进程创建

fork()->clone()->do_fork()



猜你喜欢

转载自blog.csdn.net/ftd_lky/article/details/78980407