【Linux】进程优先级

概念

优先级和权限的区别

  • 权限决定的是——能不能执行
  • 优先级决定的是——已经能执行了,但是问题是谁先谁后

优先级的基本概念

  • CPU资源分配的先后顺序,就是指进程的优先级(priority)
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux有用,可能改善系统的性能(实际中不一定)
  • 也可以将进程运行到指定的CPU上,这样就可以将不重要的进程安排到某个CPU,以此改善系统整体性能。

因为资源是有限的,而进程存在很多数量,多个进程之间是存在竞争关系的——竞争性。所以操作系统必须需要保证大家良性竞争,确认优先级,让进程先后访问资源。(如果存在优先级不合理或者调度算法不合理,导致进程长时间得不到CPU资源,该进程的代码长时间无法得到推进,也就造成了该进程的饥饿问题

查看进程的优先级

在Linux或者Unix系统中,使用指令ps -l 查看进程的优先级

【注意】ps -l 只能看的当前终端的进程优先级,添加-a选项即可查看多个终端的进程优先级,即指令 ps -al可以将用户级的所有进程都打开

注意下面几个重要的信息:

  • UID:代码指执行者的身份
  • PID:代表这个进程的id号码
  • PPID:代表这个进程是由哪个进程发展衍生而来的,即父进程的id号码
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行
  • NI:代表这个进程的nice值

PRI和NI

  • PRI(priority优先级)代表的是进程的优先级
  • NI(nice)代表的是进程优先级的修正数据
  1. PRI是程序被CPU执行的先后顺序,PRI越小进程的优先级别越高
  2. 一个进程执行过程中真正的优先级取决于:PRI(new) = PRI(old)+nice
  3. 调整优先级需要调整nice值,当nice为负值的时候,进程的优先级值PRI变小,优先级会变高,也就越快被执行
  4. 在Linux中即调整进程的优先级,就是调整进程的nice值
  5. nice的取值范围是-20至19,一共20个级别

【注意】进程的nice值不是进程的优先级,这两者不是一个概念,但是进程的nice值会影响到进程的优先级变化

Linux不能过多的让用户参与优先级的调整,只能在规定的范围内进行调整,nice的取值范围是[-20,19]。

【注意】一般来说,不建议修改进程的优先级

调整优先级的指令

调整进程优先级的指令(只能root用户调整优先级):

  • nice
  • renice
  • top

【这里介绍使用top命令更改优先级】

虽然这里修改的nice值是-30,但是系统只允许最大修改-20

【注意】PRI不是只要调整就会变小,PRI(new) = PRI(old)+nice,这里PRI(old)每次都是80,而PRI被调整之后最大是99,最小是60.

进程的其他概念

  • 竞争性:系统进程数目众多,而CPU资源只有少量,甚至只有1个,所有进程之间是具有竞争性质的。

为了高效完成任务,更加合理地竞争相关资源,便有了优先级

  • 独立性:多个进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行:多个进程在多个CPU下分别,同时进行运行,称之为并行
  • 并发:多个进程在一个CPU下采用进程切换地方式,在一段时间之内,让多个进程都得以推进,称之为并发

【基于进程切换基于时间片轮转的调度算法】进程在运行过程中存放着两个运行队列,当一个在CPU处于进程切换的时候,同一个运行优先级运行结束之后,会将这个进程放在等待队列中同一优先级的位置,等第一个运行队列将所有优先级的进程在进程中切换一遍后,会切换到另外一个运行队列中。

问题:为什么函数的返回值可以被外部获取到?/系统是如何知道代码中语句运行到哪一行?

【答1:】函数中return 这条语句进行执行的时候,会转换成汇编语句:mov eax 10【eax是一种寄存器】,return语句返回的时候,会将对应的数据保存到寄存器中。

【答2:】CPU中有一种概念:程序计数器(PC指针、eip),可以用来记录当前进程正在执行指令的下一行指令的地址。不管是代码中的顺序语句,循环语句,递归语句,都会将CPU下一次需要进行的指令保存在eip这个程序计数器中,这个程序计数器也是CPU中的一个寄存器。

        通常我们的CPU中存储着大量的寄存器,有通用寄存器、栈帧寄存器、状态寄存器等等。为了提高效率,CPU会将进程的一些高频数据保存在CPU中的寄存器中。

        CPU内的寄存器里面保存的是进程相关的数据,这些数据是随时有可能会被CPU进行访问和修改的。也就是说,CPU寄存器里面保存的是进程的临时数据——我们将这一部分数据称为进程的上下文

        进程在从CPU上离开的时候,需要将自己进程的上下文数据保存到自己的task_struct(PCB)中【保存的目的是为了以后再次运行该程序的时候恢复这部分数据】。

【总结】进程在被切换的时候,主要进行两部分工作:

  1. 保存上下文
  2. 恢复上下文

保存上下文会将CPU中寄存器保存的上下文数据保存到自己进程的PCB结构体中,当进程再次被CPU调度时,恢复上下文的时候会将这部分数据重新放到CPU寄存器中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值