X Window 系統最早是由 MIT (Massachusetts Institute of Technology, 麻省理工學院) 在1984 年發展出來的, 當初 X 是在 Unix 的 System V 上以應用程式的概念開發出來的,而非以作業系統來開發。
直到1987 年X版本發展到 X11 ,這一版 X 取得了明顯的進步, 後來的X Window都是基于此一版本,是以後來 X 視窗也被稱為 X11 。這個版本持續在進步當中,到了 1994 年釋出了新版的 X11R6 ,後來的架構都是沿用此一釋出版本。
1992 年 XFree86計劃順利展開, 該計劃持續在維護 X11R6 的功能性,包括對新硬體的支援以及更多新增的功能等等。當初定名為 XFree86 其實是根據“X + Free software + x86”而來的。早期 Linux 所使用的 X Window 的主要核心都是由 XFree86 這個計劃所提供的,是以,我們常常将 X 系統與 XFree86劃上等号。
不過由于一些授權的問題導緻 XFree86 無法繼續提供類似 GPL 的自由軟體,後來 Xorg 基金會就接手 X11R6 的維護! Xorg利用當初 MIT 釋出的類似自由軟體的授權, 将 X11R6 拿來進行維護,并且在 2004 年釋出了 X11R6.8 版本,更在 2005 年後發表了 X11R7.x 版。 而X11R6/X11R7 的版本是自由軟體,是以很多組織都利用這個架構去設計他們的圖形介面,包括 Mac OS X v10.3 也曾利用過這個架構來設計他們的視窗。
X Window System采用C/S結構,但和我們常見的C/S不同。常見的C/S結構中,稱提供服務的一方為server,即伺服器端(如HTTP服務,FTP服務 等),使用服務的稱為client,即用戶端。但在X Window System中,client是執行程式的一方,在上面執行各種X程式,而server則是負責顯示client運作程式的視窗的一方。
X Window System的組成可以分為X server,X client,X protocol三部分。X server主要控制輸入輸出,維護字型,顔色等相關資源。它接受輸入裝置的輸入資訊并傳遞給X client,X client将這些資訊處理後所傳回的資訊,也由X server負責輸出到輸出裝置(即我們所見的顯示器)上。X server傳遞給X client的資訊稱為Event,主要是鍵盤滑鼠輸入和視窗狀态的資訊。X client傳遞給X server的資訊則稱為Request,主要是要求X server建立視窗,更改視窗大小位置或在視窗上繪圖輸出文字等。X client主要是完成應用程式計算處理的部分,并不接受使用者的輸入資訊,輸入資訊都是輸入給X server,然後由X server以Event的形式傳遞給X client(這裡感覺類似Windows的消息機制,系統接收到使用者的輸入資訊,然後以消息的形式傳遞給視窗,再由視窗的消息處理過程處理)。X client對收到的Event進行相應的處理後,如果需要輸出到螢幕上或更改畫面的外觀等,則發出Request給X server,由X server負責顯示。
常見的情況是X server與X client都在同一台電腦上運作,但他們也可分别位于網絡上不同的電腦上。在X Window System中,X client是與硬體無關的,它并不關心你使用的是什麼顯示卡什麼顯示器什麼鍵盤滑鼠,這些隻與X server相關。我們平常安裝完XFree86後運作xf86config或xf86cfg進行的配置實際上隻是與X server有關,可以說就是配置X server吧,不配置照樣可以運作X client程式。
X protocol就是X server于X client之間通信的協定了。X protocol支援現在常用的網絡通信協定。
總結下運作過程:
(1) 使用者通過滑鼠鍵盤對X server下達操作指令
(2) X server利用Event傳遞使用者操作資訊給X client
(3) X client進行程式運算
(4) X client利用Request傳回所要顯示的結果
(5) X server将結果顯示在螢幕上
=========================================================
下面通過實驗來深入了解X Window
首先通過運作級3進入系統,在tty1中執行如下操作:
[root@rhel5 ~]# tty
/dev/tty1
[root@rhel5 ~]# X & 将在ctrl+alt+F7中啟動一張空白的真實紙(DISPLAY:0.0),并自動切換到ctrl+alt+F7中
ctrl+alt+F1 切換回tty1中
[root@rhel5 ~]# export DISPLAY=:0.0
[root@rhel5 ~]# xterm & 切換到DISPLAY:0.0中可看到打開了一個xterm視窗(因為未啟動視窗管理器,是以視窗無法移動)
[root@rhel5 ~]# metacity & 切換到DISPLAY:0.0中可看到啟動了gnome的視窗管理器(現在可對xterm視窗進行移動,改變大小了)
[root@rhel5 ~]# gnome-panel & 啟動gnome的面闆(即頂端和底端類似于Windows的工作列)
[root@rhel5 ~]# gnome-session & 啟動gnome的桌面環境(包含了metacity、gnome-panel等)
ctrl+alt+F2 切換到tty2并登陸系統中準備啟動第二個X Window
[root@rhel5 ~]# tty
/dev/tty2
[root@rhel5 ~]# xinit -- :1 & 将在ctrl+alt+F8中啟動一張真實紙(DISPLAY:1.0)和一個xterm視窗,相當于X+xterm(由于DISPLAY:0.0已被占用)
[root@rhel5 ~]# twm -display :1 & 切換到DISPLAY:1.0中可看到啟動了一個twm的X Window
[root@rhel5 ~]# xclock -display :1 & 切換到DISPLAY:1.0中可看到啟動了一個xclock的應用程式
[root@rhel5 ~]# gnome-session & 啟動第二個X Window(Gnome)的桌面環境(将會看到奇特的現象,Gnome浮在桌面上)
ctrl+alt+F3 切換到tty3并登入系統中準備啟動第三個X Window
/dev/tty3
[root@rhel5 ~]# startx -- :3 将按順序在ctrl+alt+F9中啟動一個X Window桌面環境
注:若/etc/sysconfig/desketop檔案不存在或為空到時候則預設啟動Gnome桌面環境
由于真實紙所用的端口号為6000+(F7、F8、F9、F10...),我們可以通過netstat檢視系統正在監聽到端口
因為現在已經啟動了三個X Window(DISPLAY:0,DISPLAY:1和DISPLAY:3),是以将會看到系統監聽到三個端口6000,6001和6003
[root@rhel5 ~]# netstat -lntp | grep :600
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3835/X
tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 4156/X
tcp 0 0 0.0.0.0:6003 0.0.0.0:* LISTEN 4269/X
tcp 0 0 :::6000 :::* LISTEN 3835/X
tcp 0 0 :::6001 :::* LISTEN 4156/X
tcp 0 0 :::6003 :::* LISTEN 4269/X
本文轉自Vnimos51CTO部落格,原文連結:http://blog.51cto.com/vnimos/1097699,如需轉載請自行聯系原作者