//问题描述: 看门狗喂狗执行程序优先级优化
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
//其它
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)