导航:首页 > 源码编译 > 有限期任务的安排算法的改进

有限期任务的安排算法的改进

发布时间:2024-03-31 18:14:19

Ⅰ 怎么优化hadoop任务调度算法

首先介绍了Hadoop平台下作业的分布式运行机制,然后对Hadoop平台自带的4种任务调度器做分析和比较,最后在分析JobTracker类文件的基础上指出了创建自定义任务调度器所需完成的工作。
首先Hadoop集群式基于单服务器的,只有一个服务器节点负责调度整个集群的作业运行,主要的具体工作是切分大数据量的作业,指定哪些Worker节点做Map工作、哪些Worker节点做Rece工作、与Worker节点通信并接受其心跳信号、作为用户的访问入口等等。其次,集群中的每个Worker节点相当于一个器官,运行着主节点所指派的具体作业。这些节点会被分为两种类型,一种是接收分块之后的作业并做映射工作。另一种是负责把前面所做的映射工作按照约定的规则做一个统计。
Task-Tracker通过运行一个简单循环来定期地发送心跳信号(heartbeat)给JobTracker.这个心跳信号会把TaskTracker是否还在存活告知JobTracker,TaskTracker通过信号指明自己是否已经准备
好运行新的任务.一旦TaskTracker已经准备好接受任务,JobTracker就会从作业优先级表中选定一个作业并分配下去.至于到底是执行Map任务还是Rece任务,是由TaskTracker的任务槽所决定的.默认的任务调度器在处理Rece任务之前,会优先填满空闲的Map任务槽.因此,如果TaskTracker满足存在至少一个空闲任务槽时,JobTracker会为它分配Map任务,否则为它选择一个Rece任务.TaskTracker在运行任务的时候,第一步是从共享文件系统中把作业的JAR文件复制过来,从而实现任务文件的本地化.第二步是TaskTracker为任务新建一个本地文件夹并把作业文件解压在此目录中.第三步是由Task-Tracker新建一个TaskRunner实例来运行该任务.
Hadoop平台默认的调度方案就是JobQueueTaskScheler,这是一种按照任务到来的时间先后顺序而执行的调度策略.这种方式比较简单,JobTracker作为主控节点,仅仅是依照作业到来的先后顺序而选择将要执行的作业.当然,这有一定的缺陷,由于Hadoop平台是默认将作业运行在整个集群上的,那么如果一个耗时非常大的作业进入执行期,将会导致其余大量作业长时间得不到运行.这种长时间运行的优先级别并不高的作业带来了严重的作业阻塞,使得整个平台的运行效率处在较低的水平.Hadoop平台对这种FIFO(FirstINAndFirstOut)机制所给出的解决办法是调用SetJobPriority()方法,通过设置作业的权重级别来做平衡调度.
FairScheler是一种“公平”调度器,它的目标是让每个用户能够公平地共享Hadoop集群计算能力.当只有一个作业运行的时候,它会得到整个集群的资源.随着提交到作业表中作业的增多,Hadoop平台会把集群中空闲出来的时间槽公平分配给每个需要执行的作业.这样即便其中某些作业需要较长时间运行,平台仍然有能力让那些短作业在合理时间内完成[3].FairScheler支持资源抢占,当一个资源池在一定时段内没有得到公平共享时,它会终止该资源池所获得的过多的资源,同时把这些释放的资源让给那些资源不足的资源池.
Hadoop平台中的CapacityScheler是由Yahoo贡献的,在调度器上,设置了三种粒度的对象:queue,job,task.在该策略下,平台可以有多个作业队列,每个作业队列经提交后,都会获得一定数量的TaskTracker资源.具体调度流程如下.
(1)选择queue,根据资源库的使用情况从小到大排序,直到找到一个合适的job.
(2)选择job,在当前所选定的queue中,按照作业提交的时间先后以及作业的权重优先级别进行排序,选择合适的job.当然,在job选择时还需要考虑所选作业是否超出目前现有的资源上限,以及资源池中的内存是否够该job的task用等因素.
(3)选择task,根据本地节点的资源使用情况来选择合适的task.
虽然Hadoop平台自带了几种调度器,但是上述3种调度方案很难满足公司复杂的应用需求.因此作为平台的个性化使用者,往往需要开发自己的调度器.Hadoop的调度器是在JobTracker中加载和调用的,因此开发一个自定义的调度器就必须搞清楚JobTracker类文件的内部机制.作为Hadoop平台的核心组件,JobTracker监控着整个集群的作业运行情况并对资源进行管理调度.每个Task-Tracker每隔3s通过heartbeat向JobTracker汇报自己管理的机器的一些基本信息,包括内存使用量、内存的剩余量以及空闲的slot数目等等[5].一
旦JobTracker发现了空闲slot,便会调用调度器中的AssignTask方法为该TaskTracker分配task。

Ⅱ 改进计算方法

在早期油气资源评价中,通常应用评价模型,对各参数仅取一个固定值进行简单的运算,所得结果也是一个值。实际上,对于地下评价对象,其大多数参数具有时空变化性,用一个固定值,不管是统计所得均值还是其他值,都很难代表该参数,更无法准确刻画该参数的时空非均质性。在这种情况下,很显然应用单值运算得到的结果很难反映地下评价对象的客观实际。因此,为提高评价质量和结果可信性,必须改进计算方法。

14.4.1 应用网格化方法逼近资源分布

这种方法的基本思路是:

(1)根据大量观测点数据,编制各单一参数的平面分布图,通常为平面等值线图,如生油岩等厚图等,个别为分区等级图,如演化程度图。以这些平面分布图简化表示各参数空间变化,主要是把各参数的垂向变化,用平均值简化为非变化的固定值,如所谓生油岩有机质丰度等值线图,即是把各点垂向上有机质丰度变化简化为非变化的固定值。(2)在平面上建立固定的网格,其网格一般是按均匀法设置,但也可用非均匀网格,网格的多少视各变量平面变化快慢、计算机速度和容量而定。原则上是网格越多、越细就越准确地刻画参数平面变化情况。

(3)以同一网格在各参数分布图上读取网格结点(或网格中点)上参数具体数值。

(4)针对每一个网格结点(或网格中点),按照资源评价模型,分别计算生烃量、排烃量等,然后编制生烃量、排烃量等值线图。

(5)依据各等值线间距所占面积,计算该间距所占的生烃量、排烃量等,再累加得全区生烃量、排烃量。乘以相应运聚系数即得全区资源量。

14.4.2 蒙特卡洛法

所谓蒙特卡洛法是一种数值计算方法,其含义是利用随机抽样方法在各参数分布曲线取定数值,然后根据评价模型进行运算,结果得到一定值,反复如上过程成千上万次,结果就有成千上万个定值,再将这些定值进行统计,得到结果分布曲线。该方法已广泛应用于油气资源评价,其优点是:以一个分布曲线来逼近地下评价对象及较可能值、最可能值。这更加符合人们对地下评价对象的认识过程和局限性、不确定性。

该方法的计算步骤如下:

(1)通过资料处理解释、分析化验、图件读取等方法,产生和采集、整理各参数的数据,原则上是越多越好。同时剔除奇异点。

(2)根据整理的数据,统计建立各参数概率分布曲线。当数据较多,如多于几十个时,统计分布曲线代表性强、可靠性高。但当数据少到只几个或十余个时,可依据该参数的分布概型(一般是经验已知的分布模型,如正态分布、对数正态分布等),构造实际的分布曲线。但当数据少到只几个且其分布概型也不确定时,最好用均匀分布或三角分布代替其分布。

(3)利用计算机产生随机数,其中最简单最基本的是均匀分布随机数。要求随机数产生后必须经过严格的检验(如均匀性检验、独立性检验、组合规律性检验、连续性检验等),性质符合要求时方可投入使用。随机数个数越多越好,最好成千上万。随机数值区间为0~1。

(4)以随机数值为概率入口值,用插值法在某一参数分布取该概率所对应的参数值(图14-1)。再用另一个随机数值在另一参数分布曲线上求取该参数值(图14-2)。以此类推。再将所求取的各参数的值(一个参数只一个值)按评价模型相乘除或加减,得到一个结果(图14-3)。反复此过程,得到成千上万个结果。

图14-1 抽样计算过程示意图

(5)再将所得结果进行数理统计,得到结果概率分布图(图14-3)。一般而言,蒙特卡洛计算所用参数概率分布可以是各种各样,但其结果分布一般都是正态分布或对数正态分布。

图14-2 多参数抽样计算过程示意图

图14-3 蒙特卡洛计算过程示意图

14.4.3 模糊数学计算方法

在一些研究对象中,不同事物的界线是截然不同的,如水可以有冰、水、汽三种形态,其界限一般是明确的;而在某些对象,不同事物之间的界限是不明确的,例如在石油地质中,储层的“渗透性好”和“渗透性差”是两个截然不同的概念,但有时对于某个具体的对象,要把它归到“渗透性好”或“渗透性差”却不容易。模糊数学用隶属度来描述这种情况,即用数值来表示某对象属于某事物的程度,一个对象可以“属于”两类甚至两类以上事物,分别以两个隶属度描述它属于这两类事物的程度,这样,较合理地解决了这类问题。

当用模糊数学评价圈闭的含油气性时,即用一个向量来表示一个圈闭:

油气资源评价方法与实践

研究对象含k个圈闭,则用集合Ui来表示这个圈闭群:

油气资源评价方法与实践

n个地质因素在评价圈闭的含油气性中起的作用不同,各因素用一个权ai值表示其在评价中的作用大小:

油气资源评价方法与实践

每个地质因素用m个级别来表示其有利程度:

油气资源评价方法与实践

Ci是用整数表示的一种属性,其具体值依m不同而异。

当m=3时,C=[-1 0 1]

当m=5时,C=[-2-1 0 1 2]

当m=7时,C=[-3-2-1 0 1 2 3]

一个圈闭的某个地质因素用它对各属性的隶属度来表示(如表14-1)。

表14-1 地质因素各属性的隶属度表

对一个圈闭用n个变量来描述,每个变量的表述将转变为一个向量,而一个圈闭原来用一个向量表示,将变为用综合评价变换矩阵R表示:

油气资源评价方法与实践

用各地质因素的权和各圈闭的综合评价变换矩阵算出各圈闭的综合评价,这个计算过程称为合成:

油气资源评价方法与实践

式中h是样品号,Rh是第h号样品的综合评价变换矩阵,Bh是n(变量数)个数构成的向量,其各元素为

油气资源评价方法与实践

这里,○表示某种算法,这些算法都是由下列4种基本算法演化出来的(假设a、r为模糊集合中的两元素)。

1)a∨r=max(1,r)

2)a∧r=min(a,r)

3)a·r=ar

4)a⊕r=min(a,1+r)

按照这样合成得出一个样品向量,然后计算综合评价值(综合得分)D:

油气资源评价方法与实践

结果为一个数。各圈闭按其D值排队,就是这些圈闭的优劣排队。每采用一个合成法,就有一个B,相应有一个D值,就有一个排队,因为B的产生方法不同,各变量值所起作用不尽相同,同样的原始数据会有不同的排队结果。

14.4.4 神经网络计算方法

人工神经网络是指由大量与自然神经系统的神经细胞相类似的(人工)神经元互联而成的网络。

神经网络的结构和特性是由神经元的特性和它们之间的连接方式决定的。人工神经元之间通过互联形成网络。互联的方式称为连接模式。神经元之间的连接强度为连接权。当网络的连接权矩阵确定后,网络的连接模式也就确定了。

在人工神经网络中,信息处理过程或存贮知识的改变是通过修改神经元间的连接模式来完成的。这一修改过程称做神经网络的训练或学习。不同的权矩阵调整方式,就是不同的学习方式。

神经网络的学习和神经网络的结构没有一一对应的关系。不同的神经网络可以采用相同的学习算法进行训练;同一神经网络也可以采用不同的学习算法进行训练。

一般采用多层前向神经网络,用误差反传(BP)算法。

对于一个由3层组成的神经网络模型,第一层为输入层,第二层为中间层,第三层为输出层。第一层的神经元数为n,中间层的神经元数为1,第三层的神经元数为1。

第1层为输入层,由M个样品的n个神经元组成,约定第k个样品(圈闭)的输入,即第1层神经元为:xk1,xk2,…,xkn,相应的输出为Tk,其中,k为样品号,k=1,2,3,…,M,n为神经元数,在此可理解为自变量数。

第2层为隐层,其神经元数1是用户设定的,由x与权系数矩阵W2相乘算出,第k个样品的中间层为

油气资源评价方法与实践

F(t)采用S型(Signmoid)压缩函数:

油气资源评价方法与实践

为了能控制u的取值,把第一式改为:x0=-1,w0j=ξ,记

油气资源评价方法与实践

则第二式成为

t的值除与Wij,xi有关外,还与变量数n有关,为了让的值在0~1的范围内,就需要

油气资源评价方法与实践

给一个适当的ξ值。

中间层到输出层的计算与此相仿。只是它用另外一个W(矩阵)。

如果找到合适的W(两个W阵),则由输入的各样品的X算出各样品的y值应与原样品的输出值T相同或很接近。我们的任务就是要求这两个W阵。

油气资源评价方法与实践

开始的W阵是随机产生的。当然它算出各样品的y不会等于T。我们用E(W)来衡量它的偏差:

油气资源评价方法与实践

当E(W)<ε时,学习完成。当E(W)>ε时,就要修改两个W阵,让E(W)逐渐变小,就现在的这个模型(一共有3层,输出层只有一元)来说,修改W分两步,第一步修改由u计算y的W,第二步修改由x计算u的W。

油气资源评价方法与实践

油气资源评价方法与实践

这样,每次根据算出的y来指导修改两层的W阵,直至E(W)<ε,学习完成。

学习完成后,得到两个W阵,把待判样品的x向量按既定的模式计算可得各样品的y值,为具体对象的评价。

Ⅲ 寤惰繜浠诲姟镄勫嚑绉嶉珮鏁堣В鍐虫柟妗

鎴戜滑鎶婇渶瑕佸欢杩熸墽琛岀殑浠诲姟鍙锅氩欢杩熶换锷°备篃灏辨槸璇村綋鍙戠敓镆愪釜浜嬩欢涔嫔悗鎴栬呬箣鍓岖殑镆愪釜鐗瑰畾镄勬椂闂寸偣镓ц岀殑涓绯诲垪锷ㄤ綔銆
寤惰繜浠诲姟镄勪娇鐢ㄥ満鏅链変互涓嬭繖浜涳细

寤惰繜浠诲姟镄勭壒镣规湁浠ヤ笅杩欎簺锛

Redis瀹炵幇寤舵椂浠诲姟锛屾槸阃氲繃鍏舵暟鎹缁撴瀯ZSET𨱒ュ疄鐜扮殑銆俍SET浼氩偍瀛树竴涓狲core鍜屼竴涓獀alue锛屽彲浠ュ皢value鎸夌収score杩涜屾帓搴忋
寤舵椂浠诲姟镄勫疄鐜板垎涓轰互涓嫔嚑姝ユ潵瀹炵幇锛
(1) 灏嗕换锷$殑镓ц屾椂闂翠綔涓簊core锛岃佹墽琛岀殑浠诲姟鏁版嵁浣滀负value锛宩obId+topicName+groupId+delayTime浣滀负key锛岄氲繃zadd锻戒护灏嗘暟鎹瀛樻斁鍦▃set涓锛
(2) 鐢ㄤ竴涓杩涚▼瀹氭椂镆ヨzset镄剆core鍒嗘暟链灏忕殑鍏幂礌锛屽彲浠ョ敤ZRANGEBYSCORE key -inf +inf limit 0 1 withscores锻戒护𨱒ュ疄鐜;
(3) 濡傛灉链灏忕殑鍒嗘暟灏忎簬绛変簬褰揿墠镞堕棿鎴筹纴灏卞皢璇ヤ换锷″彇鍑烘潵镓ц屽苟浣跨敤zrem铡熷瓙锻戒护鍒犻櫎鏁版嵁锛屽惁鍒欎紤鐪犱竴娈垫椂闂村悗鍐嶆煡璇銆
redis镄刏SET鏄阃氲繃璺宠穬琛ㄦ潵瀹炵幇镄勶纴澶嶆潅搴︿负O(logN)锛孨鏄瀛樻斁鍦╖SET涓鍏幂礌镄勪釜鏁般傜敤redis𨱒ュ疄鐜板彲浠ヤ緷璧栦簬redis镊韬镄勬寔涔呭寲𨱒ュ疄鐜版寔涔呭寲锛宺edis镄勯泦缇ゆ潵鏀鎸侀珮骞跺彂鍜岄珮鍙鐢ㄣ傚洜姝ゅ紑鍙戞垚链寰埚皬锛屽彲浠ュ仛鍒板緢瀹炴椂銆
浼樼偣锛
1銆丷edis zset鏀鎸侀珮镐ц兘镄 score 鎺掑簭銆
2銆丷edis鍙浠ュ姩镐佹墿缂╁癸纴褰撴秷鎭寰埚氭椂鍊欙纴鎴戜滑鍙浠ョ敤闆嗙兢𨱒ユ彁楂樻秷鎭澶勭悊镄勯熷害锛屾弧瓒冲归噺鍜屾ц兘涓婄殑鍙镓╁𪾢镐с
3銆丷edis鍏锋湁鎸佷箙鍖栨満鍒讹纴褰揿嚭鐜版晠闅灭殑镞跺欙纴鍙浠ラ氲繃AOF鍜孯DB鏂瑰纺𨱒ュ规暟鎹杩涜屾仮澶嶏纴淇濊瘉浜嗘暟鎹镄勫彲闱犳с
4銆佺亩鍗曞疄鐢锛屽揩阃熻惤鍦般
缂虹偣锛
1銆佷负浜嗛伩鍏崭简褰扑竴涓 KEY 鍦ㄥ瓨鍌ㄤ简杈冨氱殑寤舵椂娑堟伅钖庯纴鍏ラ槦镎崭綔浠ュ强镆ヨ㈡搷浣滈熷害鍙樻参镄勯梾棰桡纸涓や釜镎崭綔镄勬椂闂村嶆潅搴﹀潎涓篛(logN)锛夛纴鏀硅繘镄勫姙娉曟槸锛屽皢寤惰繜镄勬秷鎭浠诲姟阃氲繃 hash 绠楁硶璺鐢辫呖涓嶅悓镄 Redis Key 涓婏纴鍐嶅紑钖澶氢釜娑堣垂绾跨▼杩涜屾秷璐癸纴鎻愪緵钖炲悙閲忋
2銆佹病链塧ck链哄埗锛屾秷鎭瀛桦湪涓㈠け镄勫彲鑳芥с
3銆佸洜涓烘槸阃氲繃瀹氭椂杞璇㈢殑鏂瑰纺𨰾夊彇redis zset涓镄勬暟鎹锛屾墍浠ュ瓨鍦ㄤ竴瀹氱殑镞堕棿宸锛屽彲浠ラ氲繃缂╃煭杞璇㈡椂闂存潵杈冨皯镞堕棿宸锛屼絾鏄棰戠箒镄勮疆璇浼氶犳垚CPU镄勬氮璐癸纴鍙浠ラ氲繃wait/notify镄勬柟寮忚В鍐宠ラ梾棰樸
4銆侀渶瑕佸疄鐜板彂阃佸け璐ヨ嚜锷ㄩ吨璇曟満鍒躲
鍙傝冮摼鎺ワ细
1銆佹湁璧炲紑婧愬疄鐜帮细 https://tech.youzan.com/queuing_delay/
2銆佺编锲惧紑婧愬疄鐜帮细 https://zhuanlan.hu.com/p/94082947

RabbitMQ 链韬骞朵笉鐩存帴鎻愪緵瀵瑰欢杩熼槦鍒楃殑鏀鎸侊纴鎴戜滑渚濋潬 RabbitMQ 镄凾TL浠ュ强姝讳俊阒熷垪锷熻兘锛屾潵瀹炵幇寤惰繜阒熷垪镄勬晥鏋溿

姝讳俊阒熷垪瀹为檯涓婃槸涓绉 RabbitMQ 镄勬秷鎭澶勭悊链哄埗锛屽綋 RabbmitMQ 鍦ㄧ敓浜у拰娑堣垂娑堟伅镄勬椂鍊欙纴娑堟伅阆囧埌濡备笅镄勬儏鍐碉纴灏变细鍙樻垚钬沧讳俊钬濓细

娑堟伅鐢熷瓨镞堕棿 TTL

TTL锛圱ime-To-Live锛夋槸 RabbitMQ 镄勪竴绉嶉珮绾х壒镐э纴琛ㄧず浜嗕竴𨱒℃秷鎭镄勬渶澶х敓瀛樻椂闂达纴鍗曚綅涓烘绉掋傚傛灉涓𨱒℃秷鎭鍦 TTL 璁剧疆镄勬椂闂村唴娌℃湁琚娑堣垂锛岄偅涔埚畠灏变细鍙樻垚涓𨱒℃讳俊锛岃繘鍏ユ垜浠涓婇溃镓璇寸殑姝讳俊阒熷垪銆

链変袱绉崭笉钖岀殑鏂瑰纺鍙浠ヨ剧疆娑堟伅镄 TTL 灞炴э纴涓绉嶆柟寮忔槸鐩存帴鍦ㄥ垱寤洪槦鍒楃殑镞跺栾剧疆鏁翠釜阒熷垪镄 TTL 杩囨湡镞堕棿锛屾墍链夎繘鍏ラ槦鍒楃殑娑堟伅锛岄兘琚璁剧疆鎴愪简缁熶竴镄勮繃链熸椂闂达纴涓镞︽秷鎭杩囨湡锛岄┈涓婂氨浼氲涓㈠纯锛岃繘鍏ユ讳俊阒熷垪锛涘彟涓绉嶆柟寮忔槸阍埚瑰崟𨱒℃秷鎭璁剧疆锛屼笉杩囬渶瑕佹敞镒忕殑鏄锛屼娇鐢ㄨ繖绉嶆柟寮忚剧疆镄 TTL锛屾秷鎭鍙鑳戒笉浼氭寜镞舵讳骸锛屽洜涓 RabbitMQ 鍙浼氭镆ョ涓涓娑堟伅鏄钖﹁繃链熴傛瘆濡傝繖绉嶆儏鍐碉纴绗涓涓娑堟伅璁剧疆浜 20s 镄 TTL锛岀浜屼釜娑堟伅璁剧疆浜 10s 镄 TTL锛岄偅涔 RabbitMQ 浼氱瓑鍒扮涓涓娑堟伅杩囨湡涔嫔悗锛屾墠浼氲╃浜屼釜娑堟伅杩囨湡銆傚湪RabbitMQ镄3.5.8鐗堟湰浠ュ悗锛屾垜浠灏卞彲浠ヤ娇鐢ㄥ畼鏂规帹钻愮殑 rabbitmq delayed message exchange 鎻掍欢寰堟柟渚垮湴瀹炵幇寤惰繜娑堟伅镄勫姛鑳姐
浼樼偣锛
1銆佹伅鍙闱犲彂阃併佹秷鎭鍙闱犳姇阃掋佹讳俊阒熷垪𨱒ヤ缭闅沧秷鎭镊冲皯琚娑堣垂涓娆′互鍙婃湭琚姝g‘澶勭悊镄勬秷鎭涓崭细琚涓㈠纯銆
2銆侀氲繃 RabbitMQ 闆嗙兢镄勭壒镐э纴鍙浠ュ緢濂界殑瑙e喅鍗旷偣鏁呴㱩闂棰桡纴涓崭细锲犱负鍗曚釜鑺傜偣鎸傛帀瀵艰嚧寤惰繜阒熷垪涓嶅彲鐢ㄦ垨钥呮秷鎭涓㈠け銆
缂虹偣锛
1銆侀渶瑕佽嚜宸辨惌寤哄拰杩愮淮闆嗙兢銆

rocketmq鍦ㄥ彂阃佸欢镞舵秷鎭镞讹纴鏄鍏堟妸娑堟伅鎸夌収寤惰繜镞堕棿娈靛彂阃佸埌鎸囧畾镄勯槦鍒椾腑锛堟妸寤舵椂镞堕棿娈电浉钖岀殑娑堟伅鏀惧埌钖屼竴涓阒熷垪涓锛屼缭璇佷简娑堟伅澶勭悊镄勯‘搴忔э纴鍙浠ヨ╁悓涓涓阒熷垪涓娑堟伅寤舵椂镞堕棿鏄鐩稿悓镄勶纴鏁翠釜RocketMQ涓寤舵椂娑堟伅镞舵寜镦ч掑为‘搴忔帓搴忥纴淇濊瘉淇℃伅澶勭悊镄勫厛钖庨‘搴忔с傦级銆备箣钖庯纴阃氲繃涓涓瀹氭椂鍣ㄦ潵杞璇㈠勭悊杩欎簺阒熷垪閲岀殑淇℃伅锛屽垽鏂鏄钖﹀埌链熴傚逛簬鍒版湡镄勬秷鎭浼氩彂阃佸埌鐩稿簲镄勫勭悊阒熷垪涓锛岃繘琛屽勭悊銆
娉ㄦ剰 锛氱洰鍓峈ocketMQ鍙鏀鎸佺壒瀹氱殑寤舵椂镞堕棿娈碉纴1s,5s,10s,...2h锛屼笉鑳芥敮鎸佷换镒忔椂闂存电殑寤舵椂璁剧疆銆
浼樼偣锛
1銆佸垎甯冨纺銆侀珮钖炲悙閲忋侀珮镐ц兘銆侀珮鍙闱犮
缂虹偣锛
1銆侀渶瑕佽嚜宸辨惌寤哄拰杩愮淮闆嗙兢銆
2銆佸彧鏀鎸佺壒瀹氱殑寤舵椂镞堕棿娈点

ActiveMQ鍦5.4鍙娄互涓婄増链寮濮嬫敮鎸佹寔涔呭寲镄勫欢杩熸秷鎭锷熻兘锛岀敋镊虫敮鎸丆ron琛ㄨ揪寮忋傞粯璁ゆ槸璇ュ姛鑳芥槸涓嶅紑钖镄勶纴濡傛灉寮钖闇瑕佷慨鏀归厤缃鏂囦欢activemq.xml锛屽湪broker鑺傜偣涓婃妸schelerSupport灞炴ц剧疆涓篓rue銆
浼樼偣锛
1銆佹敮鎸乧ron琛ㄨ揪寮忥纴镟寸伒娲汇
缂虹偣锛
1銆侀渶瑕佽嚜宸辨惌寤哄拰杩愮淮闆嗙兢銆

鏁版嵁閲忓皯镄勮瘽鍙浠ュ皾璇晀uartz銆乨elayQueue銆乀imeWheel (镞堕棿杞)绛夋柟妗堬纴浣嗘槸涓轰简淇濊瘉鏁版嵁涓崭涪澶憋纴闇瑕佸熷姪绗涓夋柟鎸佷箙鍖栧瓨鍌ㄧ郴缁燂纴渚嫔俽ocksDB绛夈

linux环境下的进程调度算法有哪些

第一部分: 实时调度算法介绍

对于什么是实时系统,POSIX 1003.b作了这样的定义:指系统能够在限定的响应时间内提供所需水平的服务。而一个由Donald Gillies提出的更加为大家接受的定义是:一个实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。

实时系统根据其对于实时性要求的不同,可以分为软实时和硬实时两种类型。硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。比如航天中的宇宙飞船的控制等就是现实中这样的系统。其他的所有有实时特性的系统都可以称之为软实时系统。如果明确地来说,软实时系统就是那些从统计的角度来说,一个任务(在下面的论述中,我们将对任务和进程不作区分)能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误,像实时多媒体系统就是一种软实时系统。

一个计算机系统为了提供对于实时性的支持,它的操作系统必须对于CPU和其他资源进行有效的调度和管理。在多任务实时系统中,资源的调度和管理更加复杂。本文下面将先从分类的角度对各种实时任务调度算法进行讨论,然后研究普通的 Linux操作系统的进程调度以及各种实时Linux系统为了支持实时特性对普通Linux系统所做的改进。最后分析了将Linux操作系统应用于实时领域中时所出现的一些问题,并总结了各种实时Linux是如何解决这些问题的。

1. 实时CPU调度算法分类

各种实时操作系统的实时调度算法可以分为如下三种类别[Wang99][Gopalan01]:基于优先级的调度算法(Priority-driven scheling-PD)、基于CPU使用比例的共享式的调度算法(Share-driven scheling-SD)、以及基于时间的进程调度算法(Time-driven scheling-TD),下面对这三种调度算法逐一进行介绍。

1.1. 基于优先级的调度算法

基于优先级的调度算法给每个进程分配一个优先级,在每次进程调度时,调度器总是调度那个具有最高优先级的任务来执行。根据不同的优先级分配方法,基于优先级的调度算法可以分为如下两种类型[Krishna01][Wang99]:

静态优先级调度算法:

这种调度算法给那些系统中得到运行的所有进程都静态地分配一个优先级。静态优先级的分配可以根据应用的属性来进行,比如任务的周期,用户优先级,或者其它的预先确定的策略。RM(Rate-Monotonic)调度算法是一种典型的静态优先级调度算法,它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级。

动态优先级调度算法:

这种调度算法根据任务的资源需求来动态地分配任务的优先级,其目的就是在资源分配和调度时有更大的灵活性。非实时系统中就有很多这种调度算法,比如短作业优先的调度算法。在实时调度算法中, EDF算法是使用最多的一种动态优先级调度算法,该算法给就绪队列中的各个任务根据它们的截止期限(Deadline)来分配优先级,具有最近的截止期限的任务具有最高的优先级。

1.2. 基于比例共享调度算法

虽然基于优先级的调度算法简单而有效,但这种调度算法提供的是一种硬实时的调度,在很多情况下并不适合使用这种调度算法:比如象实时多媒体会议系统这样的软实时应用。对于这种软实时应用,使用一种比例共享式的资源调度算法(SD算法)更为适合。

比例共享调度算法指基于CPU使用比例的共享式的调度算法,其基本思想就是按照一定的权重(比例)对一组需要调度的任务进行调度,让它们的执行时间与它们的权重完全成正比。

我们可以通过两种方法来实现比例共享调度算法[Nieh01]:第一种方法是调节各个就绪进程出现在调度队列队首的频率,并调度队首的进程执行;第二种做法就是逐次调度就绪队列中的各个进程投入运行,但根据分配的权重调节分配个每个进程的运行时间片。

比例共享调度算法可以分为以下几个类别:轮转法、公平共享、公平队列、彩票调度法(Lottery)等。

比例共享调度算法的一个问题就是它没有定义任何优先级的概念;所有的任务都根据它们申请的比例共享CPU资源,当系统处于过载状态时,所有的任务的执行都会按比例地变慢。所以为了保证系统中实时进程能够获得一定的CPU处理时间,一般采用一种动态调节进程权重的方法。

1.3. 基于时间的进程调度算法

对于那些具有稳定、已知输入的简单系统,可以使用时间驱动(Time-driven:TD)的调度算法,它能够为数据处理提供很好的预测性。这种调度算法本质上是一种设计时就确定下来的离线的静态调度方法。在系统的设计阶段,在明确系统中所有的处理情况下,对于各个任务的开始、切换、以及结束时间等就事先做出明确的安排和设计。这种调度算法适合于那些很小的嵌入式系统、自控系统、传感器等应用环境。

这种调度算法的优点是任务的执行有很好的可预测性,但最大的缺点是缺乏灵活性,并且会出现有任务需要被执行而CPU却保持空闲的情况。

2. 通用Linux系统中的CPU调度

通用Linux系统支持实时和非实时两种进程,实时进程相对于普通进程具有绝对的优先级。对应地,实时进程采用SCHED_FIFO或者SCHED_RR调度策略,普通的进程采用SCHED_OTHER调度策略。

在调度算法的实现上,Linux中的每个任务有四个与调度相关的参数,它们是rt_priority、policy、priority(nice)、counter。调度程序根据这四个参数进行进程调度。

在SCHED_OTHER 调度策略中,调度器总是选择那个priority+counter值最大的进程来调度执行。从逻辑上分析,SCHED_OTHER调度策略存在着调度周期(epoch),在每一个调度周期中,一个进程的priority和counter值的大小影响了当前时刻应该调度哪一个进程来执行,其中 priority是一个固定不变的值,在进程创建时就已经确定,它代表了该进程的优先级,也代表这该进程在每一个调度周期中能够得到的时间片的多少; counter是一个动态变化的值,它反映了一个进程在当前的调度周期中还剩下的时间片。在每一个调度周期的开始,priority的值被赋给 counter,然后每次该进程被调度执行时,counter值都减少。当counter值为零时,该进程用完自己在本调度周期中的时间片,不再参与本调度周期的进程调度。当所有进程的时间片都用完时,一个调度周期结束,然后周而复始。另外可以看出Linux系统中的调度周期不是静态的,它是一个动态变化的量,比如处于可运行状态的进程的多少和它们priority值都可以影响一个epoch的长短。值得注意的一点是,在2.4以上的内核中, priority被nice所取代,但二者作用类似。

可见SCHED_OTHER调度策略本质上是一种比例共享的调度策略,它的这种设计方法能够保证进程调度时的公平性--一个低优先级的进程在每一个epoch中也会得到自己应得的那些CPU执行时间,另外它也提供了不同进程的优先级区分,具有高priority值的进程能够获得更多的执行时间。

对于实时进程来说,它们使用的是基于实时优先级rt_priority的优先级调度策略,但根据不同的调度策略,同一实时优先级的进程之间的调度方法有所不同:

SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield);

SCHED_RR:这种调度策略跟上面的SCHED_FIFO一模一样,除了它给每个进程分配一个时间片,时间片到了正在执行的进程就放弃执行;时间片的长度可以通过sched_rr_get_interval调用得到;

由于Linux系统本身是一个面向桌面的系统,所以将它应用于实时应用中时存在如下的一些问题:

Linux系统中的调度单位为10ms,所以它不能够提供精确的定时;

当一个进程调用系统调用进入内核态运行时,它是不可被抢占的;

Linux内核实现中使用了大量的封中断操作会造成中断的丢失;

由于使用虚拟内存技术,当发生页出错时,需要从硬盘中读取交换数据,但硬盘读写由于存储位置的随机性会导致随机的读写时间,这在某些情况下会影响一些实时任务的截止期限;

虽然Linux进程调度也支持实时优先级,但缺乏有效的实时任务的调度机制和调度算法;它的网络子系统的协议处理和其它设备的中断处理都没有与它对应的进程的调度关联起来,并且它们自身也没有明确的调度机制;

3. 各种实时Linux系统

3.1. RT-Linux和RTAI

RT -Linux是新墨西哥科技大学(New Mexico Institute of Technology)的研究成果[RTLinuxWeb][Barabanov97]。它的基本思想是,为了在Linux系统中提供对于硬实时的支持,它实现了一个微内核的小的实时操作系统(我们也称之为RT-Linux的实时子系统),而将普通Linux系统作为一个该操作系统中的一个低优先级的任务来运行。另外普通Linux系统中的任务可以通过FIFO和实时任务进行通信。RT-Linux的框架如图 1所示:

图 1 RT-Linux结构

RT -Linux的关键技术是通过软件来模拟硬件的中断控制器。当Linux系统要封锁CPU的中断时时,RT-Linux中的实时子系统会截取到这个请求,把它记录下来,而实际上并不真正封锁硬件中断,这样就避免了由于封中断所造成的系统在一段时间没有响应的情况,从而提高了实时性。当有硬件中断到来时, RT-Linux截取该中断,并判断是否有实时子系统中的中断例程来处理还是传递给普通的Linux内核进行处理。另外,普通Linux系统中的最小定时精度由系统中的实时时钟的频率决定,一般Linux系统将该时钟设置为每秒来100个时钟中断,所以Linux系统中一般的定时精度为 10ms,即时钟周期是10ms,而RT-Linux通过将系统的实时时钟设置为单次触发状态,可以提供十几个微秒级的调度粒度。

RT-Linux实时子系统中的任务调度可以采用RM、EDF等优先级驱动的算法,也可以采用其他调度算法。

RT -Linux对于那些在重负荷下工作的专有系统来说,确实是一个不错的选择,但他仅仅提供了对于CPU资源的调度;并且实时系统和普通Linux系统关系不是十分密切,这样的话,开发人员不能充分利用Linux系统中已经实现的功能,如协议栈等。所以RT-Linux适合与工业控制等实时任务功能简单,并且有硬实时要求的环境中,但如果要应用与多媒体处理中还需要做大量的工作。

意大利的RTAI( Real-Time Application Interface )源于RT-Linux,它在设计思想上和RT-Linux完全相同。它当初设计目的是为了解决RT-Linux难于在不同Linux版本之间难于移植的问题,为此,RTAI在 Linux 上定义了一个实时硬件抽象层,实时任务通过这个抽象层提供的接口和Linux系统进行交互,这样在给Linux内核中增加实时支持时可以尽可能少地修改 Linux的内核源代码。

3.2. Kurt-Linux

Kurt -Linux由Kansas大学开发,它可以提供微秒级的实时精度[KurtWeb] [Srinivasan]。不同于RT-Linux单独实现一个实时内核的做法,Kurt -Linux是在通用Linux系统的基础上实现的,它也是第一个可以使用普通Linux系统调用的基于Linux的实时系统。

Kurt-Linux将系统分为三种状态:正常态、实时态和混合态,在正常态时它采用普通的Linux的调度策略,在实时态只运行实时任务,在混合态实时和非实时任务都可以执行;实时态可以用于对于实时性要求比较严格的情况。

为了提高Linux系统的实时特性,必须提高系统所支持的时钟精度。但如果仅仅简单地提高时钟频率,会引起调度负载的增加,从而严重降低系统的性能。为了解决这个矛盾, Kurt-Linux采用UTIME所使用的提高Linux系统中的时钟精度的方法[UTIMEWeb]:它将时钟芯片设置为单次触发状态(One shot mode),即每次给时钟芯片设置一个超时时间,然后到该超时事件发生时在时钟中断处理程序中再次根据需要给时钟芯片设置一个超时时间。它的基本思想是一个精确的定时意味着我们需要时钟中断在我们需要的一个比较精确的时间发生,但并非一定需要系统时钟频率达到此精度。它利用CPU的时钟计数器TSC (Time Stamp Counter)来提供精度可达CPU主频的时间精度。

对于实时任务的调度,Kurt-Linux采用基于时间(TD)的静态的实时CPU调度算法。实时任务在设计阶段就需要明确地说明它们实时事件要发生的时间。这种调度算法对于那些循环执行的任务能够取得较好的调度效果。

Kurt -Linux相对于RT-Linux的一个优点就是可以使用Linux系统自身的系统调用,它本来被设计用于提供对硬实时的支持,但由于它在实现上只是简单的将Linux调度器用一个简单的时间驱动的调度器所取代,所以它的实时进程的调度很容易受到其它非实时任务的影响,从而在有的情况下会发生实时任务的截止期限不能满足的情况,所以也被称作严格实时系统(Firm Real-time)。目前基于Kurt-Linux的应用有:ARTS(ATM Reference Traffic System)、多媒体播放软件等。另外Kurt-Linux所采用的这种方法需要频繁地对时钟芯片进行编程设置。

3.3. RED-Linux

RED -Linux是加州大学Irvine分校开发的实时Linux系统[REDWeb][ Wang99],它将对实时调度的支持和Linux很好地实现在同一个操作系统内核中。它同时支持三种类型的调度算法,即:Time-Driven、 Priority-Dirven、Share-Driven。

为了提高系统的调度粒度,RED-Linux从RT-Linux那儿借鉴了软件模拟中断管理器的机制,并且提高了时钟中断频率。当有硬件中断到来时,RED-Linux的中断模拟程序仅仅是简单地将到来的中断放到一个队列中进行排队,并不执行真正的中断处理程序。

另外为了解决Linux进程在内核态不能被抢占的问题, RED-Linux在Linux内核的很多函数中插入了抢占点原语,使得进程在内核态时,也可以在一定程度上被抢占。通过这种方法提高了内核的实时特性。

RED-Linux的设计目标就是提供一个可以支持各种调度算法的通用的调度框架,该系统给每个任务增加了如下几项属性,并将它们作为进程调度的依据:

Priority:作业的优先级;

Start-Time:作业的开始时间;

Finish-Time:作业的结束时间;

Budget:作业在运行期间所要使用的资源的多少;

通过调整这些属性的取值及调度程序按照什么样的优先顺序来使用这些属性值,几乎可以实现所有的调度算法。这样的话,可以将三种不同的调度算法无缝、统一地结合到了一起。

阅读全文

与有限期任务的安排算法的改进相关的资料

热点内容
守望执行命令 浏览:367
加密狗插上去了怎么办 浏览:622
锤子m1怎么把文件夹重置 浏览:213
APP的数据会存在哪里 浏览:64
一支轻快又解压的舞 浏览:586
80x86编程手册 浏览:765
android机制使用 浏览:361
国外太空探索网站源码 浏览:643
dotaimba命令大全 浏览:13
手解剖pdf 浏览:733
单片机无法烧写程序 浏览:413
pline命令 浏览:111
760贴片机编程视频 浏览:333
欧姆龙plc编程第36讲 浏览:915
我的世界如何将一个服务器弄崩 浏览:8
php网站访问量代码 浏览:431
怠速压缩机咔咔响 浏览:176
怎么才能修改APP中的数据 浏览:688
哪里有抢单的app 浏览:462
算法概率题 浏览:465