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

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

             针对 Xorg 图形服务器的效率和性能问题,有过不少改进的尝试,比较著名的有 WayLand                        [3−6] ,如图 2 所示.
         WayLand 改进了 Client/Server 的工作模式,转而采用 Client/Compositor 模式.但 WayLand 对于帧缓存设备并无
         更多改进,对于嵌入式设备上的帧缓存设备的性能并无改善.

                                桌面环境                             桌面环境

                              Xorg 图形服务器                        基础图形库

                            帧缓存设备
                            驱动程序                             WayLand compositor

                              CPU      GPU                   CPU         GPU

                            Fig.1   Xorg server                       Fig.2  WayLand compositor
                          图 1   Xorg 图形服务器                           图 2   WayLand

             资源受限的嵌入式操作系统常采用帧缓存设备作为 Xorg 的绘图设备.随着多核 CPU 的发展,目前嵌入式系
         统也逐步采用多核嵌入式 CPU.但是 Xorg 对于帧缓存设备仍然采用单线程串行的使用模式,导致在进行大量绘
         制操作时,容易造成 CPU 单核负载过高,而其他 CPU 核心处于相对空闲的状态,甚至影响到整个 Xorg 的交互和
         显示体验.对于 Xorg 的帧缓存设备进行并行化研究,不仅对于加速帧缓存设备上的绘制操作具有意义,也将有
         利于在 Xorg 上建立多用户交互通道的研究.
             本文将试图从优化 Xorg 图形服务器的帧缓存设备入手,研究如何在多核 CPU 上优化 Xorg 图形服务器的
         显示性能.本文以下部分提及的 Xorg 图形服务器简称为 X.
         1.1   主事件循环
             与大部分系统服务进程类似,X 中最主要的部分是一个名为 Dispatch 的无限循环,称为主事件循环.其伪算
         法采用单线程模式运行,可以简要描述如图 3 所示.
             •   首先,在步骤①中,X 将睡眠等待,直到被系统通知唤醒(包括鼠标键盘等输入事件触发的 SIGIO 信号以
                及用户的请求等);
             •   然后,在步骤②中,X 将输入信息处理成标准事件放入事件队列中,并将各个事件发送给对相应事件感
                兴趣的客户端程序;
             •   最后,在步骤③中,X 完成客户端请求的服务,一般是请求图形绘制等服务.如无任何输入和服务请求发
                生,则 X 将继续睡眠等待.整个循环周而复始,直到 X 被异常条件终止为止.

                                  PROCEDURE Dispatch
                                  BEGIN
                                      WHILE (Exception=False){

                                           WaitForSomething(⋅)      ①
                                           If (Input){                     ②
                                               Event=ProcessInput(Input)

                                               SendtoClient(Event)
                                           }
                                           If (Request)             ③

                                               ProcessRequest(Request)
                                      }
                                  END
                                        Fig.3    Main loop dispatch of Xorg
                                       图 3   Xorg 图形服务器主事件循环
             可以看到:目前 X 对于用户输入、事件处理、响应用户请求等的处理依然采用串行处理方式,如果上一个
   329   330   331   332   333   334   335   336   337   338   339