热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

MiniGUILite版本的新改进深入分析

文章标题:MiniGUILite版本的新改进深入分析。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  1 引言:为什么要开发Lite版本
  
  现在,大多数UNIX系统采用X 窗口系统作为图形用户界面,MS Windows 则采用 Microsoft公司自己设计的GUI系统。这两种GUI系统也代表着目前通用GUI系统的两种实现。比如,著名的自由软件MicroWindows就同时实现了类似于MS Windows的MicroWindows API 和类似于X Window的NanoX API。
  
  MiniGUI 原来就采用了类似于MS Windows的体系结构,并且建立了基于线程的消息传递和窗口管理机制。然而,它是基于POSIX 线程的,这种实现提供最大程度上的数据共享,但也同时造成MiniGUI体系结构上的脆弱。如果某个线程因为非法的数据访问而终止运行,则整个系统都将受到影响。
  
  另一种方法是采用UNIX进程间通信机制建立窗口系统,即类似 X Window 的客户/服务器体系。但是这种体系结构也有它的先天不足,主要是通常的 IPC 机制无法提供高效的数据复制,大量的 CPU 资源用于各进程之间复制数据。在 PDA 等设备中,这种 CPU 资源的浪费将最终导致系统性能的降低以及设备耗电量的增加。
  
  为了解决以上各种问题,同时也为了让 MiniGUI更加适合于嵌入式系统,我们开发了MiniGUI Lite 版本。
  
  2 Lite版本简介
  
  在MiniGUI Lite 版本中,我们可以同时运行多个 MiniGUI 应用程序。首先我们启动一个服务器程序 mginit,然后我们可以从中启动其他做为客户运行的 MiniGUI 应用程序。如果因为某种原因客户终止,服务器可以继续运行。mginit程序建立了一个虚拟控制台窗口。我们可以从这个虚拟控制台的命令行启动其他的程序,甚至可以通过 gdb 调试这些程序。 这大大方便了MiniGUI应用程序的调试。
  
  MiniGUI-Lite 区别于 MiniGUI 原有版本的最大不同在于我们可以在 MiniGUI-Lite 程序中创建多个窗口,但不能启动新的线程建立窗口。除此之外,其他几乎所有的 API 都和 MiniGUI 原有版本是兼容的。因此,从 MiniGUI 原有版本向 MiniGUI-Lite 版本的移植是非常简单的。象mglite-exec 包中的程序,其中所有的程序均来自 miniguiexec 包,而每个源文件的改动不超过 5 行。
  
  3 Lite版本的设计
  
  设计之初,我们确定MiniGUI Lite 版本的开发目的:
  
  保持与原先 MiniGUI 版本在源代码级 98% 以上的兼容。
  不再使用 LinuxThreads。
  可以同时运行多个基于 MiniGUI Lite 的应用程序,即多个进程,并且提供前后台进程的切换。
  显然,要满足这三个设计目的,如果采用传统的 C/S 结构对现有 MiniGUI 进行改造,应该不难实现。但传统 C/S 结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA 产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的 C/S 结构处理多个进程窗口之间的互相剪切。在这种产品中,如果采用基于传统 C/S 结构的多窗口系统,实际是一种浪费。
  
  因此,我们对 MiniGUI-Lite 版本进行了如下简化设计:
  
  每个进程维护自己的主窗口 Z 序,同一进程创建的主窗口之间互相剪切。也就是说,除了只有一个线程,只有一个消息循环之外,一个进程与原有的 MiniGUI 版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。
  建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。
  有一个服务器进程(mginit),它负责初始化一些输入设备,并且通过 UNIX Domain 套接字将输入设备的消息发送到前台的 MiniGUI Lite 客户进程。
  服务器和客户被分别限定在屏幕的某两个不相交矩形内进行绘制,同一时刻,只能有一个客户及服务器进行屏幕绘制。其他客户可继续运行,但屏幕输入被屏蔽。服务器可以利用 API 接口将某个客户切换到前台。同时,服务器和客户之间采用信号和 System V 信号量进行同步。
  服务器还采用 System V IPC 机制提供一些资源的共享,包括位图、图标、鼠标、字体等等,以便减少实际内存的消耗。
  4 Lite版本的一些实现细节
  
  4.1 系统初始化
  应用程序的入口点为main()函数,而MiniGUI应用程序的入口点为MiniGUIMain,在这两个入口点之间,是MiniGUI的初始化部分和结束部分。如图 1所示。
  
 

  
图 1 MiniGUI应用程序流程
  
  在系统初始化时,MiniGUI区分两种情况:服务器(Server)和客户(Client)。针对这两种不同的情况,随后的各项操作均有不同的处理,这主要依据全局变量mgServer。由于仅仅根据名称判断是否为服务器,所以服务器的名字只能是"mginit"。 InitGUI()是对MiniGUI进行初始化的函数,它主要负责:
  
  获取有关终端的信息。
  初始化图形抽象层。
  如果是服务器,则装入共享资源,若为客户则与共享资源建立连接。
  建立与窗口活动有关的运行环境。
  如果为服务器,则初始化事件驱动抽象层(IAL),如果为客户,则打开与服务器事件驱动器的通道。
  如果为服务器,则设定空闲处理为IdleHandler4Server,如果为客户,则设定空闲处理为IdleHandle4Client。
  流程如图 2(为突出重点,我们忽略了一些细节):
  
 

  
图 2 InitGUI流程

  4.2 共享资源初始化
  共享资源是客户服务器模型中的重要元素,它由服务器负责创建和释放,而提供所有客户程序共享的数据资源。它的初始化过程由图 3所示的调用流完成。
  
 

  
图 3 InitGUI调用流

  如果是服务器,则初始化此结构,src/kernel/sharedres.c/LoadSharedResource()负责完成这一任务,它的执行流如图 4所示:
  
 

  
图 4 LoadSharedResource 流程

  对于客户,则只需要与此结构进行连接即可,它在src/kernel/sharedres.c/AttachSharedResource()实现,参见图 5
  
 

  
图 5 AttachSharedResource 流程

  4.3 服务器客户通信连接初始化
  在客户服务器模型的讨论中,我们还将详细的讨论服务器客户的通信机制,这里只给出初始化的调用关系。见图 6。
  
 

  
图 6 通信连接的初始化

  ServerStartUp实现流程如图 7所示:
  
 

  
图 7 ServerStartUp 流程

  ClientStartUp()实现如图 8所示:
  
 

  
图 8 ClientStartUp流程

  4.4 多进程模型
  Lite版本是支持客户服务器(C/S)方式的多进程系统,在运行过程中有且仅有一个服务器程序在运行,它的全局变量mgServer被设为TRUE,其余的MiniGUI应用程序为客户,mgServer变量被设为FALSE。各个应用程序分别运行于各自不同的进程空间,如图 9所示:
  
 

  
图 9 多进程模型

  目前的程序结构使每个加载的进程拥有一个自已的桌面模型及其消息队列,进程间的通信依靠以下所提到的进程通信模型来完成。
  
  4.5 进程通信模型
  这里我们所指的进程通信包括通过共享内存实现的数据交换和通过套接字实现的客户服务器通信模型。先看在MiniGUI中使用Socket的通信模型结构,如图 10:
  
 

  
图 10 基于Socket 的通信模型

  下面再看看MiniGUI进程间的资源共享问题。见图 11。
  

  
图 11 内存共享通信模型

  如上图所示,服务器负责装入共享资源,其中包括系统图标、位图、字体等,客户则通过AttachSharedResource()获取指向共享资源的指针,初始化一块共享内存及与使用已有共享内存的方法在前面的描述中已提到,在此不再赘述。
  
  4.6 各进程之间的同步
  这里所指的进程同步主要是指各进程绘制的同步,显然,同时不可能有两个进程向屏幕绘制。传统的GUI实现大多是只有一个进程负责绘制,而在我们Lite版本中,各进程负责自己的绘制。同时,我们的Lite 版本还支持虚屏切换,当我们切换出去的时候,谁也不能够向屏幕绘制。
  
  Lite 版本利用Unix 信号解决了绘制同步问题。系统定义了两个信号:SIG_SETSCR 和 SIG_DNTDRAW,它们其实是重定义了的信号SIGUNUSED和 SIGSTKFLT。每个进程都定义了两个变量dont_draw和cant_draw。
  
  服务器利用SIG_SETSCR和SIG_DNTDRAW来控制各客户程序谁有权对屏幕绘制,而不是自己全权代理。这也使得进程间通信量大大减少:当服务器希望一个客户程序不要向屏幕绘制时,就向它发送SIG_DNTDRAW信号,当让其绘制时,则发送SIG_SETSCR。从而实现了各进程间的屏幕绘制同步。
  
推荐阅读
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
author-avatar
深tp悟人生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有