介绍
进程访问系统资源要排队等待,而cpu资源分配和执行的先后顺序,就是指进程的优先级。进程的优先级,保证了必要进程的执行。
系统进程的查看
Linux中,ps -l 命令会把当前用户启动的所有进程全部显示出来。其中,对应的消息有下:
UID : 代表用户的ID,即启动这些进程的用户
PID : 进程的编号
PPID :父进程的编号
PRI :代表此进程可被执行的优先级,它对应的是一个整型数字,其值越小越早被执行
NI :代表这个进程的nice值
这里重点说明一下PRI和NI。Linux默认的优先级是80。这个数据可以被更改,但优先级的范围是[60,99],也就是说最大为99,最小为60,数字越小,优先级越高。
上面的NI是用来修改进程的优先级。进程的优先级不能直接修改,必须通过修改NI的数值来间接修改优先级,它表示进程可被执行的优先级的修正数值,具体修改如下。
进程优先级的修改
修改优先级的命令是top。在Linux中,top指令是一个常用的性能分析工具,可以实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器,提供了实时的对系统处理器的状态监视。
当我们使用 top 后,输入 “ r ” 将会更改指定PID进程的优先级,具体实现如下。
[zhu@zhujunhao day]$ ps -la F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1228 1200 0 80 0 - 47970 do_wai pts/0 00:00:00 su 4 S 1001 1229 1228 0 80 0 - 29156 do_wai pts/0 00:00:00 bash 4 S 0 1395 1372 0 80 0 - 47970 do_wai pts/1 00:00:00 su 4 S 1001 1396 1395 0 80 0 - 29156 do_wai pts/1 00:00:00 bash 0 S 1001 2302 1396 0 80 0 - 3307 hrtime pts/1 00:00:00 code.exe 1 S 1001 2303 2302 0 80 0 - 3307 hrtime pts/1 00:00:00 code.exe 0 R 1001 2304 1229 0 80 0 - 38332 - pts/0 00:00:00 ps //可观察到2302的PRI为80 [zhu@zhujunhao day]$ top ......... //输入“ r ”后出现以下框架,这里我们修改PID为2302的进程 PID to renice [default pid = 965] 2302 //然后回车确定,将会出现以下框架,这里我们将优先级的数值增加10 Renice PID 2302 to value 10 ......... [zhu@zhujunhao day]$ ps -la //再次查看 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1228 1200 0 80 0 - 47970 do_wai pts/0 00:00:00 su 4 S 1001 1229 1228 0 80 0 - 29156 do_wai pts/0 00:00:00 bash 4 S 0 1395 1372 0 80 0 - 47970 do_wai pts/1 00:00:00 su 4 S 1001 1396 1395 0 80 0 - 29156 do_wai pts/1 00:00:00 bash 0 S 1001 2302 1396 0 90 10 - 3307 hrtime pts/1 00:00:00 code.exe //NI变为10 1 S 1001 2303 2302 0 80 0 - 3307 hrtime pts/1 00:00:00 code.exe 0 R 1001 2304 1229 0 80 0 - 38332 - pts/0 00:00:00 ps //可观察到2302的PRI为90
总的来说,修改步骤:进入top后按“r”–>输入进程PID–>输入nice值
注意:Linux允许用户修改优先级,但这里的修改优先级的数值不是让我们直接修改的,而是通过修改NI的数值来修改。这里的NI不是优先级,而是进程优先级修正的数据,即优先级:PRI = PRI + NI(这里PRI + NI的PRI是系统默认的优先级数值,即80)。前面输入的10就是NI的数值。这里设置NI的数值可以为负数,如在刚才的基础上再次修改为-10,此时的PRI = 70,NI = -10,设为0时即将PRI值还原。也就是说当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行;当nice值为正值的时候相反。
这里修改优先级的数值不是随心所欲的修改,系统会自动根据优先级范围进行判断,若修改后的优先级数值小于60,那么系统赋予优先级的数值为60;若修改后的优先级数值大于99,那么系统赋予优先级的数值为99。因此,可知,NI的范围是[-20,19],一共40个级别。
系统的这种设置完美地解决了个别进程优先级过高或过低,避免了进程饥饿的问题。
进程的调度与切换
当进程放在CUP上运行时,并不是把进程代码跑完才结束此进程。这样做是为了防止进程代码凌乱而导致其它进程不能被及时执行。因此,现代操作系统,都是基于时间片进行轮转执行的。在时间片轮转调度中,每个进程被分配一个固定长度的时间片,用于执行其任务。
进程的时间片是操作系统中用于实现时间片轮转调度的一个核心概念。当时间片用完时,操作系统会保存该进程的状态,然后切换到下一个进程,给予它一个时间片来执行。这个过程会不断循环,使得每个进程都有机会得到执行,从而实现并发执行的效果。
系统优先级之间的性质
进程之间既然存在优先级,那么它们之间在被CPU执行的时候必然存在各种性质,保证进程之间正常进行。
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间具有竞争属性很正常。竞争性跟优先级有关,优先级越高,进程的竞争性越大,竞争性可以说是优先级的体现。
独立性:独立性指多进程运行时,各种进程独享各种资源,多进程运行期间互不干扰
并行:表示多个进程在多个CPU下分别,同时进行运行。这种状态在普通计算机中很少见,因为普通计算机一般只有一个CPU。
并发:表示多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进。
这里重点说一下并发。并发情况是很常见的情况,如同我们平常启动多个程序时进入的情况。当多个进程启动时,系统内部形成运行队列后就会根据优先级进行运转,进程在运行的过程中会产生大量的临时数据放在CPU的寄存器中,而这些临时数据叫做进程的硬件上下文。硬件上下文将进程的数据保存,当 CPU 再次调度进程时,硬件上下文会被恢复到该进程上一次离开时的状态。这样,进程就可以从它之前离开的地方继续执行,而不会丢失其执行上下文。
这里要注意,CPU内的寄存器只有一套,但寄存器内部保存的数据可以有多套,每套保存的数据都是私有的。