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的指针。