System okienkowy oznacza, że kilka niezależnych programów ma wspólny zasób, ekran i urządzenia wejściowe. Zasoby udostępnione można bezpiecznie wdrożyć tylko na dwa sposoby:
- Zasób może być kontrolowany przez jądro, a aplikacje wykonują wywołania jądra, aby uzyskać do niego dostęp.
- Zasób może być kontrolowany przez dedykowany proces (serwer), a aplikacje kontaktują się z serwerem, aby uzyskać do niego dostęp.
Oczywiście, dostęp do rzeczywistego sprzętu wyświetlającego jest kontrolowany przez jądro, ale nie jest to wystarczające dla systemu okienkowego: musi istnieć sposób, aby procesowi przypisano określoną część wyświetlacza (okna), w której może być w rozsądny sposób upewnij się, że żaden inny proces nie będzie zakłócał, i musi istnieć pewien poziom ochrony, która aplikacja może uzyskać dostęp do której części zasobu w danym momencie.
Teraz wszystko mogło pójść do jądra, czyli AFAIK, co robi Windows. Ma to tę zaletę, że jest szybsze (zwykle wywoływanie jądra jest znacznie szybsze niż kontaktowanie się z innym procesem), jednak ma tę wadę, że może powodować dziury w zabezpieczeniach (każde exploit systemu jest exploitem na poziomie jądra), a jednocześnie czas ogranicza możliwości przenoszenia (system zaimplementowany w jądrze jest silnie sprzężony z jądrem; nie będziesz w stanie łatwo przenieść go do innego systemu operacyjnego i całkowicie nie będziesz mógł tego zrobić, jeśli nie masz dostępu do kodu jądra).
Jeśli nie chcesz zaimplementować go w jądrze, jedynym innym sposobem na jego zaimplementowanie jest proces dedykowany, czyli serwer. Pamiętaj, że serwer, z którym nawiązano kontakt za pośrednictwem nazwanych potoków, nadal jest serwerem. Ponadto, podczas pracy na tym samym komputerze, duża część komunikacji między serwerem X a klientami odbywa się obecnie za pośrednictwem pamięci współdzielonej; to wciąż nie zmienia faktu, że serwer wyświetlania jest serwerem.
Dlaczego teraz kontaktuje się z serwerem za pomocą gniazd, a nie nazwanych potoków? Cóż, jeśli robisz to za pomocą gniazd, wystarczy mieć jedno gniazdo dla całego serwera, które może wykonać całą komunikację. Jeśli komunikujesz się z potokami, potrzebujesz dwóch potoków na klienta. Oprócz faktu, że zarządzanie wszystkimi tymi potokami byłoby dość kłopotliwe, możesz również przekroczyć pewne granice systemu operacyjnego dotyczące liczby otwartych potoków, jeśli wystarczająco wiele programów spróbuje rozmawiać z serwerem w tym samym czasie.
I oczywiście kolejną zaletą gniazd nad rurami jest to, że za pomocą gniazd można mieć połączenia między maszynami, co było szczególnie ważne w czasie, gdy rzeczywisty komputer był wspólny dla wielu osób siedzących na dedykowanych terminalach, więc programy na komputerze musiały się komunikować do różnych terminali, ale nadal jest bardzo przydatny nawet dzisiaj w środowiskach sieciowych.