|
|
1.1 root 1: .SH
2: Alternatives to User Process Window Systems
3: .PP
4: As currently implemented on most machines, the
5: .UX
6: kernel
7: does not
8: permit preemption once a user process has started executing a system call
9: unless the system call explicitly blocks.
10: Any asynchrony occurs at device driver interrupt level.
11: .UX
12: presumes either that system calls are very fast
13: or quickly block waiting for I/O completion.
14: .PP
15: This has strong implications for kernel window system implementations.
16: While window system requests do not take very long
17: (if they did, the presumptions made in X would be unacceptable),
18: they may take very long relative to normal system calls.
19: If a system call is compute bound for a ``long period'', interactive
20: response of other processes suffers badly, as the offending process
21: will tend to monopolize the CPU.
22: One might argue that this is not offensive on a single user machine
23: but it is a disaster on a multiuser machine.
24: If graphics code and data is in the kernel for sharing,
25: it permanently uses that much of
26: kernel memory, incurs system call overhead for access,
27: and cannot be paged out when not in use.
28: .PP
29: Similarly, in X as well as most other window systems,
30: if a window system request takes too long,
31: other clients will not get their fair share of the display.
32: This is currently somewhat of a problem during complex fill or
33: polyline primitives on slow displays.
34: The concept of interrupting a graphics primitive is so difficult that
35: we have chosen to ignore the problem, which is seldom noticeable.
36: If such graphics primitives occur in system calls, they have a much
37: greater impact on process scheduling.
38: .PP
39: An alternative to a strictly kernel window system implementation
40: splits responsibility between the kernel and user processes.
41: Synchronization, window creation and manipulation primitives are put in
42: the kernel, and clients are relied on to be well behaved for clipping.
43: Output to the window is then performed in each user process.
44: This has several disadvantages (presuming no shared libraries, not
45: available on most current
46: .UX
47: implementations).
48: Each client of the window system must must then have
49: a full copy of graphics code.
50: This can be quite large on
51: some hardware, replicated in each client of the window system.
52: For example, the current bit blit, graphics and clipping code for QVSS
53: is approximately
54: 90kbytes, or 18000 lines of C source code.
55: Fill algorithms may also require a large amount of buffer space.
56: .PP
57: Even worse (as the number of different display hardware proliferates
58: with time on a single machine architecture) is that this split
59: approach requires the inclusion in your image
60: of code for
61: hardware you do not currently have.
62: Upward compatibility to new display hardware is also impossible without
63: shared libraries,
64: but dynamic linking is really required for
65: the general solution.
66: .PP
67: With much existing hardware it is hard
68: to synchronize requests from multiple processes
69: if the hardware has not been designed to efficiently support context switching.
70: There are sometimes work arounds for these problems by ``shadowing''
71: the write only state in the hardware.
72: We have seen displays which incur additional hardware cost
73: to allow for
74: such multiprocess access.
75: One must also then face the locking of critical sections of window system
76: data structures if the window system is interruptible.
77: .PP
78: .UX
79: internal kernel structuring currently provides most services directly
80: to user processes.
81: It would be difficult to provide network access to the window system
82: if it were in the kernel due to this horizontal structure but a
83: better ability to layer one facility on another would improve this
84: situation.
85: Again, this is a failure of the kernel to be sufficiently modular to
86: anticipate the evolving environment.
87: .PP
88: X finesses all of these problems:
89: 1) X and client applications are user processes; ergo no scheduling biases.
90: 2) There is only one copy of display code required, in the server,
91: which can be paged since it is completely user code.
92: This also saves swap space, in short supply on most current workstations.
93: The resulting client code is thus small.
94: Minimal X applications are as small as 16k bytes.
95: No graphics code is in an application program.
96: 3) Client code can potentially work with new hardware without relinking, as
97: no display specific code appears in a client program image.
98: 4) Network access to the window system comes at no additional cost,
99: and no performance penalty (in practice, performance is often gained).
100: 5) X avoids system call overhead by buffering requests into a single
101: buffer and delaying writing in a fashion similar to the standard I/O library.
102: The system call overhead for output is therefore reduced by well over an
103: order of magnitude per X operation.
104: 6) User process code is easy to debug.
105: Some complications can arise due to the distributed nature of the system.
106: In practice, this has rarely been a problem.
107: 7) Applications requiring a ``compute server'' can be run from the
108: user's workstation.
109: .PP
110: Kernel lightweight processes could be used to solve
111: the non-preemptable nature
112: of system calls and would create more
113: options for window system implementations.
114: Since raster operations can be quite long lived,
115: performing these in the current structure allows one process to
116: monopolize the system to the detriment of other processes.
117: Since all context in the system call layer of the
118: kernel is associated with a user process, there is
119: currently no way to divorce such operations from a process and
120: schedule them independently.
121: .PP
122: While lightweight processes would unnecessarily complicate the X server
123: design (requiring us to lock data structures and perform synchronization),
124: they could be used prevent the most common X programming mistake.
125: Programmers new to X invariably forget to flush the output buffer when
126: testing their first program.
127: A timer driven lightweight process in clients would be useful to guarantee
128: automatic flushing of the buffers.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.