Linux基础(进/线程间的竞争)
Posted 秘籍酷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux基础(进/线程间的竞争)相关的知识,希望对你有一定的参考价值。
今天,继续来讨论哲学话题。什么是真正的公平?给你两个选择,第一:全部人排一样的队,吃一样放的饭,赚一样的钱。第二:人人都分三六九等,有人高高在上事事优先,有人人微言轻事事垫底。你觉得如何?
用脚趾头想想也知道,第一种情况是绝对的公平,结果是把效率往死里拖,回到五六十年代的中国,回到水深火热的年代。第二种情况是相对的公平,时间和优先权市场化,说白了就是资源优化配置。
因此答案是,绝对的公平才是最大的不公平,而不公平才是真正的公平。真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让给了其他线程,了不起是个大好人,因此会慢慢地提高他的动态优先级,使得这类线程在同等的非实时普通线程中,有越来越高的响应速度,表现出更好的交互性能,这也正是我们想要的结果。
可见,世界根本不可能存在绝对的公平,因为那样的世界将会无比糟糕。事情有轻重缓急,人有三六九等,听起来不那么顺耳,但是世界的真相。我会乱说?
以上是关于Linux基础(进/线程间的竞争)的主要内容,如果未能解决你的问题,请参考以下文章