五、进程优先级(受nice值调控的priority值 )
1.什么是优先级?
1.先还是后获得某种资源的能力,被称之为优先级。
2.先获得就是优先级高,后获得就是优先级低
2.为什么会存在优先级?
1.
因为资源是有限的。
2.
比如现在有20多个进程要访问CPU,但CPU只有一个,另外20个进程要访问网卡,另外40个进程要访问磁盘,但是资源太少了,但访问的又太多了,此时就会出现优先级的情况。想要访问,可以!但需要排队,这就出现了优先级。
3.Linux优先级特点
1.
进程的优先级和状态一样,本质都是PCB里面的一个数字(也可能是多个数字),操作系统通过这些数字来辨别进程的状态和优先级。
2.
通过ps -al指令可以查看到进程的详细信息,PRI和NI的值合并在一起代表Linux进程的优先级。PRI其实就是最终优先级,只不过它受NI值的调控。
4.修改Linux下的优先级(top指令 + root身份)
1.
最终优先级=老的优先级(固定为80)+nice值,Linux支持进程在运行中,通过修改nice值的改变来进行进程优先级的调整。
2.
PRI的值越小代表优先级越高,输入sudo top指令(用管理员的身份去做),然后按下r,输入对应的进程pid(表示你要修改哪个进程的优先级),然后输入整数值,这个值就是你要修改的nice值。
3.
优先级过度设置,会导致CPU调度失衡,所以nice值是有范围的,不能让你随意过度的调整,nice值的范围是-20到19,一共40个优先级级别,所以最终优先级的范围就是60到99
4.
下面是nice值分别调整为-100和100后,进程的优先级分别为60和99的结果,这也就说明,OS不会让我们过度随意调整nice值,nice值的调整是有一个限度范围的。
六、四个补充的进程概念(注意区分并行和并发)
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级,值得注意的是进程排队的时候,OS操作的是进程对应的PCB而不是进程对应的代码和数据。
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰!就算是父子进程在运行时也是互不干扰的。例如下面的子进程挂掉,变为僵尸进程,但父进程依旧可以运行,所以进程间运行是互不干扰的。
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。有几个CPU,就可以同时运行几个进程。
并发: 多个进程在一个CPU下采用进程切换的方式来实现多个进程的运行(不是同时运行),在一个时间段内,让多个进程都得以推进,称之为并发。
如果只有一个CPU,那么在任何时刻,只能有一个进程正在运行!多个进程的运行依靠的是进程切换,呈现给使用者的就是我们好像看到多个进程在同时运行,但其实不是这样的,任何时刻只能有一个进程在运行。
不是一个进程必须在CPU上跑完才能被CPU拿下来,当代计算机采用的是时间片轮转的策略,一个进程可以跑一会儿就换到下一个进程,在一个时间段内,每个进程都可以跑多次,呈现出来的现象就是多个进程同时运行,例如我的计算机现在可以打开画图工具,还可以开直播和别人聊天,还可以打开xshell进行linux的学习,但这些进程并不是同时在一个CPU下运行的,只是采用了进程切换的方式来完成的。
CPU可以在几毫秒的时间内,就将每个进程都运行好几次,CPU读取代码的速度非常快!
时间片轮转(百度百科)
七、进程切换(进程的上下文保护和恢复)
1.
一个CPU会有大量的寄存器,虽然寄存器很多,但是只有一套寄存器,寄存器分为用户可见的寄存器和用户不可见的寄存器(状态寄存器、权限寄存器等),对于寄存器的深入了解,可以看看寄存器详谈(转载自知乎博主轩辕之风的文章)
2.
CPU永远做三件事情,取指令(代码被编译器翻译成二进制指令),分析指令,执行指令,在CPU中有一个叫做eip的寄存器,专门用来标识下一次应该从当前进程的具体的位置读取相应的代码和指令
3.
当进程在运行的时候,一定会产生非常多的临时数据,这些临时数据只属于当前进程,虽然CPU内部只有一套寄存器硬件,但是寄存器里面保存的数据是属于当前进程的,寄存器硬件和寄存器内的数据是两码事。
4.
进程在运行的时候,的确是占有CPU的,但进程并不是一直占有CPU直到进程运行结束,这个我们前面说过,计算机有时间片轮转的策略,每一个进程在运行的时候,都有自己的时间片,所以在进程重新被CPU调度的时候,CPU必须知道上一次这个进程运行到什么时候了,当进程被换下去的时候,进程的运行信息会被存在操作系统里面(具体什么位置这里不详谈),以便下次CPU重新调度时进程能够正常运行,这叫做进程的上下文保护。当进程被CPU重新调度上来时,首先要做的第一件事情就是读取操作系统中进程运行的相关数据,这叫做进程的上下文恢复。
5.
在任何时刻,CPU中的寄存器虽然被所有进程共享,但寄存器内的数据是每个进程私有的,这些寄存器内的数据就是进程的上下文数据,这些寄存器内的数据是时刻在不断变化的,OS会实时加载当前运行进程的上下文数据到寄存器里面。