发明名称 一种基于任务窃取的并发队列访问控制系统
摘要 本发明公开了一种基于任务窃取的并发队列访问控制方法及系统,基于任务窃取的并发队列访问控制系统由安全访问模块(1)、并发访问度监控模块(2)、任务调度模块(3)和预测模块(4)组成。本发明方法通过将双端队列的操作与访问控制分开,建立队列并发访问度的监控机制,在任务窃取的过程中,根据队列并发访问度来动态自适应选取队列进行操作,从而将双端队列的并发访问均匀的分担到每个双端队列上,并对每个双端队列的访问采用阻塞方式来保障对双端队列执行操作的线程安全。本发明方法支持不同的任务窃取策略,且对于运行在并行随机访问机上的使用任务窃取的应用,具有更高的吞吐率和加速效果。
申请公布号 CN104156260B 申请公布日期 2017.03.15
申请号 CN201410386814.3 申请日期 2014.08.07
申请人 北京航空航天大学 发明人 刘轶;刘驰;宋平
分类号 G06F9/46(2006.01)I 主分类号 G06F9/46(2006.01)I
代理机构 北京永创新实专利事务所 11121 代理人 李有浩
主权项 一种基于任务窃取的并发队列访问控制系统,在PRAM系统上运行基于任务窃取的并发队列访问控制系统,其特征在于:所述基于任务窃取的并发队列访问控制系统由安全访问模块(1)、并发访问度监控模块(2)、任务调度模块(3)和预测模块(4)组成;任务调度模块(3)首先从PRAM系统中获得所有双端队列DEQUE={deque<sub>1</sub>,deque<sub>2</sub>,…,deque<sub>i</sub>,…,deque<sub>n</sub>}、所有并发访问度S={s<sub>1</sub>,s<sub>2</sub>,…,s<sub>i</sub>,…,s<sub>n</sub>}和所有线程THREAD={thread<sub>1</sub>,thread<sub>2</sub>,…,thread<sub>i</sub>,…,thread<sub>n</sub>};其中,deque<sub>1</sub>表示第一个双端队列,deque<sub>2</sub>表示第二个双端队列,deque<sub>i</sub>表示第i个双端队列,deque<sub>n</sub>表示最后一个双端队列,n表示双端队列的标识号;s<sub>1</sub>表示第一个双端队列deque<sub>1</sub>的并发访问度,s<sub>2</sub>表示第二个双端队列deque<sub>2</sub>的并发访问度,s<sub>i</sub>表示第i个双端队列deque<sub>i</sub>的并发访问度,s<sub>n</sub>表示最后一个双端队列deque<sub>n</sub>的并发访问度,所述s<sub>n</sub>中包括有当前被阻塞的线程个数a和双端队列deque<sub>n</sub>中的任务个数b,则s<sub>n</sub>=(a,b);所述双端队列DEQUE={deque<sub>1</sub>,deque<sub>2</sub>,…,deque<sub>i</sub>,…,deque<sub>n</sub>}包括有本地双端队列和外部双端队列;然后:(A)由任务调度模块(3)从DEQUE={deque<sub>1</sub>,deque<sub>2</sub>,…,deque<sub>i</sub>,…,deque<sub>n</sub>}中选取除deque<sub>i</sub>以外的第一个待定‑双端队列deque<sub>1</sub>,并记录下该deque<sub>1</sub>的并发访问度s<sub>1</sub>;继而,并发访问度监控模块(2)从deque<sub>1</sub>提取出deque<sub>1</sub>对应的s<sub>1</sub>,由队列预测模块(4)依据并发访问度s<sub>1</sub>来预测第一个待定‑双端队列deque<sub>1</sub>是否存在访问密集,访问密集预测关系<img file="FDA0001171167730000011.GIF" wi="461" he="93" />a表示当前被阻塞的线程个数,b表示双端队列deque<sub>n</sub>中的任务个数,若<img file="FDA0001171167730000012.GIF" wi="327" he="85" />则第一个待定‑双端队列deque<sub>1</sub>被选取,成为第一个选定‑双端队列deque<sub>1</sub>,执行安全访问模块(1);若<img file="FDA0001171167730000013.GIF" wi="323" he="79" />则放弃第一个待定‑双端队列deque<sub>1</sub>,执行(B);(B)由任务调度模块(3)从DEQUE={deque<sub>1</sub>,deque<sub>2</sub>,…,deque<sub>i</sub>,…,deque<sub>n</sub>}中选取除deque<sub>i</sub>以外的第二个待定‑双端队列deque<sub>2</sub>,并记录下该deque<sub>2</sub>的并发访问度s<sub>2</sub>;继而,并发访问度监控模块(2)从deque<sub>2</sub>提取出deque<sub>2</sub>对应的s<sub>2</sub>,由队列预测模块(4)依据并发访问度s<sub>2</sub>来预测第二个待定‑双端队列deque<sub>2</sub>是否存在访问密集,访问密集预测关系<img file="FDA0001171167730000021.GIF" wi="461" he="87" />a表示当前被阻塞的线程个数,b表示双端队列deque<sub>n</sub>中的任务个数,若<img file="FDA0001171167730000022.GIF" wi="328" he="87" />则第二个待定‑双端队列deque<sub>2</sub>被选取,成为第二个选定‑双端队列deque<sub>2</sub>,执行安全访问模块(1);若<img file="FDA0001171167730000023.GIF" wi="323" he="86" />则放弃第二个待定‑双端队列deque<sub>2</sub>,执行(C);(C)由任务调度模块(3)从DEQUE={deque<sub>1</sub>,deque<sub>2</sub>,…,deque<sub>i</sub>,…,deque<sub>n</sub>}中选取除deque<sub>i</sub>以外的最后一个待定‑双端队列deque<sub>n</sub>,并记录下该deque<sub>n</sub>的并发访问度s<sub>n</sub>;继而,并发访问度监控模块(2)从deque<sub>n</sub>提取出deque<sub>n</sub>对应的s<sub>n</sub>,由队列预测模块(4)依据并发访问度s<sub>n</sub>来预测最后一个待定‑双端队列deque<sub>n</sub>是否存在访问密集,访问密集预测关系<img file="FDA0001171167730000024.GIF" wi="461" he="94" />a表示当前被阻塞的线程个数,b表示双端队列deque<sub>n</sub>中的任务个数,若<img file="FDA0001171167730000025.GIF" wi="323" he="85" />则最后一个待定‑双端队列deque<sub>n</sub>被选取,成为最后一个选定‑双端队列deque<sub>n</sub>,执行安全访问模块(1);若<img file="FDA0001171167730000026.GIF" wi="323" he="79" />则放弃最后一个待定‑双端队列deque<sub>n</sub>;安全访问模块(1)判断第一个选定‑双端队列deque<sub>1</sub>是否被线程占用,若<img file="FDA0001171167730000027.GIF" wi="339" he="78" />说明deque<sub>1</sub>被线程占用,则会等待,直到<img file="FDA0001171167730000028.GIF" wi="310" he="78" />变化为<img file="FDA0001171167730000029.GIF" wi="300" he="87" />时止;若<img file="FDA00011711677300000210.GIF" wi="330" he="87" />说明deque<sub>1</sub>未被线程占用,则线程thread<sub>i</sub>获得访问权,对deque<sub>1</sub>执行获取任务操作;安全访问模块(1)判断第二个选定‑双端队列deque<sub>2</sub>是否被线程占用,若<img file="FDA0001171167730000031.GIF" wi="342" he="79" />说明deque<sub>2</sub>被线程占用,则会等待,直到<img file="FDA0001171167730000032.GIF" wi="311" he="78" />变化为<img file="FDA0001171167730000033.GIF" wi="302" he="86" />时止;若<img file="FDA0001171167730000034.GIF" wi="331" he="86" />说明deque<sub>2</sub>未被线程占用,则线程thread<sub>i</sub>获得访问权,对deque<sub>2</sub>执行获取任务操作;安全访问模块(1)判断最后一个选定‑双端队列deque<sub>n</sub>是否被线程占用,若<img file="FDA0001171167730000035.GIF" wi="340" he="87" />说明deque<sub>n</sub>被线程占用,则会等待,直到<img file="FDA0001171167730000036.GIF" wi="315" he="86" />变化为<img file="FDA0001171167730000037.GIF" wi="301" he="86" />时止,线程thread<sub>i</sub>获得访问权;若<img file="FDA0001171167730000038.GIF" wi="331" he="79" />说明deque<sub>n</sub>未被线程占用,则线程thread<sub>i</sub>获得访问权,对deque<sub>n</sub>执行获取任务操作;对于外部双端队列的任务窃取包括有下列步骤:步骤101:双端队列并发度的监控当本地线程thread<sub>i</sub>的双端队列deque<sub>i</sub>中,没有任何任务时,则由任务调度模块(3)选择任意一个待定‑双端队列deque<sub>n</sub>;然后由并发访问度监控模块(2)从所述待定‑双端队列deque<sub>n</sub>中提取出并发访问度s<sub>n</sub>=(a,b);随后执行步骤102;步骤102:预测能否高效获取对双端队列的访问预测模块(4)依据并发访问度s<sub>n</sub>来预测所述待定‑双端队列deque<sub>n</sub>是否存在访问密集,访问密集预测关系<img file="FDA0001171167730000039.GIF" wi="466" he="95" />a表示当前被阻塞的线程个数,b表示双端队列deque<sub>n</sub>中的任务个数,若<img file="FDA00011711677300000310.GIF" wi="323" he="87" />则所述待定‑双端队列deque<sub>n</sub>被选取,成为选定‑双端队列deque<sub>n</sub>,执行安全访问模块(1);若<img file="FDA00011711677300000311.GIF" wi="323" he="86" />则放弃所述待定‑双端队列deque<sub>n</sub>;步骤103:获取队列的访问权当本地线程thread<sub>i</sub>需要对所述选定‑双端队列deque<sub>n</sub>进行获取任务操作时,需要获取deque<sub>n</sub>的访问权<img file="FDA00011711677300000312.GIF" wi="243" he="79" />若<img file="FDA0001171167730000041.GIF" wi="331" he="87" />说明deque<sub>n</sub>未被线程占用,则线程thread<sub>i</sub>获得访问权,执行步骤104;若<img file="FDA0001171167730000042.GIF" wi="339" he="87" />说明deque<sub>n</sub>被线程占用,则会等待,直到<img file="FDA0001171167730000043.GIF" wi="314" he="86" />变化为<img file="FDA0001171167730000044.GIF" wi="305" he="79" />时止,线程thread<sub>i</sub>获得访问权,随后执行步骤104;步骤104:阻塞的访问队列在本地线程thread<sub>i</sub>获得访问权后,会标记所述选定‑双端队列deque<sub>n</sub>被线程thread<sub>i</sub>占用;直至thread<sub>i</sub>完成获取任务操作后,才会释放对选定‑双端队列deque<sub>n</sub>的占用标记;最后,安全访问模块(1)向PRAM系统发出选定‑双端队列deque<sub>n</sub>未被线程占用的信息;对于本地双端队列的任务窃取包括有下列步骤:步骤201:获取队列的访问权当本地线程thread<sub>i</sub>的双端队列deque<sub>i</sub>中存在任务时,判断deque<sub>i</sub>的访问权<img file="FDA0001171167730000045.GIF" wi="244" he="78" />若<img file="FDA0001171167730000046.GIF" wi="331" he="87" />说明deque<sub>i</sub>未被线程占用,则线程thread<sub>i</sub>获得访问权,执行步骤202;若<img file="FDA0001171167730000047.GIF" wi="339" he="79" />说明deque<sub>i</sub>被线程占用,则会等待,直到<img file="FDA0001171167730000048.GIF" wi="314" he="79" />变化为<img file="FDA0001171167730000049.GIF" wi="302" he="87" />时止,线程thread<sub>i</sub>获得访问权,随后执行步骤202;步骤202:阻塞的访问队列在本地线程thread<sub>i</sub>获得访问权后,会标记deque<sub>i</sub>双端队列被线程thread<sub>i</sub>占用;直至thread<sub>i</sub>完成获取任务操作后,才会释放对deque<sub>i</sub>的占用标记;最后,安全访问模块(1)向PRAM系统发出deque<sub>i</sub>未被线程占用的信息。
地址 100191 北京市海淀区学院路37号