
我從來沒有真正理解為什麼視窗系統必須有伺服器。為什麼桌面環境、顯示管理器和視窗管理器需要 xorg-server?難道只是在顯示卡之上有一個抽象層嗎?為什麼視窗系統採用客戶端-伺服器模型?透過命名管道進行進程間通訊不是更簡單嗎?
答案1
我想您已經注意到需要某種“伺服器”。每個用戶端(桌面環境、視窗管理器或視窗程式)都需要與所有其他用戶端共用顯示,並且它們需要能夠在不知道硬體詳細資訊或不知道還有誰在使用該顯示的情況下顯示內容。因此,X11 伺服器透過提供 IPC 介面來提供您提到的抽象和共用層。
X11 可能可以在命名管道上運行,但有兩件大事是命名管道無法做到的。
- 命名管道僅在一個方向上進行通訊。
- 如果兩個進程開始將資料放入命名管道的「傳送」端,則資料將混合在一起。
事實上,大多數 X 用戶端使用稱為 UNIX 網域套接字的「新的和改進的」命名管道與伺服器進行通訊。它很像命名管道,只不過它允許進程雙向通信,並且追蹤誰說了什麼。這些都是網路必須做的事情,因此 UNIX 域套接字使用與提供網路通訊的 TCP/IP 套接字相同的程式設計介面。
但從這裡開始,很容易說“如果我在與客戶端不同的主機上運行伺服器怎麼辦?”只需使用 TCP 套接字而不是 UNIX 套接字,瞧:這是一種比 Windows RDP 早數十年的遠端桌面協定。我可以ssh
連接到四個不同的遠端主機並synaptic
在每個主機上運行(圖形包管理器),並且所有四個視窗都顯示在我的本機電腦的顯示器上。
答案2
視窗系統不一定要有伺服器,但您可以決定基於客戶端-伺服器模型來實現視窗系統。這樣做有幾個優點,因為您可以清楚地分離客戶端和伺服器中的活動,它們不需要在同一台電腦上運行,並且更容易為多個客戶端提供服務。目前這仍然非常方便(例如,當您ssh
進入另一台電腦時),但您必須意識到,在開發 X 時,這被視為必需品:您的本機電腦可能不夠強大,無法執行客戶端。
命名管道不會像 TCP 實現那樣自動為您提供能夠在網路上運行的優勢。但是命名管道在 DOS 上不可用,DosExtender 運行 Desqview/X (1992),並且 AFAIK 在 VMS 上也不可用。對於這些實現,Unix 特定的通訊將是一個問題。
TCP 不是特定於 Unix 的,並且可以讓客戶端在 VAX/VMS(X 開發於 1984 年開始)下運作並將輸出提供給基於本機 UNIX 的圖形工作站。來自「X Window 系統:Xlib、X 協定、ICCCM、XLFD 的完整參考」1:
1986 年秋天,Digital 決定將其 ULTRIX、VMS 和 MS-DOS 的整個桌面工作站策略建立在 X 上。這導致了一些延遲,但最終也帶來了更好的設計。 Digital 的 Ralph Swick 在此期間加入了 Project Athena,並在版本 11 的開發過程中發揮了至關重要的作用。最後一個版本 10 於 1986 年 12 月發布。
取自《X協議參考手冊》²:
職責分工
在設計X協定的過程中,我們對伺服器和客戶端之間的能力劃分進行了許多思考,這決定了必須透過請求、回覆和事件來回傳遞哪些訊息。關於設計協議中某些選擇背後的基本原理的一個極好的信息來源是由Robert W. Scheifler 和Jim Gettys 撰寫的文章《X Window System》,該文章發表在計算機器協會雜誌Transaction on Graphics,第5卷,第10 期。
首先,伺服器的設計盡可能地對客戶端應用程式隱藏底層硬體的差異。 …
我記得 TOG 上的那篇文章讀起來很有趣。它確實引發了我對 X 的興趣(這是在萬維網出現之前),直到 O'Reilly 開始出版他們的 X 系列書籍之前,我們很難獲得更多資訊。
¹ X 版本 11,第 4 版,第 2-X 頁,PDF 線上提供這裡
²這是我在 1990 年購買的第二版第 9 頁,由 O'Reilly 出版。我不認為他們改變了職責分工的基本原理。
答案3
視窗系統意味著多個獨立的程式共享公共資源、螢幕和輸入設備。共享資源只能透過兩種方式安全地實現:
- 資源可以由核心控制,應用程式可以呼叫核心來存取它。
- 資源可以由專用進程(伺服器)控制,並且應用程式聯繫伺服器來存取它。
當然,對實際顯示硬體的存取是由核心控制的,但這對於視窗系統來說還不夠:必須有一種方法可以為進程分配特定的部分可以合理地確定不會有其他進程幹擾的顯示(視窗),並且必須對哪些應用程式可以在何時存取資源的哪一部分提供一定程度的保護。
現在整件事情都可以進入內核,據我所知 Windows 就是這麼做的。這樣做的優點是速度更快(通常調用核心比聯繫另一個進程要快得多),但它的缺點是可能會打開安全漏洞(系統的任何漏洞都是核心級別的漏洞),同時時間限制了可移植性(在核心中實現的系統與核心強耦合;您將無法輕鬆地將其移植到另一個作業系統,如果您無法存取核心程式碼,則完全無法做到這一點)。
如果不想在核心中實現它,唯一的其他實作方式就是作為專用進程,即伺服器。請注意,透過命名管道聯繫的伺服器仍然是伺服器。此外,當在同一台機器上運行時,X 伺服器和客戶端之間的許多通訊現在都是透過共享記憶體進行的;但這仍然沒有改變顯示伺服器是伺服器的事實。
現在,為什麼使用套接字而不是使用命名管道來聯繫伺服器?好吧,如果您使用套接字來完成此操作,則只需為整個伺服器提供一個套接字即可完成所有通訊。如果您使用管道進行通信,則每個用戶端需要兩個管道。除了管理所有這些管道會非常麻煩之外,如果有足夠多的程式同時嘗試與伺服器通信,您還可能會遇到作業系統對開啟管道數量的限制。
當然,套接字相對於管道的另一個優點是,使用套接字可以跨機器建立連接,這在實際電腦由坐在專用終端上的許多人共享的時代尤其重要,因此電腦上的程式必須進行通訊到不同的終端,但即使在今天的網路環境中它仍然非常有用。
答案4
客戶端-伺服器模型是適用於各種應用程式的流行設計,即使只有一台伺服器和一個客戶端也是如此。它們允許責任域之間有一個乾淨、定義明確的介面。
雖然伺服器和客戶端可以透過多種方式進行通信,但所做的選擇X
(無論其他人提到的優點如何)並不是多餘的:能連接到X
另一台電腦上的伺服器並在桌面上(或另一個協作桌面上)開啟視窗。這在 X 開發的時代非常常見,當時許多大學和企業都有 Unix 伺服器和許多與之通訊的「X 終端」。透過使用互聯網就緒的通訊協議,X 可以在主機內部或跨主機無縫使用。
X 是第一個可以透明地顯示另一台電腦上的視窗的 GUI 環境,這與 UNIX 作為多用戶環境而不是單台電腦上的單一用戶的作業系統的歷史一致。如果您是唯一能夠與您的電腦進行互動(實體或遠端)的人,那麼許多 UNIX 功能似乎有些過大了。