文章目录
进程管理
进程
进程:处于执行期的程序以及相关资源(打开的文件、挂起的信号、内核内部数据、处理器状态等)的总称
线程:是在进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程,不是进程
Linux不区分进程和线程,对它来说,线程只不过是一种特殊的进程而已
现代操作系统的两种虚拟机制:
- 虚拟处理器:给进程一种假象,让它觉得自己在独享处理器
- 虚拟内存:让进程在分配和管理内存时觉得自己拥有整个系统的内存资源
注意:线程之间可以共享虚拟内存,但是都拥有自己的虚拟处理器
进程描述
内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项类型为task_struct
,称为进程描述符的结构,描述了一个具体进程的所有信息
分配进程描述符
Linux通过slab分配器分配task_struct
结构,这样能够对象复用和缓存着色。
每个任务的thread_info
结构在它的内核栈尾端分配,其中task
域存放的是指向该任务实际task_struct
的指针
struct thread_info {
struct task_struct *task;
struct exec_domain *exec_domain;
...
};
进程描述符的存放
在内核中,访问任务需要获取指向task_struct
结构的指针,通过current
宏查找到当前进程的进程描述符,这个查找的速度很重要
有的硬件体系结构拿出一个专门的寄存器存放当前进程的task_struct
指针,而有些像x86的体系结构(寄存器不太富余),就只能在内核栈的尾部创建thread_info
结构,通过计算偏移量间接找到task_struct
结构
进程状态
进程描述符中的state
域描述了进程的当前状态。系统中进程的状态包括:
- TASK_RUNNING(运行或就绪):进程是可执行的
- TASK_INTERRUPTIBLE(可中断睡眠)
- TASK_UNINTERRUPTIBLE(不可中断睡眠)
- __TASK_TRACED:被其他进程跟踪的进程,例如ptrace调试的程序
- __TASK_STOPPED:被暂停执行的任务,通常在接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号时
设置当前状态
使用set_task_state(task,state)
函数
进程家族树
所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程