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?
25
Respostas:
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.
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
ssh
executar quatro hosts remotos diferentes e executarsynaptic
(gerenciador de pacotes gráficos) em cada um deles, e todas as quatro janelas aparecem na tela do meu computador local.fonte
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ê
ssh
entra 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" ¹:
No "Manual de Referência do Protocolo X" ²:
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.
fonte
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:
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.
fonte
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.
fonte
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 umX
servidor 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.
fonte
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.
fonte