概念
处于执行期的程序以及相关资源的总称
进程描述符及任务结构
内核把进程的列表存放在叫做任务队列(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()