进程和线程的调度优先级

发布时间 2023-04-12 17:50:33作者: Skyge

//问题描述: 看门狗喂狗执行程序优先级优化

1.是采用线程还是进程优化?

2.若采用实时调度的话,FIFO调度优先级最高提升为多大?

3.若为RT线程,ps查看时也没看见优先级相关的信息(若不先查看系统下的RT线程的优先级,配置上会不会产生冲突?)

4.是写一个ko的形式,还是写一个执行程序去改变原来喂狗程序的优先级,还是直接创建一个带有fifo调度相关的进程(最后一个应该是正确的,创建一个进程采用相关的API设置设个进程)?

 

小结:
基于对比采用实时进程及FIFO调度

先采用线程的方式

【转】 pthread设置线程的调度策略和优先级 - 菜鸟升级 - 博客园 (cnblogs.com)

 

https://blog.csdn.net/hhlenergystory/article/details/81632241(创建RT进程源码)

Linux内核API sched_setscheduler|极客笔记 (deepinout.com) (ko的形式)

参考于以下文献

https://developer.aliyun.com/article/374662(设置实时线程源码

https://www.jianshu.com/p/2f383e900aaa (pthread_attr_setschedpolicy相关API介绍)

//设置实时进程运行占比

实时进程的优先级比普通进程的有限级高,为了避免流氓实时进程占满CPU导致普通进程饿死的情况,Linux内核导出文件来限制1s内实时进程运行的时间,默认如下

cat /proc/sys/kernel/sched_rt_period_us
1000000
cat /proc/sys/kernel/sched_rt_runtime_us
950000
echo 100000 > /proc/sys/kernel/sched_rt_runtime_us

即1s内只允许实时进程运行950ms,剩下的50ms给其它进程使用

//特性:

  • 进程优先级值越小,优先级越大。
  • 进程优先级是PRI值不是Nice值,但是Nice值会影响优先级。
  • 三类调度策略:RR调度(当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平)和FIFO调度(一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃)的进程属于实时进程,以分时调度(OTHER)的进程是非实时进程
  • 实时进程优先级高于普通进程,实时进程使用静态优先级调度、非实时进程使用动态优先级调度,非实时进程动态优先级通过nice调整、可能受bonus影响。

 //优先级查看

ps ax -o nice,pid,comm   或  ps –l

//实时进程相关

//通过 chrt -m 命令,可以查看 chrt 不同的调度策略下,用户可选的优先级范围:

//若PR优先级列表项为RT,则为实习进程(只能用chrt -p (1~99) pid来修改)

 

 //https://blog.csdn.net/tang05505622334/article/details/103478891

关于实时优先级和实时调度算法,可以参考linux文档:http://man7.org/linux/man-pages/man7/sched.7.html。简而言之,linux中有五种调度策略:

非实时调度:SCHED_OTHER, SCHED_IDLE, SCHED_BATCH

实时调度:SCHED_FIFO, SCHED_RR

 chrt这个命令只有在打了实时补丁的内核中可以使用,在非实时内核中运行会报类似no permission的错。

 1、查看进程的优先级和调度策略(应该显示的是主线程的优先级和调度策略):

chrt -p [pid]

(这里的非实时进程优先级为0,实时进程优先级1~99,数值越大优先级越高)

 2、查看进程的所有线程的优先级和调度策略:

chrt -a -p [pid]

 3、查看每种调度策略对应的优先级范围:

chrt -m

 4、设置进程的调度策略(可以看到只有主线程变成了实时调度):

chrt -f -p [prio] [pid] // SCHED_FIFO

chrt -r -p [prio] [pid] // SCHED_RR

 5、如果想把进程的所有线程都变成实时调度(https://stackoverflow.com/questions/13827791/raising-priority-sched-policy-of-all-thread-of-a-process-linux-chrt,该链接指出这样做不会改变chrt之后生成的线程的优先级):

chrt -r -p -a [prio] [pid]

 6、查看某个进程所有线程的优先级、nice值、调度策略:

ps -Lo pid,tid,pri,ni,policy [pid](这里的优先级和chrt看到的优先级不一样,这里数值越大优先级越低)

 7、直接指定优先级和调度策略来启动一个进程(可以看到所有线程都变成了RR):

 

 

//一开始执行程序就指定nice值(等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级)

nice -n -5 /usr/local/mysql/bin/mysqld_safe &

 

//调整已存在进程的nice

renice -5 -p 5200

 

//其它

七、Linux进程调度-调度策略、优先级、绑核 - Hello-World3 - 博客园 (cnblogs.com)