首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux基础(进/线程间的竞争)

Linux基础(进/线程间的竞争)

作者头像
用户2617681
发布2019-08-07 19:02:37
7200
发布2019-08-07 19:02:37
举报
文章被收录于专栏:秘籍酷秘籍酷

今天,继续来讨论哲学话题。什么是真正的公平?给你两个选择,第一:全部人排一样的队,吃一样放的饭,赚一样的钱。第二:人人都分三六九等,有人高高在上事事优先,有人人微言轻事事垫底。你觉得如何?

用脚趾头想想也知道,第一种情况是绝对的公平,结果是把效率往死里拖,回到五六十年代的中国,回到水深火热的年代。第二种情况是相对的公平,时间和优先权市场化,说白了就是资源优化配置。

因此答案是,绝对的公平才是最大的不公平,而不公平才是真正的公平。真TM绕口令似的。

现实中我们都知道,不能吃大锅饭,不能搞“一直同仁”,对不同的人不同的事要区别以待,那么在编程开发中面对进/线程的时候,道理也都一样。因为从本质上来讲,一个人和一条线程是类似的,他们都是一个个活动的对象,并且互相争夺有限的资源(人争夺一切资源,线程争夺系统运算资源)。

学过一点计算机原理的人都知道,进/线程有所谓优先级的说法。但具体细节可能不会特别清楚,比如什么静态优先级、动态优先级、调度策略、实时线程、普通线程、nice值等等。下面就来简单地把它们一一轻轻打死。

先澄清一个概念,进程和线程的关系,look:

从图中看到,所谓进程就是包含了1条以上线程的线程组。 每一条线程都是可以被单独调度的实体,因此我们考虑优先级的相关问题,就以线程对对象就行了。

关于调度策略,你需要知道的几点:

0,静态优先级(static priority)分为0-99级,级别越高,优先权重越大。其中第0级属于普通线程,1-99为实时线程

1,线程有三种调度策略,分别是SCHED_FIFO、SCHED_RR和SCHED_OTHER。

2,当线程的调度策略为SCHED_FIFO时,其静态优先级必须设置为1-99,这将意味着一旦这种线程处于就绪态时,他能立即抢占任何静态优先级为0的普通线程。

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

3,当线程的调度策略为SCHED_RR时,情况跟SCHED_FIFO是一样的,区别在于:每一个SHCED_RR策略下的线程都将会被分配一个额度的时间片,当时间片耗光时,他会被放入其所在优先级队列的队尾的位置。可以用sched_rr_get_interval( )来获得时间片的具体数值。

4,当线程的调度策略为SCHED_OTHER时,其静态优先级必须设置为0(即普通线程)。该调度策略是Linux系统调度的默认策略。

处于0优先级别的这些线程按照所谓的动态优先级被调度,而动态优先级起始于线程的nice值,且每当一个线程已处于就绪态但被调度器调度无视时,其动态优先级(即nice值)会自动增加一个单位,这样能保证这些线程竞争CPU的公平性。

100个静态优先级,对应内核任务管理中的100条队列,好比银行排队等到办理业务的100个窗口,每一条队列都站着一些等到调度的线程。

其中第0号队列全是屌丝(即所谓的普通线程),第1-99号队列都是VIP,而且数字越大优先级越高。

银行里服务柜员相当于CPU,是一个极快动作的业务员,迅速地在各个窗口间轮流切换,当然,她会优先处理高优先级的客户,比如优先级为90的客户是存款500万以上的VIP,一般他的事务紧急不容怠慢。

非实时的普通线程,他们之间的调度凭借所谓的动态优先级来博弈。下面来总结一下动态、静态优先级的概念。

什么是 静态 优先级

线程的静态优先级(static priority)之所以被称为“静态”,是因为只要你不强行使用相关函数修改他,他不会随着线程的执行而发生改变。

静态优先级决定了实时线程的基本调度次序,如果他们的静态优先级一样,那么调度策略再为调度器提供进一步的调度依据。

什么是 动态 优先级

线程的动态优先级(dynamic prioriy)是非实时的普通线程独有的概念,之所以被称为“动态”,是因为它会随着线程的运行,根据线程的表现而发生改变。

具体来讲是——如果一条线程是“CPU消耗型”的,比如视频解码算法,这类线程只要一运行就黏住CPU不放,这样的线程的动态优先级会被慢慢地降级,这符合我们的预期,因为这类线程不需要很高的响应速度,你只要保证一定的执行时间片就可以了。

相反,另一类线程被称为“IO消耗型”,比如编辑器,这类线程绝大部分的时间都在睡眠,调度器发现每次调度他他都毅然决然地放弃了,将宝贵的CPU让给了其他线程,了不起是个大好人,因此会慢慢地提高他的动态优先级,使得这类线程在同等的非实时普通线程中,有越来越高的响应速度,表现出更好的交互性能,这也正是我们想要的结果。

可见,世界根本不可能存在绝对的公平,因为那样的世界将会无比糟糕。事情有轻重缓急,人有三六九等,听起来不那么顺耳,但是世界的真相。我会乱说?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档