进程优先级
概念
所谓进程优先级,实际上就是CPU资源分配的先后顺序。说白了就是谁的优先级高,谁就先被CPU调度。由于CPU的资源有限,为了更好的提高系统的性能,最大程度的合理分配CPU的资源,CPU会根据进程的优先级进行调度。
“插队”与“抢占”
我们知道,处于R状态的进程是指该进程的PCB处在运行队列中,等待被CPU调度,而队列我们知道它的特点,即先进先出,但是因为有了优先级的存在,就会出现所谓的插队现象。并且当代计算机都是支持“抢占”的。也就是说,假如一个进程正在运行时,突然来了一个优先级更高的进程,OS就会调用一些函数将该进程从CPU上剥离,然后把优先级高的放进去。
“插队”
进程优先级的查看
我们可以输入一些指令,比如ps -l,或者top等一些指令,来观察进程的优先级。
ps -l查看当前bash下的进程
其中PRI表示进程的优先级(Priority),PRI越低,表示该进程的优先级越高。由于PRI是内核动态调整的,我们无法干涉。但是我们可以通过调整NI(nice)值,来调整进程的优先级。
进程优先级的调整
首先我们来看一下公式:
PRI(new) = PRI(old) +nice
🔴注意点:
PRI(old)一般都是值起始的那个值80
root用户可以修改自己或他人进程的nice值,范围为-20~19
一般用户仅可以调整自己进程的nice值,范围为0~19,这是为了避免一般用户抢占系统资源
一般用户仅可将nice值越调越高,也就是说假如第一次调的时候,nice为5,则下一次只能调nice>5
有两种方式调整nice值:nice指令:一开使执行某个程序时,就给定一个指定的nice值;renice指令:调整某个已经存在的PID的nice值。
nice与renice
首先是nice指令,可以理解为初始化PRI,即在执行这个进程的时候,就通过NI设置了PRI。nice -n num 进程:将进程的NI设置为num值(普通用户num范围:[0,19])
&放中间的意思是使&左右两边的指令同时执行。
接下来是renice,修改已经存在的进程的NI。指令renice 数字 PID:将pid的进程的NI修改为指定数字。
通过top调整
我们还可以通过top指令来调整
我们先输入指令top,然后按r键,接着输入进程的pid,然后输入想要修改的NI值,就可以对进程的PRI进行调整。
演示
前后台理解
前台
我们来谈一谈什么是前台,很好理解。 假如此时我们只有一个终端,此时出现提示字符让我们操作的环境就是前台。举个例子,我们输入指令vim,此时会进入vim的操作平台,这时我们就处于前台状态。
而像我们在bash下执行我们的程序时,比如执行不断地打印,这些打印情况等我们都可以看到,这就是前台进程。就像Windows下的qq,此时我打开qq,并且处在它的界面上使用,此时qq就是一个前台进程。
总结一句话:可以被我们人为控制与执行命令的环境就是前台,Linxu下的前台进程可以使用ctrl c指令中止。
后台
而后台就是指任务可以自动执行,不用我们人为干预,我们也无法使用ctrl c中止。
就像Winodws下的这104个后台进程,会自动执行,不需要我们来操心。
Linux下的前后台切换
合理的利用前后台可以提高我们的工作效率,举个例子来说,Linux下假如我们正在传输一个文件,而处于前台环境下,我们无法做别的事情,只能等传输完毕后,才可以进行干别的事。再比如,我们处在vim下,而此时我们想使用命令行界面操作一些别的指令,此时处在前台的我们,是无法做到在一个终端环境下,既使用vim,又使用命令行界面。
那我们就可以将vim扔到后台,处理完我们的事后再从后台拿到前台,继续使用vim。不过需要注意的是: 放入后台的任务想要继续运行时,必须不能与用户交互。就好像vim, 我们只可以把它放进后台,让vim在后台处于暂停状态,但不可以让vim在后台处于运行状态,因为vim进程的执行,需要与我们形成交互,是需要我们用户输入数据(比如写代码等)
查看目前后台任务
我们可以通过指令jobs -l,来查看后台任务。
Done表示该进程执行结束
Running表示正在运行
Terminated 表示该进程已被中止
Stopped表示该进程暂停
Killed表示该进程被杀掉
直接将命令丢到后台中执行-->&
我们可以在一个命令的最后面加上&,这样就可以将该命令放在后台去执行。如下:
将当前任务丢进后台-->ctrl z
ctrl z表示将当前任务丢进后台,并处于暂停。比如此时打开vim,我们按下ctrl z,就会将vim丢进后台并暂停该进程。我们此时输入fg num,就会将编号为num的后台任务拿到前台来处理(只输入fg会默认拿出最近放入的后台进程到前台)。
如下:
当然,我们也可以输入bg num 可以使后台编号为num的进程处于运行状态(后台进程运行的前提是不会与用户交互,比如vim只能在后台处于暂停,因为vim的运行需要与用户交互)。
如何杀掉后台进程
后台进程使用ctrl c是杀不掉的,只可以使用kill指令。
我们可以输入kill -9 pid指令杀掉进程,或者killall 进程名 杀掉,亦或者kill -9 %num 杀掉后台进程编号为num的进程。
🔴小总结:
前台任务可以使用ctrl c中止,后台任务不可使用ctrl c中止
在指令最后方加上&,表示将该指令丢在后台,并执行
ctrl z会将当前任务丢进后台,并处于暂停状态
我们丢进后台的进程都会有编号,我们可以输入指令:fg 编号,就会将该编号的进程从后台拿到前台,输入指令:bg 编号 会使该编号的后台进程从暂停变成执行。
后台任务的执行需要一个条件:后台任务不会与用户进行交互
指令:jobs -l,可以查看当前bash(只能查看当前bash下的)下的后台任务。
使用kill -9 PID 或者kill all 进程名 或者kill -9 %编号,都可以杀掉后台进程。
jobs下的+表示最近丢进后台的进程,-表示最近第二个被丢进后台的进程
我们之前ps axj指令下的状态后面加一个加号, 表示该进程处于前台状态(比如:S+),状态后面没有加号(比如S),表示该进程在后台。