ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux系统线程调度策略简述

2022-05-26 08:31:58  阅读:172  来源: 互联网

标签:优先级 静态 调度 简述 线程 linux SCHED 动态


简述

linux系统调度执行的最小单位是线程,线程的调度策略有以下三种:

(1)SCHED_FIFO
其静态优先级必须设置为1~99,这将意味着一旦线程处于就绪态,他就能立即抢占任何静态优先级为0的普通线程。采样SCHED_FIFO调度策略的线程还遵循以下原则:

  • 当他处于就绪态时,就会被放入其所在优先级队列的队尾位置
  • 当被更高优先级的线程抢占后,他会被放入其所在优先级队列的队头位置,当所有优先级比他高的线程不再运行后,他就恢复运行
  • 当它调用sched_yield()后,他会被放入其所在优先级队列的队尾位置

总的来说,一个具有SCHED_FIFO调度策略的线程会一直运行直到发送I/O请求,或被更高优先级线程抢占,或调用sched_yield()主动让出cpu

(2)SCHED_RR
这种策略的情况与SCHED_FIFO类似,区别是:每一个SCHED_RR策略下的线程都会被分配一个时间片,当时间片耗光时,它会被放入其所在优先级队列的队尾位置。
可以用sched_rr_get_interval()来获取时间片的具体数值。

(3)SCHED_OTHER
其静态优先级必须设置为0,该策略是linux系统调度的默认策略,处于0优先级的这些线程按照所谓的动态优先级(nice值)被调度,且每当一个线程已处于就绪态但被调度器调度无视的时候,其动态优先级会自动增加一个单位,这样能保证这些线程竞争cpu的公平性。
如何设置线程的静态优先级和动态优先级,相关的API如下:

非实时线程

静态优先级为0的线程是非实时线程

实时线程

静态优先级为1~99的线程都是实时线程

静态优先级

什么是静态优先级?

线程的静态优先级之所以被称为“静态”,是因为只要不强行使用api函数修改它,它不会随着线程的执行而发生改变,静态优先级决定了实时线程的基本调度次序,如果他们的静态优先级一样,那么调度策略再为调度器提供进一步的调度依据。

动态优先级

什么是动态优先级?

线程的动态优先级是非实时的普通线程独有的概念,之所以被称为“动态”,是因为它会随着线程的运行,根据线程的表现而发生改变。具体来讲,如果一条线程是“CPU消耗型”的,比如视频解码算法,这类线程只要一运行就会“黏住”cpu不放,这类线程的动态优先级会慢慢降低,因为这类线程不需要很高的响应速度,我们只要保证一定的执行时间片就可以了。相反,另一类线程称为“IO消耗型”,比如编辑器,这类线程绝大部分时间都在睡眠,调度器发现每次调度它,他都毅然决然放弃了,将宝贵的cpu让给了其他线程,因此会慢慢地提高它的动态优先级,使得这类线程在同等的非实时普通线程中,有越来越高的响应速度,表现出更好的交互性能,这也正是我们想要的结果;线程的优先级可以动态调整,以上就是动态优先级的概念。

相关API

1、设置线程调度策略

123

2、设置线程静态优先级

123

3、设置线程动态优先级

12

总结

后面我有时间再慢慢补充linux系统线程相关的一些知识点。

标签:优先级,静态,调度,简述,线程,linux,SCHED,动态
来源: https://www.cnblogs.com/lxyjrx/p/16311712.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有