日期:2014-05-16  浏览次数:20635 次

linux内核--进程管理(二)

一、进程

    进程就是出于执行期的程序,但进程并不仅仅局限于一段可执行的程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核的内部数据,处理器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,存放全局变量的数据段。

    执行线程,进程线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调用的对象是线程不是进程。程序本身不是进程,进程是处于执行期的程序以及相关的资源的总称。完全可能存在两个或多个不同的进程执行的是同一个程序。并且两个或两个以上并存的in成还可以共享许多诸如打开的文件、地址空间之类的资源。

二、进程描述符及任务结构

    内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一个都是类型为task_struct、称为进程描述符的结构,结构定义在<linux/sched.h>文件中。进程描述符中包含一个具体进程的所有信息。此结构体相当大,但包含了内核管理一个进程所需的所有信息。进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件、进程的地址空间、挂起的信号、进程的状态......

  1)分配进程描述符

    linux通过slab分配器分配task_struct结构,现在用slab分配器动态生成task_struct,只需在栈底或栈顶创建一个新的结构struct thread_info.

struct thread_info{

    struct task_struct *task;

    struct exec_domain *exec_domain;

    _u32                flags;

    _u32                status;

    _u32                cpu;

    int                 preempt_count;

    mm_segment_t        addr_limit;

    struct restart_block restart_block;

    void                 *sysenter_return;

    int                  uaccess_err;

};

    每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。
<