圖 4 LoadSharedResource 流程 對(duì)于客戶,則只需要與此結(jié)構(gòu)進(jìn)行連接即可,它在src/kernel/sharedres.c/AttachSharedResource()實(shí)現(xiàn),參見(jiàn)圖 5
圖 5 AttachSharedResource 流程 4.3 服務(wù)器客戶通信連接初始化
在客戶服務(wù)器模型的討論中,我們還將詳細(xì)的討論服務(wù)器客戶的通信機(jī)制,這里只給出初始化的調(diào)用關(guān)系。見(jiàn)圖 6。
圖 6 通信連接的初始化 ServerStartUp實(shí)現(xiàn)流程如圖 7所示:
圖 7 ServerStartUp 流程 ClientStartUp()實(shí)現(xiàn)如圖 8所示:
圖 8 ClientStartUp流程 4.4 多進(jìn)程模型
Lite版本是支持客戶服務(wù)器(C/S)方式的多進(jìn)程系統(tǒng),在運(yùn)行過(guò)程中有且僅有一個(gè)服務(wù)器程序在運(yùn)行,它的全局變量mgServer被設(shè)為T(mén)RUE,其余的MiniGUI應(yīng)用程序?yàn)榭蛻簦琺gServer變量被設(shè)為FALSE。各個(gè)應(yīng)用程序分別運(yùn)行于各自不同的進(jìn)程空間,如圖 9所示:
圖 9 多進(jìn)程模型 目前的程序結(jié)構(gòu)使每個(gè)加載的進(jìn)程擁有一個(gè)自已的桌面模型及其消息隊(duì)列,進(jìn)程間的通信依靠以下所提到的進(jìn)程通信模型來(lái)完成。
4.5 進(jìn)程通信模型
這里我們所指的進(jìn)程通信包括通過(guò)共享內(nèi)存實(shí)現(xiàn)的數(shù)據(jù)交換和通過(guò)套接字實(shí)現(xiàn)的客戶服務(wù)器通信模型。先看在MiniGUI中使用Socket的通信模型結(jié)構(gòu),如圖 10:
圖 10 基于Socket 的通信模型 下面再看看MiniGUI進(jìn)程間的資源共享問(wèn)題。見(jiàn)圖 11。
圖 11 內(nèi)存共享通信模型 如上圖所示,服務(wù)器負(fù)責(zé)裝入共享資源,其中包括系統(tǒng)圖標(biāo)、位圖、字體等,客戶則通過(guò)AttachSharedResource()獲取指向共享資源的指針,初始化一塊共享內(nèi)存及與使用已有共享內(nèi)存的方法在前面的描述中已提到,在此不再贅述。
4.6 各進(jìn)程之間的同步
這里所指的進(jìn)程同步主要是指各進(jìn)程繪制的同步,顯然,同時(shí)不可能有兩個(gè)進(jìn)程向屏幕繪制。傳統(tǒng)的GUI實(shí)現(xiàn)大多是只有一個(gè)進(jìn)程負(fù)責(zé)繪制,而在我們Lite版本中,各進(jìn)程負(fù)責(zé)自己的繪制。同時(shí),我們的Lite 版本還支持虛屏切換,當(dāng)我們切換出去的時(shí)候,誰(shuí)也不能夠向屏幕繪制。
Lite 版本利用Unix 信號(hào)解決了繪制同步問(wèn)題。系統(tǒng)定義了兩個(gè)信號(hào):SIG_SETSCR 和 SIG_DNTDRAW,它們其實(shí)是重定義了的信號(hào)SIGUNUSED和 SIGSTKFLT。每個(gè)進(jìn)程都定義了兩個(gè)變量dont_draw和cant_draw。
服務(wù)器利用SIG_SETSCR和SIG_DNTDRAW來(lái)控制各客戶程序誰(shuí)有權(quán)對(duì)屏幕繪制,而不是自己全權(quán)代理。這也使得進(jìn)程間通信量大大減少:當(dāng)服務(wù)器希望一個(gè)客戶程序不要向屏幕繪制時(shí),就向它發(fā)送SIG_DNTDRAW信號(hào),當(dāng)讓其繪制時(shí),則發(fā)送SIG_SETSCR。從而實(shí)現(xiàn)了各進(jìn)程間的屏幕繪制同步。