MiniGUILite版本的新改进深入分析
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 客户进程。
现在,大多数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 客户进程。
顶(0)
踩(0)
- 最新评论