目录
接前文:
1. 进程优先级的基本概念
1. cpu资源分配的先后顺序,就是指进程的优先权(priority)
2. 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能
3. 还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤⼤改善系统整体性能
1.1 进程的优先级是什么
进程的优先级其实就是得到CPU资源的先后顺序
1.2 我们为什么需要进程的优先级
之所以需要进程的优先级,其实就是因为目标资源稀缺,需要通过优先级来确认先后顺序,就好比我们以前在食堂打饭排队一样
1.3 优先级和权限的区别
还是以我们上面那个例子:在现实生活之中,我们去食堂窗口去打饭需要排队,这叫做优先级,但我们没有办法去学校的教职工食堂或者是校长专有的小餐厅里面去吃饭,我们没有这个权限,而当我们去学校的餐厅里去排队的时候,那我们自己已经知道了,我们是一定可以吃到饭的,只不过是快慢的问题
而我们对应的权限,它并不是先后问题,而是是否能够得到某种资源的问题
所以优先级和权限的区别就是:一个是是否能够得到的问题一个是一定可以得到,只不过是先后的问题
2. Linux下的优先级
在linux或者unix系统中,我们使用 ps ‒l 命令则会类似输出以下⼏个内容
1.UID : 代表执⾏者的⾝份
2. PID : 代表这个进程的代号
3. PPID :代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
4. PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏,我们上面那张图片的PRI就是80
5. NI :代表这个进程的nice(修正数据)值,我们上面那张图片的NI就是0
那么就有一个问题:系统是怎么知道我们访问文件的时候是以拥有者还是所属组还是other的身份来访问的呢?
答案就是依靠UID来进行判断的,我们看下面这张图片,我们根据文件的UID和我们自己的UID来进行一一对比,以此来判断我们的身份究竟是什么
2.1 PRI和NI
1. PRI也还是⽐较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序,此
值越⼩进程的优先级别越⾼
2. 那NI呢?就是我们所要说的nice值了,其表⽰进程可被执⾏的优先级的修正数值
3. PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
4. 这样,当nice值为负值的时候,那么该程序将会优先级值将变⼩,即其优先级会变⾼,则其越快
被执⾏
5. 所以,调整进程优先级,在Linux下,就是调整进程nice值
6. nice其取值范围是-20⾄19,⼀共40个级别
优先级的极值:
1. 需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影响到进程的优先级变化
2. 可以理解nice值是进程优先级的修正修正数据
3. ⽤top命令更改已存在进程的nice:
a. top
b. 进⼊top后按“r”‒>输⼊进程PID‒>输⼊nice值
c. 其他调整优先级的命令:nice,renice
2.2 进程的多种概念
1. 竞争性: 系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为了⾼效完成任务,更合理竞争相关资源,便具有了优先级
2. 独⽴性: 多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰
3. 并⾏: 多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏
![]()
4. 并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称之为并发
3. 进程切换
3.1 死循环进程是如何运行的?
我们先提出一个问题:如果一个进程占用CPU,那么它会把代码全部跑完吗?答案是:不会,除非这个代码只有一行或者很短,否则是不会跑完的,原因是因为有一个叫做时间片的东西
打个比方:比如说我们的一个进程,它想在cpu上运行,但是我们的CPU只让它运行1毫秒,如果在1毫秒的时间里运行结束就直接结束了,但是如果进程没有运行结束那么CPU就会把进程从cpu上拿下来,进程就需要重新去运行队列里去重新排队,然后等到下次再到这个进程的时候再调这个进程
而每单次给进程的时间比如说:1毫秒10毫秒,那么这个时间我们就称之为时间片,每一个进程都想拥有cpu资源,但是它都不是永久使用的而是临时性的使用上一个很短的时间段,然后让进程跑上很短的一段时间,这样的话就不会出现一个进程一直占用CPU的情况
所以我们的死循环进程是不会打死CPU的,因为死循环进程不会一直占用CPU
3.2 关于CPU和寄存器
当cpu去执行一个进程的时候,这个时候执行的过程就和PCB的关系不大了,因为它执行的时候主要是执行访问对应进程的代码和数据,也就是说我们的CPU它其实是直接访问我们当前进程的代码和数据
而我们的CPU并不是直接把代码数据一股脑全塞到cpu里,而是需要一个个的来处理,所以在我们CPU里就存在很多寄存器,而每一个寄存器都会有它对应的功能
1. 寄存器其实结束CPU里的一段空间
2. 寄存器就是寄存器,寄存器不等于寄存器里面的代码和数据
3.3 进程如何进行切换?
我们先举个例子:假设我们现在去当兵,当两年,假设我们合格了,可以直接去当兵了,然后我们在没有和导员说要保留学籍和没有在学校办理证件的情况下直接去当兵,然后过了两年之后,我们结束了我们的军旅生涯回到了学校,但是这个时候我们发现我们已经被学校勒令退学了,为什么呢?因为我们既没有和导员说要保留学籍也没有办理证件的情况下直接去当兵,然后再期末考试的时候我们人也不在,挂靠太多了,就直接被退学了
那么这样是不行的,所以我们应该先让导员把我们的学籍保留好,然后导员给了我们一份档案,并让我回来之后再把档案给他,这个档案里包含我们目前所有的信息,然后我们再去当兵,当我们当兵回来之后,我们是不能直接上来就坐到教室里然后就开始上课或者考试的,因为学校还不知道我们已经回来了,所以这个时候,当我们回来之后需要恢复学籍,我们把我们之前导员给我们的档案再给导员,然后导员再根据我们之前保存的档案来给我们进行安排,那么这个时候我们就可以正常的进行上课了
下面这张图片的过程就是进行了一次切换
具体切换:
这里的把数据带走其实就是把数据拷贝出来,然后再把当前进程(A)放到队列的结尾,然后再将新进程(B)放上去,进程B直接把进程A被拷贝的数据直接覆盖进行了,当到A的时候,就可以再放上去,然后再根据我们之前拷贝的上下文数据内容恢复上下文数据继续运行就可以了
参考⼀下Linux内核0.11代码
未完待续~