Por que o sistema X Window usa um servidor?

25

Eu realmente nunca entendi por que um sistema de janelas deve ter um servidor. Por que ambientes de desktop, gerenciadores de exibição e gerenciadores de janelas precisam do xorg-server? É apenas para ter uma camada de abstração em cima da placa gráfica? Por que os sistemas de janelas empregam um modelo cliente-servidor? A comunicação entre processos não seria mais simples por meio de pipes nomeados?

Aadit M Shah
fonte
2
Os pipes nomeados não seriam mais simples porque os pipes são apenas para comunicação unidirecional. Se você deseja uma comunicação bidirecional, use soquetes em vez de tubos. E, na verdade, certos sistemas mais novos usam soquetes nomeados (domínio unix) por padrão, em vez de soquetes TCP. Por exemplo, no Ubuntu 14.04, o X está configurado para não escutar em um soquete TCP por padrão.
kasperd
5
O Unix e o X evoluíram antes dos PCs se tornarem tão poderosos e baratos, em um ambiente em que você normalmente tinha muitos terminais bastante simples conectados a um ou mais computadores poderosos. Essa divisão foi realizada com o X: você tinha "terminais" - computadores simples e baratos com placa de vídeo - executando apenas o servidor X, reunindo informações do mouse / teclado e desenhando a tela ... Os programas reais (o X- clientes), por outro lado, rodava em um ou mais computadores poderosos - compartilhados por todos os usuários que usavam os terminais. Portanto, dividir o X em duas partes (que poderiam ser separadas), fazia sentido.
Baard Kopperud
Os Terminais X do @BaardKopperud surgiram anos depois que o X Window começou a ser popular, portanto não podem ser a razão pela qual o X Window foi arquitetado dessa maneira. O X começou com estações de trabalho Unix que estavam executando mais do que o servidor X.
Jlliagre

Respostas:

39

Eu acho que você já percebeu que é necessário algum tipo de "servidor". Cada cliente (ambiente de área de trabalho, gerenciador de janelas ou programa em janelas) precisa compartilhar a exibição com todos os outros e precisa exibir as coisas sem conhecer os detalhes do hardware ou saber quem mais está usando a exibição. Portanto, o servidor X11 fornece a camada de abstração e compartilhamento que você mencionou, fornecendo uma interface IPC.

Provavelmente, o X11 pode ser executado para atropelar pipes nomeados, mas há duas grandes coisas que os pipes nomeados não podem fazer.

  • Os pipes nomeados se comunicam apenas em uma direção.
  • Se dois processos começarem a colocar dados na extremidade "de envio" de um pipe nomeado, os dados serão entremeados.

De fato, a maioria dos clientes X conversa com o servidor usando um pipe nomeado "novo e aprimorado" chamado soquete de domínio UNIX. É muito parecido com um pipe nomeado, exceto pelo fato de permitir que os processos falem nas duas direções e acompanhar quem disse o quê. Esses são os mesmos tipos de ações que a rede deve fazer e, portanto, os soquetes do domínio UNIX usam a mesma interface de programação que os soquetes TCP / IP que fornecem comunicações de rede.

Mas a partir daí, é realmente fácil dizer "E se eu executasse o servidor em um host diferente do cliente?" Basta usar um soquete TCP em vez do soquete UNIX e voila: um protocolo de área de trabalho remota que antecede o Windows RDP por décadas. Posso sshexecutar quatro hosts remotos diferentes e executar synaptic(gerenciador de pacotes gráficos) em cada um deles, e todas as quatro janelas aparecem na tela do meu computador local.

Jander
fonte
2
X usou pipe nomeado em sistemas SysV, em que os pipes nomeados eram bidirecionais, incluindo Solaris e SCO Unixes.
Alanc
14

Um sistema de janelas não precisa ter um servidor, mas você pode decidir implementar o sistema de janelas com base no modelo cliente-servidor. Fazer isso tem várias vantagens, pois você separa claramente as atividades no cliente e no servidor, elas não precisam ser executadas na mesma máquina e é mais fácil atender vários clientes. No momento, isso ainda é muito útil (por exemplo, quando você sshentra em outra máquina), mas é necessário perceber que, na época em que o X foi desenvolvido, isso era visto como uma necessidade: sua máquina local pode não ser poderosa o suficiente para executar o cliente.

Os pipes nomeados não oferecem a vantagem automática de poder executar sobre a rede, como faria uma implementação TCP. Porém, pipes nomeados não estavam disponíveis no DOS, com o DosExtender executando o Desqview / X (1992) e o AFAIK também não no VMS. Para essas implementações, uma comunicação específica do Unix seria um problema.

O TCP não é específico do Unix e é possível que um cliente seja executado no VAX / VMS (desenvolvimento do X iniciado em 1984) e servindo a saída para a estação de trabalho gráfica baseada em UNIX local. Do "Sistema X Window: a referência completa para Xlib, X Protocol, ICCCM, XLFD" ¹:

Durante o outono de 1986, a Digital decidiu basear toda a sua estratégia de estação de trabalho de desktop para ULTRIX, VMS e MS-DOS no X. Embora isso fosse gratificante para nós, também significava que tínhamos ainda mais pessoas com quem conversar. Isso resultou em algum atraso, mas, no final, também resultou em um design melhor. Ralph Swick, da Digital, ingressou no Project Athena durante esse período e desempenhou um papel vital no desenvolvimento da versão 11. A última versão 10 foi disponibilizada em dezembro de 1986.

No "Manual de Referência do Protocolo X" ²:

Divisão de responsabilidades

No processo de projetar o protocolo X, muita reflexão foi feita na divisão de capacidade entre o servidor e o cliente, pois isso determina quais informações devem ser passadas para frente e para trás através de solicitações, respostas e eventos. Uma excelente fonte de informações sobre a lógica por trás de certas escolhas feitas no design do protocolo é o artigo The X Window System, de Robert W. Scheifler e Jim Gettys, publicado na revista Transaction on Graphics da Association of Computing Machinery, vol. 2 de abril de 1986 As decisões finalmente tomadas foram baseadas na portabilidade dos programas do cliente, na facilidade de programação do cliente e no desempenho.

Primeiro, o servidor foi projetado, na medida do possível, para ocultar as diferenças no hardware subjacente dos aplicativos clientes. ...

Lembro-me do artigo no TOG sendo uma leitura interessante. Certamente desencadeou meu interesse em X e (isso foi antes da WorldWideWeb) a dificuldade que tivemos em colocar minhas mãos em mais informações até O'Reilly começar a publicar seus livros da série X.

¹ X Versão 11, versão 4, página 2-X, PDF disponível on-line aqui
² Esta é da página 9 da 2ª edição, publicada por O'Reilly, que comprei em 1990. Existem edições mais recentes, mas nunca me preocupei em comprar estes e eles são AFAIK disponíveis apenas em papel também. Eu não acho que eles mudaram a lógica da divisão de responsabilidades.

Anthon
fonte
2
Também usamos terminais X dedicados sem disco, resfriados passivamente e imediatamente substituíveis, os quais são ótimos se você precisar de 100 assentos.
Simon Richter
7

Um sistema de janelas significa que vários programas independentes compartilham um recurso comum, a tela e os dispositivos de entrada. Os recursos compartilhados só podem ser implementados com segurança de duas maneiras:

  • O recurso pode ser controlado pelo kernel, e os aplicativos fazem chamadas ao kernel para acessá-lo.
  • O recurso pode ser controlado por um processo dedicado (servidor), e os aplicativos entram em contato com o servidor para acessá-lo.

Obviamente, o acesso ao hardware real da tela é controlado pelo kernel, mas isso não é suficiente para um sistema de janelas: deve haver uma maneira de um processo receber uma determinada parte da tela (a janela) onde ela pode ser razoavelmente razoável Certifique-se de que nenhum outro processo irá interferir e deve haver um certo nível de proteção de qual aplicativo pode acessar qual parte do recurso e no momento.

Agora a coisa toda poderia ter entrado no kernel, que é o AFAIK que o Windows faz. Isso tem a vantagem de ser mais rápido (geralmente chamar o kernel é muito mais rápido do que entrar em contato com outro processo), no entanto, tem a desvantagem de possivelmente abrir brechas de segurança (qualquer exploração do sistema é uma exploração no nível do kernel) e ao mesmo tempo o tempo restringe a portabilidade (um sistema implementado no kernel está fortemente acoplado ao kernel; você não poderá portá-lo facilmente para outro sistema operacional e não poderá fazê-lo se não tiver acesso ao código do kernel).

Se você não deseja implementá-lo no kernel, a única outra maneira de implementá-lo é como um processo dedicado, ou seja, um servidor. Observe que um servidor que é contatado por meio de pipes nomeados ainda é um servidor. Além disso, ao executar na mesma máquina, muitas comunicações entre o servidor X e os clientes acontecem através da memória compartilhada atualmente; isso ainda não altera o fato de o servidor de exibição ser um servidor.

Agora, por que o servidor é contatado usando soquetes e não usando pipes nomeados? Bem, se você fizer isso usando soquetes, precisará apenas de um soquete para todo o servidor, o que pode fazer toda a comunicação. Se você se comunicar com canais, precisará de dois canais por cliente. Além do fato de que gerenciar todos esses canais seria bastante complicado, você também pode atingir alguns limites do sistema operacional no número de canais abertos se muitos programas tentarem conversar com o servidor ao mesmo tempo.

E, é claro, outra vantagem dos soquetes sobre os tubos é que, com soquetes, você pode ter conexões entre máquinas, o que foi especialmente importante no momento em que o computador real foi compartilhado por muitas pessoas sentadas em terminais dedicados; portanto, os programas no computador tiveram que se comunicar aos diferentes terminais, mas ainda é muito útil ainda hoje em ambientes de rede.

celtschk
fonte
Sua suposição do MS Windows é parcialmente verdadeira - parte da estrutura necessária para o sistema de janelas é uma espécie de kernel - mas é complicada. O que pode surpreendê-lo no Windows é que muito do que associamos a ele é realmente específico a um único subsistema em modo de usuário - o subsistema Win32 - algo como uma VM. O próprio kernel - e seus módulos executivos constituintes - ficam à parte disso. É essa separação que permitiu que um subsistema POSIX separado funcionasse no topo do kernel do NT. Confira
mikeserv
11
Embora eu realmente não soubesse desse design específico, olhando a imagem no artigo vinculado, vejo uma caixa no espaço do kernel que contém o termo "gerenciador de janelas". Como as decorações reais das janelas são desenhadas pelos programas individuais (portanto, não há nada como o gerenciador de janelas X11), só posso concluir que este é o componente que faz basicamente a mesma coisa que o servidor de exibição X11. As partes do Win32 provavelmente são uma combinação das funcionalidades dos gerenciadores de janelas do X11 (que não fazem parte do servidor X11!) E dos kits de ferramentas do X11 (no contexto do cliente também no X).
Celtschk # 7/14
Sim - é isso que eu quis dizer com classificar / alguns deles - essa é a camada de serviço executivo - é como uma mistura de serviços que são executados no modo kernel, mas são módulos separados por si só. Eu acho que é o kernel - da mesma forma que os drivers do kernel linux não precisam ser compilados, mas podem ser carregados / descarregados modularmente. É mais estranho com o Windows, porque está tudo em segredo. Enfim, sempre achei interessante - mas não sou especialista . Sua resposta me lembrou disso.
mikeserv
2

O X foi originalmente desenvolvido e mantido pelo MIT E foi com uma licença MIT de código aberto, não que isso realmente importe.

Embora não seja convencional, considere por um momento; como você explicaria uma opção de usar um paradigma cliente-servidor em um software? E, talvez eu deva dizer a um CEO ..

Aqui está como eu aprendi a apreciar a escolha na faculdade. No cliente-servidor, o servidor gerencia os recursos e , especialmente , quaisquer recursos que devem ser compartilhados . Portanto, o servidor X é o processo que fornece aos aplicativos clientes , teclado, mouse e buffer de quadros (ou, no entanto, você escreve na tela do seu sistema).

Embora não esteja realmente correto, o gerenciador de janelas é frequentemente explicado da seguinte maneira: é simplesmente essa coisa que coloca alças e outras decorações no quadro de um aplicativo, janelas, diálogos etc.

Dan LaBell
fonte
0

Os modelos cliente-servidor são um design popular para todos os tipos de aplicativos, mesmo quando há apenas um servidor e apenas um cliente. Eles permitem uma interface limpa e bem definida entre os domínios de responsabilidade.

Embora existam muitas maneiras pelas quais um servidor e um cliente possam se comunicar, a escolha feita X(independentemente das vantagens mencionadas por outros) não é supérflua: você pode conectar-se a um Xservidor em uma máquina diferente e abrir janelas na área de trabalho (ou em outra cooperação). Área de Trabalho). Isso costumava ser muito comum nos dias em que o X era desenvolvido, quando muitas universidades e empresas tinham um servidor Unix e muitos "terminais X" que conversavam com ele. Ao usar um protocolo de comunicação pronto para a Internet, o X pode ser perfeitamente usado dentro ou entre hosts.

X foi o primeiro ambiente da GUI que pôde exibir janelas de outra máquina de forma transparente, consistente com o histórico do UNIX como um ambiente multiusuário, em vez de um sistema operacional para um único usuário em um único computador. Muitos recursos do UNIX parecem um exagero se você for a única pessoa que consegue interagir (física ou remotamente) com o seu computador.

alexis
fonte
-1

Acredito que o x-server foi projetado como uma arquitetura cliente-servidor, porque inicialmente os recursos de computação eram escassos e os mainframes fizeram a maior parte do trabalho pesado. Os terminais X eram apenas thin clients que se conectavam aos servidores x e exibiam o que precisava ser exibido ao usuário.

Ele tem muitos benefícios (embora o protocolo de comunicação para o X seja muito pesado hoje em dia), principalmente você pode exibir a mesma exibição em vários clientes, é fácil compartilhar uma tela com vários usuários no X.

Karney Li
fonte
Os Terminais X surgiram muitos anos depois que o X Window começou a ser popular, portanto não podem ser a razão pela qual o X Window foi arquitetado dessa maneira. Outro ponto: os terminais X não se conectaram aos servidores X, eles estavam executando servidores X.
Jlliagre