Page 338 - 《软件学报》2020年第10期
P. 338

3314                                  Journal of Software  软件学报 Vol.31, No.10, October 2020


                     任务分发方向              单线程逐个执行任务             子线程 T k+1
              主线程 T 0

           (a)  共享队列模式                                            子线程 T k+2
                                            子线程 T k,k>0

           (b)  私有队列模式
                       任务分发方向
              主线程 T 0
                      运行队列 q 0

                                                             子线程数量共 S x⋅S y 个
            子线程 T k,k>0

                                                                          …
               位置(x,y,w,h)
                序列号 seq
               其他相关参数
                               就绪队列      运行队列 溢出队列          子线程 T k+1
                                  Q k      q k
             填充矩形 R 的任务 t       长度 N     长度 M

                                           Fig.6   Multi-task queues
                                            图 6   多任务调度队列

                          PROCEDURE Master(pDrawable,pGC,x,y,w,h)
                          INPUT:Drawable 指针 pDrawable,GC 指针
                                                       pGC,矩形坐标 x,y,矩形大小 w,h;
                          OUTPUT:子线程就绪队列 Q k.
                          BEGIN
                              建立 S x⋅S y 个子线程
                              新建任务 R(x,y,w,h,seq++)
                              计算 R 应当归属的子屏幕和子线程序号 k
                                                       Q k,并唤醒所有等待 Q k 的子线程
                              将任务 R 加入子线程 T k 的就绪队列
                              IF (Q k 的长度>N) DO{
                                       取出 Q k 的最多前 M 个任务加入到主线程 T 0 的运行队列 q 0
                                       Process(q 0)
                              }
                          END
                                            Fig.7   Master T 0  thread
                                             图 7   主线程 T 0 算法

                         PROCEDURE Worker(Q k)
                         INPUT:子线程就绪队列 Q k;
                         BEGIN
                              DO{
                                  IF (就绪队列 Q k 的长度>0){
                                      从 Q k 中取出包含最多 M 个任务放入子线程 T k 的运行队列 q k

                                      Process(q k)
                                   }  ELSE
                                      睡眠等待 Q k
                              } WHILE (True)
                         END
                                            Fig.8   Worker T k  thread
                                             图 8   子线程 T k 算法
   333   334   335   336   337   338   339   340   341   342   343