多核实时调度—多项式时间复杂度最优任务分配算法PTAS解读

本文主要是介绍多核实时调度—多项式时间复杂度最优任务分配算法PTAS解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PTAS 是针对多核分区调度的,最初的那篇论文,是提出了一个分配思想,而没有指定分区调度中具体是采用固定优先级调度和动态优先级比如EDF调度。然后后面一个论文就将其具体化,且高效实现了,该文章的算法过程如下。

针对periodic任务,在每个核上采用EDF调度,是一种可以以 \varepsilon 误差接近理论最优的实时任务分配算法,其中 \varepsilon 是一个我们人为指定的常数,最牛逼的是,该算法在运行时可以以多项式复杂度时间得到以\varepsilon 为误差的最优分配结果。该论文理解起来还是很有难度的。该方法的实现过程如下:首先指定\varepsilon(下面我们的分析用字母e代替了),然后穷举法生成所有可行的分配表(2的n次方这样的指数时间复杂度),然后运行时(比如实时操作系统正在运行了)查找匹配该分配表,从而得到分配结果。

详细过程如下:

  1.  离散化利用率0-1的所有到区间:(e/(1+e), e],(e, e(1+e)],(e, e(1+e)^2],.....。然后所有利用率点ui都会取所在区间的右端点值,也就是round up(或者叫做modified)。这样之后可能存在的利用率点仅为:e,e(1+e),e(1+e)^2,......。总共有多少个利用率点呢,这个可以算的,我们记为|V(e)|。我们会发现后一个利用率值除以前一个都等于(1+e),而且利用点的个数和人为指定的常数e都是有关系的,所以叫做人为指定误差嘛。很明显,如果是单核,能容纳的最多任务为1/e个了。
  2. 这样我们就可以把一个任务集n个任务的利用率分配情况给穷举出来了。
    比如e=0.4(我们计算出只有3个利用率点,0.4, 0.56, 0.784,因此|V(e)|=3)。那么对于每个核,我们都能穷举出所有可能的利用率存在方式,表示为有序对(下面会介绍),比如<2,0,0>,<1,1,0>,<0,0,1>,<0,1,0>,其中<2,0,0>表示0.4利用率处可以有2个0.4利用率,但是0.56处和0.784处都不能有该点利用率的任务了,因为加起来大于1了,就不可调度了。这些合法有序对为,<2,0,0>,<1,1,0>,<1,1,0>,<0,0,1>,<0,1,0> ,其中<1,0,0>这个就叫做非最大有序对(或者说非饱和),因为该有序对再加入一个0.4利用的任务,照样还是可调度的。所以最大有序对意思是再加入一个e利用率的任务,就不可调度了。处理器只有一个核的情况,最大有序对表述为( 构造的时间复杂度为1/e为指数的 )
    L1(e)={ <2,0,0>,<1,1,0>,<0,0,1>,<0,1,0> },用z1表示某个有序对的编号,也叫ID
    多核情况下,每个核都用这个表示即可,因为是同构多核。


    用户给定输入3个任务,它们的利用率{0.3,0.35,0.55},利用率转换(叫做modified)后为{0.4,0.4,0.56},表示为下面要说的有序对,就是<2,1,0>(这个是输入的),该任务集在两个核上的分配,就会有很多种情况,其中可行的分配方式只有下面2种而已(每个核上利用率小于1该核即可调度)。因此我们可以用一个有序对来表示分配结果<x1,x2,...,xi,...,x|V(e)|>,这里的|V(e)|是作为x的下标。xi表示分配在e(1+e)^i这个利用率点的任务数。这个例子中,分配方法1,对于核1,就是<2,0,0>,对于核2,就是<0,1,0>。分配方法2,对于核1,就是<1,1,0>,对于核2,就是<1,0,0>。


    如果是2个核,最大化该如何表述呢,首先肯定是针对一个目标有序对<y1,y2,...y|V(e)|>,此时该有序对就是这2个核所能容纳下的最大利用率了,任意添加一个小的e利用率进去,都会导致分配失败(构造这样,时间复杂度|L1(e)|^m)。那么很明显,这个最大化的有序对,分配在两个核上,每个核也处于最饱和状态了,即每个核的最大有序对里挑出来一个呗,那上面的z1就是核1上挑出来的有序对的编号,z2,就是核2上挑出来的有序对的编号。因此形式化表述为:
    (<y1,y2,...,y|V(e)|>),<z1,z2,...,zm>),m为核数。

    Lm(e)={ (<y1,y2,...,y|V(e)|>),<z1,z2,...,zm>),(<y1’,y2’,...,y‘|V(e)|>),<z1’,z2‘,...,zm’>),......, }。  构建的查找表


    上面例子表述为:
    L2(e)={(<4,0,0>),<1,1>),(<3,1,0>),<1,2>),(<3,0,1>),<1,3>)},这个就是PTAS算法在运行前预处理时构建的查找表

    上面的意思是,假如对于<4,0,0>这个是round up后的目标任务集,表示有4个0.4利用率的任务,那这个有序对为什么是2核处理器中最大有序对呢,因为你随便再给一个利用率(0.4,0.56.0.784这几个随便给一个),都会分配失败。这个分配结果就是每个核都在0.4那儿分配两个就行了,也就是核1:<2,0,0>,核2也是:<2,0,0>,查询上面L1(e)的表达式可知,编号都是1的有序对,因此表示为<z1,z2>为<1,1>。同理(<3,1,0>),<1,2>)也是这么得来的。

    我们会发现这样一个性质,就是待分配最大化有序对的每个分量成员,就是每个核最大化有序对对应分量求和需要相等,比如(<4,0,0>),<1,1>)中的4,在核1中是2,核2中也是2,加起来就是4了。那么如果现在用户给一个任务集,表示为了<3,0,0>有序对,问我们能不能分配成功,当然可以,因为我们能找到预处理时候上面构造的查找表,和查找表中的<4,0,0>相匹配,发现每个分量只要小于等于查找表中的<4,0,0>的每个分量,则该<3,0,0>有序对就可以分配成功,就用对应的<1,1>这个分配方式即可,即核1分配两个0.4利用率的任务,核2就只分配剩下的一个就行了(虽然最饱满的情况是可以分2个0.4的)
  3. 终于解释完了上面的最大有序对,其实分配的过程就是,预先建立好查找表Lookup table,从上面直到为1/e为指数的时间复杂度的,但是没关系,这个是系统运行前预处理阶段完成的,然后运行阶段,任意给一个任务集,只需要进行round up修改为有序对,然后和查找表中的进行匹配(就是每个分量都小于查找表中某个有序对即可,这个匹配过程多项式时间复杂度的),然后就能知道分配成功或者失败了,成功也能知道具体如何分配核的了。
    真正的运行时阶段,就是多项式时间复杂度而已,这就PTAS分配算法名字的由来。

    (当然PTAS算法还考虑了有些任务利用率小于e/(1+e)的情况,这个最后分配即可,看看哪个核能放下就分配即可)

     

总结: PTAS分配算法确实做到了多项式时间复杂度的可指定精度(和理论最优分配算法的差距)的分配,但是该算法构建查找表因为还是有点复杂(不吃透这个算法原理就没法弄),而查找表会占用很多的内存空间,因此该算法实际系统中用到的不多,但是这个方法很有启发意义,空间换时间。实际实时系统中用得较多的是启发式分配算法(虽然不能最优,但是可以很接近最优,而且实现简单,不需要占什么内存,时间复杂度也低,而且还有个重要的点:PTAS不能适应任务动态加入的情况,而启发式算法(也叫近似算法)则可以比如FF),比如FF,NF,WF,BF等,下个博客就讲解这几个算法。

多核实时调度—任务分配启发式算法解读_标biao的博客-CSDN博客

这篇关于多核实时调度—多项式时间复杂度最优任务分配算法PTAS解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/171405

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi