无论是外设还是CPU,所能提供给操作系统的资源很少,而操作系统中的进程又非常多,安排谁先使用资源,就需要进程优先级的存在。
ps -al
查看当前运行进程的优先级信息。
ps -al | grep test
配合管道查看指定进程优先级信息。
ps -al | head -1
显示对应标题。
这么多的信息,我们只需要关注几个。
UID,PID,PPID我们很熟悉,对应用户ID,该进程ID,父进程ID。
PRI:老的优先级。(这个值默认都是80)
NI:在进程中,进行优先级调整的,都是通过修改NI值。(也称为nice值)
最终优先级 = PRI + NI,两者相加大的就是优先级高的。
通过sudo top
,可以动态地持续监听进程地运行状态,并且还提供了一个交互界面,可以供用户操作。
进入top界面,输入r(表明修改nice值),再输入对应进程PID,再输入NI值。
先将NI设为100,通过查看进程优先级,发现NI只设为19,只变成了99。
再将NI设为-100,查看优先级,发现NI只设为-20,只变成了60。
结果来看,NI的范围只有[-20,19],所以最终优先级范围也就[60,99]
NI的范围小,对应进程优先级的区间小,那么多的进程,为什么这个区间不设大一点呢?
如果区间设置的很大或是无限制,要是出现恶意进程故意修改优先级使得其它进程无法正常运行,所以这样设置还是有道理的。
目前这个阶段,对进程优先级的感知还不强,也没有什么需要调整进程优先级的场景,具体看需求,现在认识一下。
在此前,先来介绍几个概念:
下面进程切换就看具体做了什么。
首先,CPU的构成中有许多的寄存器,这些寄存器保存着当前运行的进程的数据。
寄存器被所有进程共享,寄存器内的数据,是属于当前运行进程的,这个数据也被称为 — 上下文数据
一个进程在CPU上单次运行的一段时间称为时间片。
常见的寄存器eip(pc指针),存储当前指令下一条指令的地址。
当操作系统想要运行一个进程,会将对应进程PCB地址传给CPU的某一个寄存器。让CPU能找到这个进程PCB,从而找到对应代码和数据。
CPU是很 “ 笨 ” 的只能靠指令集读取指令,当进程运行将指令传给CPU,CPU靠指令集分析指令运行对应代码,当进程的时间片结束后,操作系统将保存此时CPU中寄存器内的数据,当再次轮到这个进程后操作系统将原本数据加载到寄存器中,eip就可以通过下一条指令地址让代码继续运行。
进程退出CPU,操作系统保留寄存器里的数据,进程回到CPU,操作系统将原本数据恢复到寄存器中。这就完成了进程切换。