我从未真正理解为什么窗口系统必须具有服务器。为什么桌面环境,显示管理器和窗口管理器需要xorg-server?显卡顶部是否只有抽象层?为什么窗口系统采用客户端-服务器模型?通过命名管道进行进程间通信会不会更简单?
我从未真正理解为什么窗口系统必须具有服务器。为什么桌面环境,显示管理器和窗口管理器需要xorg-server?显卡顶部是否只有抽象层?为什么窗口系统采用客户端-服务器模型?通过命名管道进行进程间通信会不会更简单?
Answers:
我认为您已经注意到需要某种“服务器”。每个客户端(桌面环境,窗口管理器或窗口程序)都需要与其他所有客户端共享显示,并且他们需要能够在不了解硬件细节或不知道谁在使用显示的情况下显示内容。因此,X11服务器通过提供IPC接口来提供您提到的抽象和共享层。
X11可能可以在命名管道上运行,但是命名管道不能做两件事。
实际上,大多数X客户端使用称为UNIX域套接字的“新的和改进的”命名管道与服务器通信。它非常类似于命名管道,不同之处在于它使进程可以双向交流,并且可以跟踪谁在说什么。这些是网络必须要做的事情,因此UNIX域套接字使用与提供网络通信的TCP / IP套接字相同的编程接口。
但是从那里开始,真的很容易说:“如果我将服务器运行在与客户端不同的主机上怎么办?” 只需使用TCP套接字而不是UNIX套接字,就可以使用voila:一种比Windows RDP早几十年的远程桌面协议。我可以ssh
访问四个不同的远程主机,并synaptic
在每个远程主机上运行(图形程序包管理器),所有四个窗口都出现在本地计算机的显示屏上。
窗口系统不必具有服务器,但是您可以决定基于客户端-服务器模型来实现窗口系统。这样做有几个优点,因为您可以清楚地将客户端和服务器中的活动分开,它们无需在同一台计算机上运行,并且为多个客户端提供服务更加容易。当前这仍然非常方便(例如,当您ssh
进入另一台计算机时),但是您必须意识到,在X开发时,这被认为是必要的:您的本地计算机可能不够强大,无法运行客户端。
命名管道不会像TCP实现那样具有自动运行网络的优势。但是,例如,命名管道在DOS上不可用,DosExtender运行Desqview / X(1992),而AFAIK在VMS上也不可用。对于那些实现,特定于Unix的通信将是一个问题。
TCP不是特定于Unix的,可以在VAX / VMS(X开发于1984年开始)下运行客户端,并将输出提供给基于UNIX的本地图形工作站。从“ X Window系统:Xlib,X协议,ICCCM,XLFD的完整参考”¹:
在1986年秋天,Digital决定将其整个台式机策略用于X X的ULTRIX,VMS和MS-DOS。尽管这使我们感到满意,但也意味着我们有更多可以与之交谈的人。这导致了一些延迟,但最终也导致了更好的设计。Digital的Ralph Swick在此期间加入了Athena项目,并在第11版的开发过程中发挥了至关重要的作用。最新的版本10于1986年12月提供。
从“ X协议参考手册”²:
责任分工
在设计X协议的过程中,在服务器和客户端之间的功能划分上进行了很多考虑,因为这决定了必须通过请求,答复和事件来回传递哪些信息。Robert W. Scheifler和Jim Gettys撰写的《 X窗口系统》一文是有关在设计协议时进行某些选择的依据的极好的信息来源,该文章发表在计算机协会《图形事务》第5卷第5期中。 1986年4月2日,最终的决定基于客户端程序的可移植性,客户端编程的难易程度和性能。
首先,服务器被设计为尽可能隐藏客户端应用程序中底层硬件的差异。...
我记得TOG中的文章很有趣。毫无疑问,这引起了我对X的兴趣,(这是在WorldWideWeb之前的),直到O'Reilly开始出版他们的X系列丛书之前,我们一直难以掌握更多信息。
¹X 版本11,版本4,第2-X页,PDF可在此处在线获得
² 这是我于1990年购买的O'Reilly出版的第二版的第9页。这些以及它们都是AFAIK,也仅提供纸质版本。我认为他们没有改变责任划分的理由。
窗口系统意味着几个独立的程序共享一个公共资源,屏幕和输入设备。共享资源只能通过两种方式安全地实现:
当然,对实际显示硬件的访问是由内核控制的,但这对于窗口系统是不够的:必须有一种方法可以为进程分配显示器(窗口)的某个特定部分确保没有其他进程会干扰,并且必须对某个应用程序何时可以访问资源的哪一部分进行一定程度的保护。
现在整个事情可能已经进入内核,这就是Windows所使用的AFAIK。这具有更快的优点(通常调用内核比联系另一个进程快得多),但是它的缺点是可能会打开安全漏洞(对系统的任何利用都是内核级别的利用)时间限制了可移植性(在内核中实现的系统与内核紧密耦合;您将无法轻松地将其移植到另一个操作系统,如果您无法访问内核代码,则完全无法这样做)。
如果您不想在内核中实现它,则实现它的唯一另一种方法是作为专用进程,即服务器。请注意,通过命名管道联系的服务器仍然是服务器。同样,当在同一台机器上运行时,这些天X服务器和客户端之间的许多通信都是通过共享内存进行的;仍然不会改变显示服务器是服务器这一事实。
现在,为什么使用套接字而不是使用命名管道联系服务器?好吧,如果使用套接字进行操作,则只需要为整个服务器使用一个套接字即可完成所有通信。如果与管道通信,则每个客户端需要两个管道。除了管理所有这些管道非常麻烦之外,如果有足够多的程序尝试同时与服务器通信,您可能还会遇到一些操作系统限制,以限制开放管道的数量。
当然,套接字相对于管道的另一个优点是,通过套接字,您可以跨机器进行连接,这在许多人坐在专用终端上共享实际计算机的情况下尤其重要,因此计算机上的程序必须进行通信到不同的终端,但即使在当今的网络环境中,它仍然非常有用。
客户端-服务器模型是适用于各种应用程序的流行设计,即使只有一个服务器也只有一个客户端。它们允许在责任域之间建立干净,定义明确的接口。
尽管服务器和客户端可以通过多种方式进行通信,但是X
(不管其他人提到的优点如何),服务器的选择并不是多余的:您可以连接到X
另一台计算机上的服务器,并在台式机(或其他协作计算机)上打开窗口桌面)。这在X开发的时代曾经很普遍,当时许多大学和企业都拥有Unix服务器和许多与之对话的“ X终端”。通过使用可用于Internet的通信协议,X可以在主机内部或主机之间无缝使用。
X是第一个可以透明地显示来自另一台计算机的窗口的GUI环境,这与UNIX作为多用户环境而不是一台计算机上的单个用户的OS的历史一致。如果您是唯一与计算机进行(物理或远程)交互的人,则许多UNIX功能似乎有些过头。