Linux中如何体现优先级

  • 静态优先级:
    级别为0~99的100个优先级:0级为普通,1 ~ 99级为实时线程
  • 动态优先级:
    当静态优先级为0时,就以动态优先级加以区分,级别为==-19~20(nice值)==,Nice值越大,优先级越低

例如:
两个都为0级的静态优先级线程:p1,p2
p1的nice为20,p2的nice为-10。
则,p2比p1优先级更高。

动态优先级的用途例子2:

  • 如果进程或者线程是CPU消耗型的,系统会通过提高Nice值来降低该进程的动态优先级,使其响应速度变慢。例如:音视频解码
  • 如果进程或者线程是IO消耗型的,系统会通过降低Nice值来提高该进程的动态优先级,使其响应速度变快。例如:编辑器的使用(记事本,world)

调度策略:

静态优先级中:

  • 1~99级:FIFO/RR
  • 0级:其它
  • 上图是1~99级中的调度策略
  • 假如在第5级中,FIFO先占用CPU运行,会一直占用着CPU,直到运行结束或者IO操作介入,睡眠等出现,FIFO才会放弃占用CPU
  • RR会运行一段时间后,放弃占用CPU重新排队等待。
  • 直到第5级运行结束,才到第4级的进程或者线程运行。

代码实现

设置线程是否继承创建者的调度策略

int pthread_attr_setinheritsched()

Android 优先级PR p0p1优先级_线程


系统的默认优先级为:普通优先级0级,Nice=0设置线程调度策略int pthread_attr_setschedpolicy()

Android 优先级PR p0p1优先级_线程_02


设置线程静态和动态优先级:

int pthread_attr_setschedparam()

Android 优先级PR p0p1优先级_线程的优先级_03


Android 优先级PR p0p1优先级_调度策略_04


代码运行结果:

Android 优先级PR p0p1优先级_线程_05


A与B交错出现如果将线程更改为RR,并且更改优先级:

Android 优先级PR p0p1优先级_Android 优先级PR_06


在普通用户状态下运行:

Android 优先级PR p0p1优先级_Android 优先级PR_07


在管理员root状态下运行:

Android 优先级PR p0p1优先级_线程_08


是因为在非管理员情况下,只能执行普通线程。

只有管理员才可以,正常启动实时线程。


Nice值的使用:

int nice(int inc)

Android 优先级PR p0p1优先级_优先级_09


Android 优先级PR p0p1优先级_优先级_10


Android 优先级PR p0p1优先级_Android 优先级PR_11


Android 优先级PR p0p1优先级_线程_12