进程管理
1. 进程基本概念
进程
是处于执行期间的程序以及相关资源的总称。
2. 进程描述符
linux通过`slab分配器`分配进程描述符结构体
task_struct{
unsigned log state;//进程状态
pid_t pid;//进程标志,唯一
struct task_struct *parent//父进程,每个进程都必定有一个父进程
...
}
进程上下文
一个用户空间进程,通过系统调用或者触发某个异常,就会陷入内核空间——这种情况就称作内核代表进程执行
并处于进程上下文中
。
注意:用户空间进程只能通过系统调用
和异常处理程序
这两类内核提供的接口,才能陷入内核执行。
3. 进程创建&终结
linux系统中的进程存在明显的继承关系,所有进程都是PID为1的init进程
的后代。内核在系统启动的最后阶段启动init进程。
fork()拷贝当前进程创建子进程
fork()使用写时拷贝(COW)机制
exec()读取可执行文件并将其载入地址空间运行
exit()结束进程
进程释放资源后,处于EXIT_ZOMBIE状态(此时会占用内核栈,thread_info结构,task_struct结构),此时需要通过父进程通知内核释放剩余资源,真正结束进程。
如果父进程在子进程之前退出,必须有机制保证子进程能找的新的父进程(可以让init作为父进程),否则这些子进程在退出时就会成为僵尸进程,浪费内存空间。
4. 线程
linux系统中的线程与进程实现机制一样,被当做与其他进程共享某些资源的进程。
进程调度
进程调度是指,从就绪的进程中选择一个来执行
基本概念
寄存器、cpu缓存、内存
寄存器
是cpu的重要组成部分
cpu缓存
是为了弥补cpu与内存之间速度的差异而增加的缓存
三者的速度:寄存器 > cpu缓存 > 内存
进程类型
IO消耗型
进程大部分时间用来提交IO请求,或者等待IO请求结果
cpu消耗性
进程大部分时间都在执行代码,IO请求比较少
进程优先级、时间片
进程优先级
调度程序总数选择时间片未用完且优先级最高的进程来执行。
时间片
是一个数值,表示进程被抢占前所能运行的时间。
实时进程、普通进程
进程调度方法
每个cpu都有两个进程队列,可运行进程队列
、等待/过期进程队列
。
linux用红黑树
存储系统中所有可运行的进程,红黑树的键值是该进程可运行的虚拟时间。
当进程阻塞或终止时,会从红黑树中移除。进程阻塞时,会把当前进程移入等待队列(等待队列是由等待某些事件发生的进程组成的简单链表)。当该进程等待的事件发生后,会被唤醒,再加入红黑树中。