%!PS-Adobe- PostScript translation of Interpress master %%DocumentFonts: unknown %%Creator: weiser %%Pages: 27 %%EndComments % Simple procedures (others defined as needed) /width {stringwidth pop} bind def % stack: text /vec {moveto lineto stroke} bind def % stack: x y /nsp {0 exch {32 eq {1 add} if} forall} bind def % stack: txt -> #spaces /try {dup where {exch get} {pop 0} ifelse} bind def % stack: value %%EndProlog %%page 1 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat /Times-Roman findfont 10.0375 scalefont /font0 exch def font0 setfont 315.6182 50.589 moveto (1) show 220.4398 713.8666 moveto /Times-Bold findfont 10.0375 scalefont /font1 exch def font1 setfont (Weiser, ) show font0 setfont (August 4, 1993 2:39 pm PDT) show 223.2288 695.7994 moveto font0 setfont (Chauser, August 4, 1993 2:50 pm PDT) show 72.26999 635.5745 moveto /Helvetica-Bold findfont 16.06 scalefont /font2 exch def font2 setfont (Using Threads in Interactive Systems: A Case Study ) show 72.26999 599.4394 moveto /Helvetica findfont 12.045 scalefont /font3 exch def font3 setfont (Carl Hauser, Christian Jacobi, Marvin Theimer, Brent Welch and Mark Weiser) show 72.26999 587.3943 moveto 72.26999 575.3494 moveto font3 setfont (Xerox PARC) show 72.26999 563.3043 moveto font3 setfont (3333 Coyote Hill Road) show 72.26999 551.2595 moveto font3 setfont (Palo Alto, California 94304) show 72.26999 515.1245 moveto font3 setfont (Correspondence should be addressed to:) show 72.26999 478.9894 moveto font3 setfont (Mark Weiser) show 72.26999 466.9444 moveto font3 setfont (Xerox PARC) show 72.26999 454.8995 moveto font3 setfont (3333 Coyote Hill Road) show 72.26999 442.8546 moveto font3 setfont (Palo Alto, California 94304) show 72.26999 430.8095 moveto 72.26999 418.7644 moveto font3 setfont (weiser@xerox.com) show 72.26999 86.72403 moveto grestore grestore % end page 1 showpage %%page 2 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (2) show 72.26999 713.8666 moveto font2 setfont (Using Threads in Interactive Systems: A Case Study ) show 72.26999 675.1622 moveto /colwidth 466.9821 def gsave /Helvetica-Bold findfont 10.0375 scalefont /font4 exch def /Helvetica findfont 10.0375 scalefont /font5 exch def /execget {arindex get dup null eq {pop} {exec} ifelse} bind def /mixedjustify { /excess colwidth totwidth sub def 0 1 npiece { /arindex exch def opsbef execget % exec any accumu before ops nspaces arindex get % stack: nspaces dup 0 eq { % stack: nspaces pop texts arindex get % stack: text show % stack: NULL }{ weights arindex get % stack: nspaces weight totwt div excess mul % stack: nspaces share-excess exch div 0 32 % stack: spaceadd 0 32 texts arindex get % stack: spaceadd 0 32 text widthshow % stack: NULL } ifelse opsaft execget % exec any accumulated after ops } for /totwidth 0 def /totwt 0.0 def } bind def /buf { % stack: text npiece /npiece exch def % stack: text dup nsp /ns exch def % stack: text dup texts npiece 3 -1 roll put % stack: text nspaces npiece ns put width % stack: width totwidth add /totwidth exch def % stack: NULL ns 0 ne { ( ) width ns mul % stack: weight dup totwt add /totwt exch def % stack: weight weights npiece 3 -1 roll put % stack: NULL } if } bind def /texts 250 array def /nspaces 250 array def /weights 250 array def /opsbef 250 array def /opsaft 250 array def /totwidth 0 def /totwt 0.0 def font4 setfont opsbef 0 {font4 setfont} put (Abstract. ) 0 buf opsaft 0 null put font5 setfont opsbef 1 {font5 setfont} put (We describe the results of examining two large research and commercial systems for the) 1 buf opsaft 1 null put mixedjustify grestore 72.26999 663.1174 moveto /colwidth 466.9818 def gsave /justify { % stack: text dup nsp /ns exch def % stack: text ns 0 eq {show} { % stack: text dup width /totwidth try add % stack: text width colwidth exch sub % stack: text excess ns div % stack: text spaceadd 0 32 4 -1 roll % stack: spaceadd 0 32 text widthshow /totwidth 0 def % stack: NULL } ifelse } bind def font5 setfont (ways that they use threads. We used two methods: reading the code and doing microsecond analysis) justify grestore 72.26999 651.0724 moveto /colwidth 466.9821 def gsave /Helvetica-Oblique findfont 10.0375 scalefont /font6 exch def font5 setfont opsbef 0 {font5 setfont} put (of interthread events. We identify ten different paradigms of thread usage: ) 0 buf opsaft 0 null put font6 setfont opsbef 1 {font6 setfont} put (defer work, general) 1 buf opsaft 1 null put mixedjustify grestore 72.26999 639.0274 moveto gsave font6 setfont (pumps, slack processes, sleepers, one-shots, deadlock avoidance, rejuvenation, serializers,) justify grestore 72.26999 626.9821 moveto gsave /Helvetica findfont 10.0375 scalefont /font7 exch def font6 setfont opsbef 0 {font6 setfont} put (encapsulated fork) 0 buf opsaft 0 null put font7 setfont opsbef 1 {font7 setfont} put ( and) 1 buf opsaft 1 null put font5 setfont opsbef 2 {font5 setfont} put ( ) 2 buf opsaft 2 null put font6 setfont opsbef 3 {font6 setfont} put (exploiting parallelism) 3 buf opsaft 3 null put font5 setfont opsbef 4 {font5 setfont} put (. While some, like ) 4 buf opsaft 4 null put font6 setfont opsbef 5 {font6 setfont} put (defer work) 5 buf opsaft 5 null put font5 setfont opsbef 6 {font5 setfont} put (, are well known, others) 6 buf opsaft 6 null put mixedjustify grestore 72.26999 614.9375 moveto /colwidth 466.9818 def gsave font5 setfont (have not been previously described. Most of the paradigms cause few problems for programmers) justify grestore 72.26999 602.8924 moveto gsave font5 setfont opsbef 0 {font5 setfont} put (and help keep the resulting system implementation understandable. The ) 0 buf opsaft 0 null put font6 setfont opsbef 1 {font6 setfont} put (slack process) 1 buf opsaft 1 null put font5 setfont opsbef 2 {font5 setfont} put ( paradigm is) 2 buf opsaft 2 null put mixedjustify grestore 72.26999 590.8474 moveto /colwidth 466.9821 def gsave font5 setfont (both particularly effective in improving system performance and particularly difficult to make work) justify grestore 72.26999 578.8026 moveto gsave font5 setfont (well. We observe that thread priorities are difficult to use and may interfere in unanticipated ways) justify grestore 72.26999 566.7576 moveto gsave font5 setfont (with other thread primitives and paradigms. Finally, we glean from the practices in this code several) justify grestore 72.26999 554.7124 moveto font5 setfont (possible future research topics in the area of thread abstractions.) show 82.3075 535.1032 moveto 72.26999 484.8676 moveto /Times-Bold findfont 12.045 scalefont /font8 exch def font8 setfont (1. Introduction ) show 82.3075 458.7222 moveto /colwidth 456.9444 def gsave font0 setfont (Threads sharing an address space are becoming more widely available in popular operating) justify grestore 82.3075 446.6769 moveto gsave font0 setfont (systems such as Solaris 2.x, OS2/2.x, Windows NT and SysVR4 [Powell91][Custer93]. Xerox) justify grestore 82.3075 434.632 moveto gsave /Times-Italic findfont 10.0375 scalefont /font9 exch def font0 setfont opsbef 0 {font0 setfont} put (PARC's ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Cedar) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( programming environment and Xerox's ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (STAR) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put (, ) 4 buf opsaft 4 null put font9 setfont opsbef 5 {font9 setfont} put (ViewPoint) 5 buf opsaft 5 null put font0 setfont opsbef 6 {font0 setfont} put (, ) 6 buf opsaft 6 null put font9 setfont opsbef 7 {font9 setfont} put (GlobalView for X) 7 buf opsaft 7 null put mixedjustify grestore 82.3075 422.587 moveto /colwidth 446.6571 def gsave font9 setfont opsbef 0 {font9 setfont} put (Windows) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put ( and ) 1 buf opsaft 1 null put font9 setfont opsbef 2 {font9 setfont} put (DocuPrint) 2 buf opsaft 2 null put font0 setfont opsbef 3 {font0 setfont} put ( products have used lightweight threads for over 10 years) 3 buf opsaft 3 null put mixedjustify grestore 82.3075 410.542 moveto /colwidth 456.9444 def gsave font0 setfont ([Smith82][Swinehart86]. This paper reports on an inspection and analysis of the code developed at) justify grestore 82.3075 398.4969 moveto gsave font0 setfont (Xerox in an attempt to detect common paradigms and common mistakes of programming with) justify grestore 82.3075 386.452 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (threads) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (. ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (Our analysis is both static, from reading many lines of ancient and modern modules, and) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 374.4068 moveto gsave font0 setfont (dynamic, using a number of tools we built for detailed thread inspection. We distinguish two) justify grestore 82.3075 362.3619 moveto gsave font0 setfont (systems that developed independently although most of our remarks apply to both. One, originally) justify grestore 82.3075 350.3168 moveto gsave font0 setfont (a research system but now underlying a number of products as well, we call Cedar. The other, a) justify grestore 82.3075 338.2718 moveto gsave font0 setfont (product system originally derived from the same base as Cedar but relatively unconnected to it for) justify grestore 82.3075 326.2268 moveto font0 setfont (over ten years, we call GVX.) show 82.3075 306.6176 moveto gsave font0 setfont (We believe that the systems we examined are the largest and longest-used thread-based) justify grestore 82.3075 294.5726 moveto gsave font0 setfont (interactive systems in everyday use in the world. They are both in use and under continual) justify grestore 82.3075 282.5276 moveto gsave font0 setfont (development. They contain approximately 2.5 million lines of code, in 10,000 modules written by) justify grestore 82.3075 270.4825 moveto gsave font0 setfont (hundreds of people, declaring more than 1000 monitors and monitored record types and over 300) justify grestore 82.3075 258.4375 moveto gsave font0 setfont (condition variables. They mostly run as very large \050working sets of 10's of megabytes\051 shared-) justify grestore 82.3075 246.3925 moveto gsave font0 setfont (memory, multi-application systems. They have been ported to a variety of processors and) justify grestore 82.3075 234.3476 moveto gsave font0 setfont (multiprocessors, including the .25 to 5 MIPS Xerox D-machines in the 1980's and 5 to 100 MIPS) justify grestore 82.3075 222.3026 moveto gsave font0 setfont (processors of the early 1990's. Our examination of them reveals the kinds of thread facilities and) justify grestore 82.3075 210.2576 moveto gsave font0 setfont (practices that the programmers of these systems found useful and also the kinds of thread) justify grestore 82.3075 198.2126 moveto font0 setfont (programming mistakes that even this experienced community still makes.) show 82.3075 178.6033 moveto gsave font0 setfont (Our analysis is subject to two unavoidable biases. First, the programmers of these systems may not) justify grestore 82.3075 166.5584 moveto gsave font0 setfont (be representative -- for instance, one community consisted primarily of PhD researchers. Second,) justify grestore 82.3075 154.5133 moveto gsave font0 setfont (any group of people develop habits of work--idioms--that may be unrelated to best practice, but) justify grestore 82.3075 142.4684 moveto gsave font0 setfont (are simply \042how we do it here\042. Although our report draws on code written by two relatively) justify grestore 82.3075 130.4233 moveto font0 setfont (independent communities, comparing and contrasting the two is beyond the scope of this paper.) show 82.3075 110.8141 moveto gsave font0 setfont (We examined the systems running on the Portable Common Runtime on top of Unix [Weiser89].) justify grestore 82.3075 98.76911 moveto gsave font0 setfont (PCR provides the usual primitives: threads sharing a single address space, monitor locks, condition) justify grestore 82.3075 86.72413 moveto font0 setfont (variables, fork and join. Section 2 describes the primitives in more detail. ) show grestore grestore % end page 2 showpage %%page 3 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (3) show 82.3075 713.8666 moveto gsave font0 setfont (Although these systems do run on multiprocessors, this paper emphasizes the role of threads in) justify grestore 82.3075 701.8220 moveto font0 setfont (program structuring rather than how they are used to exploit multiprocessors [Owicki89].) show 82.3075 681.293 moveto gsave font0 setfont (This paper is not, for the most part, a statistical analysis of thread behavior. Instead of using the) justify grestore 82.3075 669.248 moveto gsave font0 setfont (aggregate view provided by statistics we choose the microscopic view of individual paradigms and) justify grestore 82.3075 657.2031 moveto gsave font0 setfont (critical path performance. For example, the time between when a key is pressed and the) justify grestore 82.3075 645.1582 moveto gsave font0 setfont (corresponding glyph is echoed to a window is very important to the usability of these systems.) justify grestore 82.3075 633.1132 moveto gsave font0 setfont (Developing an understanding of how threads are interacting in accomplishing this task helps to) justify grestore 82.3075 621.0682 moveto font0 setfont (understand the observed performance.) show 82.3075 600.5393 moveto gsave font0 setfont (Information for this paper came from two sources. While the system is running we gather) justify grestore 82.3075 588.4942 moveto gsave font0 setfont (microsecond-resolution information about events in the threads and the Unix kernel. Section 3) justify grestore 82.3075 576.4492 moveto gsave font0 setfont (provides summaries of the data and a micro-behavior example. Section 7 describes the tools we) justify grestore 82.3075 564.4042 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (used to gather and present the data. To develop the database of static uses of threads we used ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (grep) 1 buf opsaft 1 null put mixedjustify grestore 82.3075 552.3594 moveto gsave /Times-Roman findfont 8.029999 scalefont /font10 exch def font0 setfont opsbef 0 {font0 setfont} put (to locate all uses of thread primitives) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put ( ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (and then read the surrounding code. This reading led us to) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 540.3142 moveto gsave font0 setfont (further searching for uses of modules that provide specialized access to threads \050for example, the) justify grestore 82.3075 528.2694 moveto gsave font0 setfont (Cedar package PeriodicalFork\051. This reading and understanding eventually led to the) justify grestore 82.3075 516.2246 moveto font0 setfont (classifications of thread paradigms described in Section 4.) show 82.3075 495.6957 moveto gsave font0 setfont (Sections 5 and 6 present some engineering lessons -- both for implementors using threads and for) justify grestore 82.3075 483.6506 moveto gsave font0 setfont (implementors of thread systems -- from this study. We conclude with some suggestions for future) justify grestore 82.3075 471.6056 moveto font0 setfont (work and a request for more detailed descriptions of large systems.) show 72.26999 420.1437 moveto font8 setfont (2. Thread model) show 82.3075 392.772 moveto gsave font0 setfont (Lampson and Redell describe the Mesa language's thread model and provide rationale for many of) justify grestore 82.3075 380.7269 moveto font0 setfont (the design choices [Lampson80]. Here, we summarize the salient features as used in our systems.) show 82.3075 360.198 moveto gsave font0 setfont (The Mesa thread model supports multiple, light-weight, pre-emptively scheduled threads that) justify grestore 82.3075 348.1531 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (share an address space. The ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( operation creates a new thread to carry out the ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (FORK) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ('s) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 336.1081 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (procedure-invocation argument. ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( returns a thread value. The ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (JOIN) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( operation on a thread) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 324.063 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (value returns the value returned by the corresponding ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ('s procedure invocation. A thread may) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 312.0179 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (be ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (JOIN) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (ed at most once. If a thread will not be ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (JOIN) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put (ed it should be ) 4 buf opsaft 4 null put font10 setfont opsbef 5 {font10 setfont} put (DETACH) 5 buf opsaft 5 null put font0 setfont opsbef 6 {font0 setfont} put (ed, which tells the thread) 6 buf opsaft 6 null put mixedjustify grestore 82.3075 299.973 moveto font0 setfont (implementation that it can recover the resources of the thread when it terminates. ) show 82.3075 279.4441 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (The language provides ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (monitors) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( and ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (condition variables) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( for synchronizing thread activities. A) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 267.3991 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (monitor is a set of procedures, or ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (module) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (, that share a mutual exclusion lock, or ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (mutex) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put (. The mutex) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 255.3542 moveto gsave font0 setfont (protects any data managed by the module by ensuring that only a single thread is executing within) justify grestore 82.3075 243.3091 moveto gsave font0 setfont (the module at any instant. Other threads wanting to enter the monitor are enqueued on the mutex.) justify grestore 82.3075 231.2642 moveto gsave font0 setfont (The Mesa compiler automatically inserts locking code into monitored procedures. A variant on this) justify grestore 82.3075 219.2191 moveto gsave font0 setfont (scheme, associating locks with data structures instead of with modules, is occasionally used in order) justify grestore 82.3075 207.1741 moveto gsave font0 setfont (to obtain finer grain locking. Condition variables \050CVs\051 give more explicit control of thread) justify grestore 82.3075 195.1291 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (scheduling. Each CV represents a state of the module's data structures \050a ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (condition) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (\051 and a queue of) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 183.0842 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (threads waiting for that condition to become true. A thread uses the ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (WAIT) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( operation on a CV if it) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 171.0391 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (has to wait until the condition holds. ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (WAIT) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( operations may time out depending on the timeout) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 158.9941 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (interval associated with the CV. A thread uses ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( or ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (BROADCAST) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( to signal waiting threads that) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 146.9492 moveto gsave font0 setfont (the condition has been achieved. The compiler enforces the rule that CV operations are only) justify grestore 82.3075 134.9041 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (invoked with the monitor lock held. The ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (WAIT) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( operation atomically releases the monitor lock and) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 122.8592 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (adds its calling thread to the CV's wait queue. ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( causes a single thread that is waiting on the) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 110.8142 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (CV's wait queue to become runnable--) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (exactly one waiter wakens) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( behavior. \050Note that some thread) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 98.76912 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (packages define their analog of ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( to have ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (at least one waiter wakens) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( behavior [Birrell91].\051) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 86.72413 moveto gsave font10 setfont opsbef 0 {font10 setfont} put (BROADCAST) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put ( causes all threads that are waiting on the CV to become runnable. In either case,) 1 buf opsaft 1 null put mixedjustify grestore grestore grestore % end page 3 showpage %%page 4 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.336 746.79 moveto (4) show 82.3075 713.8666 moveto font0 setfont (threads must compete for the monitor's mutex before reentering the monitor.) show 82.3075 694.4231 moveto gsave font0 setfont (Unlike the monitors originally described by Hoare [Hoare74], the Mesa thread model does not) justify grestore 82.3075 682.3777 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (guarantee that the condition associated with a CV is satisfied when a ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (WAIT) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( completes. If) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 670.3329 moveto gsave font10 setfont opsbef 0 {font10 setfont} put (BROADCAST) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put ( is used, for example, a different thread might acquire the monitor lock first and change) 1 buf opsaft 1 null put mixedjustify grestore 82.3075 658.2881 moveto gsave font0 setfont (the state of the program. Therefore a thread is responsible for rechecking the condition after each) justify grestore 82.3075 646.2429 moveto gsave font10 setfont opsbef 0 {font10 setfont} put (WAIT) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put (. Thus, the prototypical use of ) 1 buf opsaft 1 null put font10 setfont opsbef 2 {font10 setfont} put (WAIT) 2 buf opsaft 2 null put font0 setfont opsbef 3 {font0 setfont} put ( is inside a ) 3 buf opsaft 3 null put font10 setfont opsbef 4 {font10 setfont} put (WHILE) 4 buf opsaft 4 null put font0 setfont opsbef 5 {font0 setfont} put ( loop that checks the condition, ) 5 buf opsaft 5 null put font9 setfont opsbef 6 {font9 setfont} put (not) 6 buf opsaft 6 null put font0 setfont opsbef 7 {font0 setfont} put ( inside) 7 buf opsaft 7 null put mixedjustify grestore 82.3075 634.198 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (an ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (IF) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( statement that would only check the condition once. Programs that obey the \042) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (WAIT) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( only in a) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 622.153 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (loop\042 convention are insensitve to whether ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( has ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put ( at least one waiter wakens) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( behavior or) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 610.1081 moveto gsave font9 setfont opsbef 0 {font9 setfont} put (exactly one waiter wakens ) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put (behavior as described above. Indeed, under this convention ) 1 buf opsaft 1 null put font10 setfont opsbef 2 {font10 setfont} put (BROADCAST) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 598.063 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (can be substituted for ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( without affecting program correctness, so ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (NOTIFY) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( is just a) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 586.0179 moveto font0 setfont (performance hint. ) show 82.3075 566.5741 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (Threads have ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (priorities) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( that affect the scheduler. The scheduler runs the highest priority runnable) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 554.5289 moveto gsave font0 setfont (thread and if there are several runnable threads at the highest priority then round-robin is used) justify grestore 82.3075 542.4839 moveto gsave font0 setfont (among them. If a system event causes a higher priority thread to become runnable, the scheduler) justify grestore 82.3075 530.439 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (will ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (preempt) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( the currently running thread, even if it holds monitor locks. There are 7 priorities in) 2 buf opsaft 2 null put mixedjustify grestore 82.3075 518.394 moveto gsave font0 setfont (all, with the default being the middle priority \0504\051. Typically lower priority is used for long running,) justify grestore 82.3075 506.3488 moveto gsave font0 setfont (background work, while higher priority is used for threads associated with devices or aspects of the) justify grestore 82.3075 494.3039 moveto gsave font0 setfont (user interface, keeping the system responsive for interactive work. A thread's initial priority is set) justify grestore 82.3075 482.259 moveto font0 setfont (when it is created. It can change its own priority.) show 82.3075 462.8148 moveto gsave font0 setfont (The timeslice interval and the CV timeout granularity in the current implementation are each 50) justify grestore 82.3075 450.7699 moveto gsave font0 setfont (milliseconds. The scheduler runs at least that often, but also runs each time a thread blocks on a) justify grestore 82.3075 438.725 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (mutex, waits on a CV, or calls the ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (primitive. The only purpose of the ) 2 buf opsaft 2 null put font10 setfont opsbef 3 {font10 setfont} put (YIELD) 3 buf opsaft 3 null put font0 setfont opsbef 4 {font0 setfont} put ( primitive is to) 4 buf opsaft 4 null put mixedjustify grestore 82.3075 426.6797 moveto gsave font0 setfont (cause the scheduler to run \050but see discussion later of YieldButNotToMe\051. The scheduler takes less) justify grestore 82.3075 414.635 moveto font0 setfont (than 50 microseconds to switch between threads on a Sparcstation-2.) show 72.26999 364.6194 moveto font8 setfont (3. Dynamic thread behavior) show 82.3075 338.6939 moveto gsave font0 setfont (Section 3.1 describes the large-scale behavior of our thread systems: how many threads are there,) justify grestore 82.3075 326.649 moveto gsave font0 setfont (how often are threads created and destroyed, how often are monitor locks and condition variables) justify grestore 82.3075 314.604 moveto gsave font0 setfont (used. It is intended to give the reader an intuitive feel for the physical and temporal scale of the) justify grestore 82.3075 302.5588 moveto font0 setfont (system.) show 82.3075 283.1148 moveto gsave font0 setfont (Section 3.2 provides a microscopic look at a thread misbehavior. It is intended to introduce the) justify grestore 82.3075 271.0698 moveto font0 setfont (notion of microscopic examination and to provide an example for discussion later in the paper. ) show 82.3075 245.1444 moveto font1 setfont (3.1 Macro-behavior) show 92.345 219.219 moveto /colwidth 446.907 def gsave font0 setfont (One of the original motivations for our work was a desire to understand the dynamic behavior of) justify grestore 92.345 207.1739 moveto gsave font0 setfont (user-level threads. For this purpose, we constructed an instrumented version of PCR that) justify grestore 92.345 195.129 moveto gsave font0 setfont (measured the number of threads in the system, thread lifetimes, the run length distribution of) justify grestore 92.345 183.084 moveto gsave font0 setfont (threads and the rate at which monitor locks and condition variables are used. Analysis of the) justify grestore 92.345 171.0389 moveto gsave font0 setfont (data obtained from this instrumented system led to the realization that there were a number of) justify grestore 92.345 158.9939 moveto gsave font0 setfont (consistent patterns of thread usage, which led to the static analysis on which this paper is) justify grestore 92.345 146.949 moveto gsave font0 setfont (focused. To give the reader some background and context for this static analysis, we present a) justify grestore 92.345 134.904 moveto gsave font0 setfont (summary of our dynamic data below. This data is based on a set of benchmarks intended to be) justify grestore 92.345 122.859 moveto gsave font0 setfont (typical of user activity, including compilation, formatting a document into a page description) justify grestore 92.345 110.814 moveto gsave font0 setfont (language \050like Postscript\051, previewing pages described by a page description language and user) justify grestore 92.345 98.76898 moveto gsave font0 setfont (interface tasks \050keyboarding, mousing and scrolling windows\051. All data was taken on a) justify grestore 92.345 86.724 moveto font0 setfont (Sparcstation-2 running SunOS-4.1.3.) show grestore grestore % end page 4 showpage %%page 5 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (5) show 92.345 713.8666 moveto gsave font0 setfont (Looking at the dynamic thread behavior, we observed several different classes of threads. There) justify grestore 92.345 701.8220 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (were ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (eternal) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( threads that repeatedly waited on a condition variable and then ran briefly before) 2 buf opsaft 2 null put mixedjustify grestore 92.345 689.7769 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (waiting again. There were ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (worker) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( threads that were forked to perform some activity, such as) 2 buf opsaft 2 null put mixedjustify grestore 92.345 677.7321 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (formatting a document. Finally, there were short-lived ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (transient) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( threads that were forked by) 2 buf opsaft 2 null put mixedjustify grestore 92.345 665.687 moveto font0 setfont (some long-lived thread, would run for a relatively short while and then exit.) show 92.345 644.9238 moveto gsave font0 setfont (A Cedar or GVX world uses a moderate number of threads. Consider Cedar first: an idle Cedar) justify grestore 92.345 632.8788 moveto gsave font0 setfont (system has about 35 eternal threads running in it and forks a transient thread once a second on) justify grestore 92.345 620.8338 moveto gsave font0 setfont (average. Keyboard activity can cause up to 5 thread forks per second, although most other user-) justify grestore 92.345 608.7887 moveto gsave font0 setfont (interface activity causes much smaller increases in thread forking rates. While one of our) justify grestore 92.345 596.7439 moveto gsave font0 setfont (benchmark applications \050document formatting\051 employed large numbers of transient threads) justify grestore 92.345 584.6988 moveto gsave font0 setfont (\050forking 3.6 threads/sec.\051, the other two compute-intensive applications we examined caused) justify grestore 92.345 572.6540 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (thread-forking activity to ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (decrease) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( by more than a factor of 3. In all our benchmarks, the) 2 buf opsaft 2 null put mixedjustify grestore 92.345 560.6087 moveto gsave font0 setfont (maximum number of threads concurrently existing in the system never exceeded 41, although) justify grestore 92.345 548.564 moveto gsave font0 setfont (users employ two to three times this many in everyday work. Transient threads are by far the) justify grestore 92.345 536.519 moveto gsave font0 setfont (most numerous resulting in an average lifetime for non-eternal threads that is well under 1) justify grestore 92.345 524.4739 moveto font0 setfont (second.) show 92.345 503.7106 moveto gsave font0 setfont (An idle GVX world exhibits noticeably different behavior than just described. An idle system) justify grestore 92.345 491.6656 moveto gsave font0 setfont (contains 22 eternal threads and forks no additional threads. In fact, no additional threads are) justify grestore 92.345 479.6207 moveto font0 setfont (forked for any user interface activity, be it keyboard, mouse, or windowing activity.) show 92.345 458.8574 moveto gsave font0 setfont (The Appendix contains a brief description of each eternal thread seen in the Cedar and GVX) justify grestore 92.345 446.8124 moveto font0 setfont (benchmarks.) show 203.1544 426.0492 moveto font1 setfont (Table 1: Forking and thread-switching rates) show 92.345 405.2857 moveto /Times-Bold findfont 8.029999 scalefont /font11 exch def font11 setfont 0.0 4.015 rmoveto (Cedar) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 30.77533 0.0 rmoveto 0.0 -4.015 rmoveto 0.0 4.015 rmoveto 55.75825 0.0 rmoveto 0.0 -4.015 rmoveto 0.0 4.015 rmoveto 55.75825 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (Forks/sec) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 16.49962 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (Thread Switches/sec) show 0.0 -4.015 rmoveto font0 setfont 28.09135 0.0 rmoveto 92.345 393.2408 moveto font1 setfont (Idle Cedar) show font0 setfont 57.98253 0.0 rmoveto 55.75825 0.0 rmoveto ( 0.9) show 32.89484 0.0 rmoveto ( 132) show 92.345 381.1956 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto 55.75825 0.0 rmoveto ( 5.0) show 32.89484 0.0 rmoveto ( 269) show 92.345 369.1507 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto 55.75825 0.0 rmoveto ( 1.0) show 32.89484 0.0 rmoveto ( 191) show 92.345 357.1058 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto 55.75825 0.0 rmoveto ( 0.7) show 32.89484 0.0 rmoveto ( 172) show 92.345 345.0606 moveto font1 setfont (Document formatting) show font0 setfont 57.97753 0.0 rmoveto ( 3.6) show 32.89484 0.0 rmoveto ( 171) show 92.345 333.0156 moveto font1 setfont (Document previewing) show font0 setfont 55.18812 0.0 rmoveto ( 1.6) show 32.89484 0.0 rmoveto ( 222) show 92.345 320.9706 moveto font1 setfont (Make program) show font0 setfont 36.23532 0.0 rmoveto ( ) show 53.5279 0.0 rmoveto ( 0.3) show 32.89484 0.0 rmoveto ( 170) show 92.345 308.9257 moveto font1 setfont (Compile) show font0 setfont 13.37796 0.0 rmoveto 55.75825 0.0 rmoveto 55.75825 0.0 rmoveto ( 0.3) show 32.89484 0.0 rmoveto ( 135) show 92.345 296.8806 moveto 92.345 284.8356 moveto font11 setfont 0.0 4.015 rmoveto (GVX) show 0.0 -4.015 rmoveto 92.345 272.7907 moveto font1 setfont (Idle GVX) show font0 setfont 8.917311 0.0 rmoveto 55.75825 0.0 rmoveto 55.75825 0.0 rmoveto ( 0) show 41.26008 0.0 rmoveto ( 33) show 92.345 260.7456 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto 55.75825 0.0 rmoveto ( 0) show 41.26008 0.0 rmoveto ( 60) show 92.345 248.7007 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto 55.75825 0.0 rmoveto ( 0) show 41.26008 0.0 rmoveto ( 34) show 92.345 236.6556 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto 55.75825 0.0 rmoveto ( 0) show 41.26008 0.0 rmoveto ( 43) show 92.345 215.8923 moveto gsave font0 setfont (The rate at which a Cedar system switches among running threads varies from 130/sec. for an) justify grestore 92.345 203.8474 moveto gsave font0 setfont (idle system to around 270/sec for a system experiencing heavy keyboard/mouse input activity.) justify grestore 92.345 191.8023 moveto gsave font0 setfont (Thread execution intervals \050the lengths of time between thread switches\051 exhibit a peak at about) justify grestore 92.345 179.7574 moveto gsave font0 setfont (3 milliseconds, with about 75% of all execution intervals being between 0 and 5 milliseconds in) justify grestore 92.345 167.7123 moveto gsave font0 setfont (length. This is due to the very short execution intervals of most eternal and transient threads. A) justify grestore 92.345 155.6674 moveto gsave font0 setfont (second peak is around 45 milliseconds, which is related to the PCR time-slice period, which is 50) justify grestore 92.345 143.6224 moveto gsave font0 setfont (milliseconds. Transient and eternal thread activity steals the first part of a timeslice with the) justify grestore 92.345 131.5774 moveto font0 setfont (remainder going to worker threads.) show 92.345 110.8141 moveto gsave font0 setfont (While most execution intervals are short, longer execution intervals account for most of the total) justify grestore 92.345 98.76912 moveto gsave font0 setfont (execution time in our systems. Between 20% and 50% of the total execution time during any) justify grestore 92.345 86.72413 moveto gsave font0 setfont (period is accumulated by threads running for periods of 45 to 50 milliseconds. We also examined) justify grestore grestore grestore % end page 5 showpage %%page 6 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (6) show 92.345 713.8666 moveto gsave font0 setfont (the total execution time contribution as a function of thread priority. Only two patterns were) justify grestore 92.345 701.8220 moveto gsave font0 setfont (evident: of the 7 available priority levels one wasn't used at all, and user interface activity) justify grestore 92.345 689.7769 moveto font0 setfont (tended to use higher priorities for its threads than did user-initiated tasks such as compiling.) show 92.345 671.7097 moveto gsave font0 setfont (GVX switches among threads at a decidely lower rate: an idle system switches only 33 times per) justify grestore 92.345 659.6645 moveto gsave font0 setfont (second, while heavy keyboard activity will drive the rate up to 60/sec. The same bi-modal) justify grestore 92.345 647.6196 moveto gsave font0 setfont (distribution of execution intervals is exhibited as in Cedar: between 50% and 70% of all execution) justify grestore 92.345 635.5745 moveto gsave font0 setfont (intervals are between 0 and 5 milliseconds in length with a second peak around 45 milliseconds.) justify grestore 92.345 623.5294 moveto gsave font0 setfont (Between 30% and 80% of the total execution time during any period is accumulated by threads) justify grestore 92.345 611.4845 moveto font0 setfont (running for periods of 45 to 50 milliseconds. ) show 92.345 593.417 moveto gsave font0 setfont (GVX's use of thread priorities was noticeably different than Cedar's. While Cedar's core of long-) justify grestore 92.345 581.372 moveto gsave font0 setfont (lived threads are relatively evenly distributed over the four \042standard\042 priority values of 1 to 4,) justify grestore 92.345 569.327 moveto gsave font0 setfont (GVX sets almost all of its threads to priority level 3; using the lower two priority levels only for a) justify grestore 92.345 557.282 moveto gsave font0 setfont (few background helper tasks. Two of the five low-priority threads in fact never actually ran) justify grestore 92.345 545.2371 moveto gsave font0 setfont (during our experiments. As with Cedar, one of the 7 priority levels is never used. However, while) justify grestore 92.345 533.1924 moveto gsave font0 setfont (Cedar uses level 7 for interrupt handling and doesn't use level 5, GVX does the opposite. In both) justify grestore 92.345 521.147 moveto gsave font0 setfont (systems, priority level 6 gets used by the system daemon that does proportional scheduling.) justify grestore 92.345 509.102 moveto font0 setfont (Cedar also uses level 6 for its garbage collection daemon.) show 92.345 491.0347 moveto gsave font0 setfont (One interesting behavior that our Cedar thread data exhibited was a variety of different forking) justify grestore 92.345 478.9896 moveto gsave font0 setfont (patterns. An idle Cedar system forks a transient thread about once every 2 seconds. Each forked) justify grestore 92.345 466.9444 moveto gsave font0 setfont (thread, in turn, forks another transient thread. Keyboard activity causes a transient thread to be) justify grestore 92.345 454.8996 moveto gsave font0 setfont (forked by the command-shell thread for every keystroke. On the other hand, simply moving the) justify grestore 92.345 442.8546 moveto gsave font0 setfont (mouse around causes no threads to be forked. Even clicking a mouse button \050e.g. to scroll a) justify grestore 92.345 430.8095 moveto gsave font0 setfont (window\051 causes no additional forking activity. \050However, both keyboard activity and mouse) justify grestore 92.345 418.7645 moveto gsave font0 setfont (motion cause significant increases in activity by eternal threads.\051 Scrolling a text window 10) justify grestore 92.345 406.7195 moveto gsave font0 setfont (times causes 3 transient threads to be forked, one of which is the child of one of the other) justify grestore 92.345 394.6744 moveto font0 setfont (transients.) show 92.345 376.6072 moveto gsave font0 setfont (Document formatting causes a great number of transient threads to be forked by the main) justify grestore 92.345 364.562 moveto gsave font0 setfont (formatting worker thread, whereas compilation and document previewing cause a moderate) justify grestore 92.345 352.517 moveto gsave font0 setfont (number of transient forks. While the compiler's and previewer's transient threads simply run to) justify grestore 92.345 340.4719 moveto gsave font0 setfont (completion, each of the document formatter's transient threads fork one or more additional) justify grestore 92.345 328.427 moveto gsave font0 setfont (transient threads themselves. However, third generation forked threads do not occur. In fact,) justify grestore 92.345 316.3818 moveto gsave font0 setfont (none of our benchmarks exhibited forking generations greater than 2. That is, every transient) justify grestore 92.345 304.337 moveto font0 setfont (thread was either the child or grandchild of some worker or long-lived thread.) show 92.345 286.2695 moveto gsave font0 setfont (Checking whether a program needs recompiling \050the Make program\051 does not cause any threads) justify grestore 92.345 274.2245 moveto gsave font0 setfont (to be forked \050the command-shell thread gets used as the main worker thread\051, except for garbage) justify grestore 92.345 262.1795 moveto gsave font0 setfont (collection and finalization of collected data objects. Each of these activities causes a moderate) justify grestore 92.345 250.1344 moveto font0 setfont (number of first-generation transient threads to be forked.) show 82.3075 86.72418 moveto grestore grestore % end page 6 showpage %%page 7 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (7) show 210.6834 713.8666 moveto font1 setfont (Table 2: Wait-CV and monitor entry rates) show 92.345 693.6582 moveto font11 setfont 0.0 4.015 rmoveto (Cedar) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 30.77533 0.0 rmoveto 0.0 -4.015 rmoveto 0.0 4.015 rmoveto 55.75825 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (Wait-CVs/sec) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 55.30574 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (% of CV that timeout ML-enters/sec) show 0.0 -4.015 rmoveto font0 setfont 10.69002 0.0 rmoveto 92.345 681.6129 moveto font1 setfont (Idle Cedar) show font0 setfont 57.98253 0.0 rmoveto ( 121) show 21.18509 0.0 rmoveto 55.75825 0.0 rmoveto 55.75825 0.0 rmoveto (82%) show 36.24035 0.0 rmoveto ( 414) show 92.345 669.5681 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto ( 185) show 21.18509 0.0 rmoveto 55.75825 0.0 rmoveto 55.75825 0.0 rmoveto (48%) show 36.24035 0.0 rmoveto (2557) show 92.345 657.523 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto ( 163) show 21.18509 0.0 rmoveto ( ) show 53.5279 0.0 rmoveto 55.75825 0.0 rmoveto (58%) show 36.24035 0.0 rmoveto (1025) show 92.345 645.4783 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto ( 115) show 21.18509 0.0 rmoveto ( ) show 53.5279 0.0 rmoveto 55.75825 0.0 rmoveto (69%) show 36.24035 0.0 rmoveto (2032) show 92.345 633.4334 moveto font1 setfont (Document formatting) show font0 setfont ( 130) show 21.17404 0.0 rmoveto ( ) show 53.5279 0.0 rmoveto 55.75825 0.0 rmoveto (72%) show 36.24035 0.0 rmoveto (2739) show 92.345 621.3882 moveto font1 setfont (Document previewing) show font0 setfont ( 157) show 20.61497 0.0 rmoveto ( ) show 51.29756 0.0 rmoveto 55.75825 0.0 rmoveto (56%) show 36.24035 0.0 rmoveto (1335) show 92.345 609.3432 moveto font1 setfont (Make program) show font0 setfont 36.23532 0.0 rmoveto ( 158) show 21.18509 0.0 rmoveto ( ) show 49.06722 0.0 rmoveto 55.75825 0.0 rmoveto (61%) show 36.24035 0.0 rmoveto (2218) show 92.345 597.2982 moveto font1 setfont (Compile) show font0 setfont 13.37796 0.0 rmoveto 55.75825 0.0 rmoveto ( 119) show 21.18509 0.0 rmoveto ( ) show 49.06722 0.0 rmoveto 55.75825 0.0 rmoveto (82%) show 36.24035 0.0 rmoveto (1365) show 92.345 585.2534 moveto 92.345 573.2083 moveto font11 setfont 0.0 4.015 rmoveto (GVX) show 0.0 -4.015 rmoveto 92.345 561.1633 moveto font1 setfont (Idle GVX) show font0 setfont 8.917311 0.0 rmoveto 55.75825 0.0 rmoveto ( 32) show 24.53158 0.0 rmoveto ( ) show 49.06722 0.0 rmoveto 55.75825 0.0 rmoveto (99%) show 36.24035 0.0 rmoveto ( 366) show 92.345 549.1184 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto ( 38) show 24.53158 0.0 rmoveto ( ) show 46.83691 0.0 rmoveto 55.75825 0.0 rmoveto (42%) show 36.24035 0.0 rmoveto (1436) show 92.345 537.0732 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto ( 33) show 24.53158 0.0 rmoveto ( ) show 46.83691 0.0 rmoveto 55.75825 0.0 rmoveto (96%) show 36.24035 0.0 rmoveto ( 410) show 92.345 525.0285 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto ( 25) show 24.53158 0.0 rmoveto ( ) show 46.83691 0.0 rmoveto 55.75825 0.0 rmoveto (61%) show 36.24035 0.0 rmoveto ( 691) show 92.345 504.8196 moveto gsave font0 setfont (The rate at which locking and condition variable primitives are used is another measure of) justify grestore 92.345 492.7747 moveto gsave font0 setfont (thread activity. Table 2 shows the rates for each benchmark. The rate of waiting on CVs in Cedar) justify grestore 92.345 480.7297 moveto gsave font0 setfont (ranged from 115/second to 185/second, with 50% to 80% of these waits timing out rather than) justify grestore 92.345 468.6845 moveto gsave font0 setfont (receiving a wakeup notification. Monitors are entered much more frequently, reflecting their use) justify grestore 92.345 456.6396 moveto gsave font0 setfont (to protect data structures \050especially in reusable library packages\051. Entry rates varied from) justify grestore 92.345 444.5946 moveto gsave font0 setfont (400/second for an idle system to 2500/sec for a system experiencing heavy keyboard activity to) justify grestore 92.345 432.5494 moveto gsave font0 setfont (2700/second for document formatting. Contention was low, however, occuring on 0.01% to 0.1% of) justify grestore 92.345 420.5045 moveto font0 setfont (all entries to monitors.) show 92.345 400.2957 moveto gsave font0 setfont (For GVX, the rate of waiting on CVs ranged from 32/second to 38/second, with 42% to 99% of) justify grestore 92.345 388.2507 moveto gsave font0 setfont (these waits timing out rather than receiving a wakeup notification. Monitors are entered at rates) justify grestore 92.345 376.2056 moveto gsave font0 setfont (between 366/sec and 1436/sec. Interestingly, contention for monitor locks was sometimes) justify grestore 92.345 364.1607 moveto gsave font0 setfont (significantly higher in GVX than in Cedar, occuring 0.4% of the time when scrolling a window) justify grestore 92.345 352.1156 moveto font0 setfont (and 0.2% of the time when heavy keyboard traffic was present.) show 172.7634 331.9068 moveto font1 setfont (Table 3: Number of different CVs and monitor locks used) show 92.345 311.6981 moveto font11 setfont 0.0 4.015 rmoveto (Cedar) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 30.77533 0.0 rmoveto 0.0 -4.015 rmoveto 0.0 4.015 rmoveto 55.75825 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (# CVs) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto 30.77612 0.0 rmoveto 0.0 -4.015 rmoveto font11 setfont 0.0 4.015 rmoveto (# MLs) show 0.0 -4.015 rmoveto font0 setfont 29.884 0.0 rmoveto 92.345 299.6531 moveto font1 setfont (Idle Cedar) show font0 setfont 57.98253 0.0 rmoveto ( 22) show 40.14391 0.0 rmoveto ( 554) show 92.345 287.6081 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto ( 32) show 40.14391 0.0 rmoveto ( 918) show 92.345 275.563 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto ( 26) show 40.14391 0.0 rmoveto ( 734) show 92.345 263.518 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto ( 30) show 40.14391 0.0 rmoveto ( 797) show 92.345 251.473 moveto font1 setfont (Document formatting) show font0 setfont ( 46) show 40.13287 0.0 rmoveto (1060) show 92.345 239.428 moveto font1 setfont (Document previewing) show font0 setfont ( 32) show 39.5738 0.0 rmoveto ( 938) show 92.345 227.383 moveto font1 setfont (Make program) show font0 setfont 36.23532 0.0 rmoveto ( 24) show 40.14391 0.0 rmoveto (1296) show 92.345 215.338 moveto font1 setfont (Compile) show font0 setfont 13.37796 0.0 rmoveto 55.75825 0.0 rmoveto ( 36) show 40.14391 0.0 rmoveto (2900) show 92.345 203.2929 moveto 92.345 191.2479 moveto font11 setfont 0.0 4.015 rmoveto (GVX) show 0.0 -4.015 rmoveto 92.345 179.203 moveto font1 setfont (Idle GVX) show font0 setfont 8.917311 0.0 rmoveto 55.75825 0.0 rmoveto ( 5) show 43.49040 0.0 rmoveto ( 48) show 92.345 167.158 moveto font1 setfont (Keyboard input) show font0 setfont 31.2156 0.0 rmoveto ( 7) show 43.49040 0.0 rmoveto ( 204) show 92.345 155.113 moveto font1 setfont (Mouse movement) show font0 setfont 22.85133 0.0 rmoveto ( 5) show 43.49040 0.0 rmoveto ( 52) show 92.345 143.068 moveto font1 setfont (Window scrolling) show font0 setfont 22.85238 0.0 rmoveto ( 6) show 43.49040 0.0 rmoveto ( 209) show 92.345 122.8592 moveto gsave font0 setfont (Typically, most of the monitor/condition variable traffic is observed in about 10 to 15 different) justify grestore 92.345 110.8142 moveto gsave font0 setfont (threads, with the worker thread of a benchmark activity dominating the numbers. The other) justify grestore 92.345 98.76922 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (active threads exhibit approximately equal traffic. The number of ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (different) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( monitors entered) 2 buf opsaft 2 null put mixedjustify grestore 92.345 86.7242 moveto gsave font0 setfont (during the benchmarks varies from 500 to 3000 as shown in Table 3. In contrast, only about 20 to) justify grestore grestore grestore % end page 7 showpage %%page 8 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (8) show 92.345 713.8666 moveto gsave font0 setfont (50 different condition variables are waited for in the course of the benchmarks. GVX uses fewer) justify grestore 92.345 701.8220 moveto font0 setfont (monitors and CVs. ) show 82.3075 667.293 moveto font1 setfont (3.2 Micro-behavior) show 92.345 632.7639 moveto gsave font0 setfont (The dynamic information described in the previous section is not fully satisfying, because it fails) justify grestore 92.345 620.7188 moveto gsave font0 setfont (to show details of individual threads, and is not sufficient to understand the behaviors we) justify grestore 92.345 608.6739 moveto gsave font0 setfont (experienced in our large systems. For instance, our systems had subtle problems: sometimes less) justify grestore 92.345 596.629 moveto gsave font0 setfont (performance than we expected, sometimes large amounts of idle time in what should have been a) justify grestore 92.345 584.584 moveto gsave font0 setfont (compute-bound process, sometimes rare lockups of the system. For years none of these were) justify grestore 92.345 572.539 moveto gsave font0 setfont (frequent or annoying enough to warrant urgent attention. But eventually we felt we needed to) justify grestore 92.345 560.494 moveto gsave font0 setfont (understand them. The problems were not easily amenable to discovery via conventional) justify grestore 92.345 548.449 moveto gsave font0 setfont (debugging or profiling methods \050which we tried\051 or dynamic statistics. We needed new tools that) justify grestore 92.345 536.4042 moveto font0 setfont (could show us detailed scheduling and process interaction.) show 92.345 510.5075 moveto gsave font0 setfont (When we built these tools, we found a fascinating world of microscopic thread behavior had) justify grestore 92.345 498.4625 moveto gsave font0 setfont (opened up to us. We think that micro-visualization tools for understanding operating systems) justify grestore 92.345 486.4174 moveto gsave font0 setfont (are underutilized and could be a source of considerable insight. In this section we illustrate some) justify grestore 92.345 474.3724 moveto gsave font0 setfont (of this world through one of the examples that led us to look for the thread paradigms described) justify grestore 92.345 462.3272 moveto font0 setfont (later in this paper.) show 92.345 436.4305 moveto gsave font0 setfont (Good X window system performance when painting large regions with many requests requires) justify grestore 92.345 424.3857 moveto gsave font0 setfont (batching and merging overlapping requests. Good interactive performance, such as keystroke) justify grestore 92.345 412.3404 moveto gsave font0 setfont (echoing, requires that paint requests be sent to the server with very little delay. In the fall of) justify grestore 92.345 400.2954 moveto gsave font0 setfont (1992 Cedar was painting large regions too slowly and we did not know why. We saw more) justify grestore 92.345 388.2506 moveto gsave font0 setfont (frequent X communication than we expected, even though we had a batching mechanism in) justify grestore 92.345 376.2055 moveto font0 setfont (place. What was going wrong? The answer is easy to see and explain with the proper tools.) show 92.345 341.6765 moveto font9 setfont (3.2.1 Example of micro-behavior visualization) show 102.3825 307.1476 moveto /colwidth 436.8696 def gsave font0 setfont (Figure 1 shows 100 milliseconds of micro-behavior. It focuses on two Unix processes, one of) justify grestore 102.3825 295.1026 moveto gsave font0 setfont (which is running two independent threads inside itself. The first Unix process is the X server.) justify grestore 102.3825 283.0576 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (The other one is a Cedar ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Virtual Processor) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( \050VP\051, which runs the Portable Common Runtime) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 271.0127 moveto gsave font0 setfont (\050PCR\051, and so can be assigned to run any number of threads. For our example, we focus on two) justify grestore 102.3825 258.9675 moveto gsave font0 setfont (of those threads: a worker thread producing an image and an I/O thread that is buffering the) justify grestore 102.3825 246.9225 moveto gsave font0 setfont (image commands to the X server. \050The I/O thread is an example of what we will call in the next) justify grestore 102.3825 234.8775 moveto font0 setfont (section a \042slack process\042\051.) show 102.3825 208.9808 moveto gsave font0 setfont (In Figure 1 the top two horizontal lines represent the Unix processes, the two at the bottom) justify grestore 102.3825 196.9358 moveto gsave font0 setfont (represent the threads running within the second Unix process. Many other Unix processes and) justify grestore 102.3825 184.8909 moveto font0 setfont (Cedar threads running at the same time are not shown.) show 102.3825 158.9941 moveto gsave font0 setfont (Let's look first at the two Unix processes. Where they show a slim horizontal grey line, they are) justify grestore 102.3825 146.9492 moveto gsave font0 setfont (idle, unscheduled by the Unix kernel. Where they show a wider red horizontal line, they have) justify grestore 102.3825 134.9041 moveto gsave font0 setfont (actually acquired a CPU. When they have a CPU, they may cause kernel activity, shown as) justify grestore 102.3825 122.8592 moveto gsave font0 setfont (short vertical strokes. For this figure we were interested in possible overhead caused by system) justify grestore 102.3825 110.8141 moveto gsave font0 setfont (calls and page faults, so only those kernel events are shown, page faults in red, system calls in) justify grestore 102.3825 98.76912 moveto gsave font0 setfont (blue. Figure 1 shows that the X window server acquired and lost the CPU eleven times in the) justify grestore 102.3825 86.72413 moveto font0 setfont (100 milliseconds; the VP ten times.) show font1 setfont ( ) show grestore grestore % end page 8 showpage %%page 9 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 558.5476 746.79 moveto (9) show 99.05297 37.62591 moveto gsave currentpoint translate 2834.645 dup matrix scale concat gsave 3.527776e-4 dup matrix scale concat gsave -47.03191 52.57746 matrix translate concat 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 189.3791 274.1677 208.4098 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 424.7808 274.1677 429.7455 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 349.4855 274.1677 359.001 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 229.5092 274.1677 262.6062 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 386.7197 274.1677 395.8214 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 307.7008 274.1677 321.353 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 455.3959 274.1677 471.5303 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 499.6627 274.1677 508.7647 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 540.207 274.1677 549.3081 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 274.1677 579.0956 274.1677 588.1974 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 189.2411 185.4112 212.685 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 588.1974 274.1677 616.3293 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 588.1974 274.1677 588.1974 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 549.3081 274.1677 579.0956 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 549.3081 274.1677 549.3081 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 508.7647 274.1677 540.207 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 508.7647 274.1677 508.7647 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 471.5303 274.1677 499.6627 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 471.5303 274.1677 471.5303 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 429.7455 274.1677 455.3959 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 429.7455 274.1677 429.7455 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 395.8214 274.1677 424.7808 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 395.8214 274.1677 395.8214 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 359.001 274.1677 386.7197 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 359.001 274.1677 359.001 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 321.353 274.1677 349.4855 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 321.353 274.1677 321.353 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 262.6062 274.1677 307.7008 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 262.6062 274.1677 262.6062 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 274.1677 205.09 274.1677 230.7403 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 189.4725 283.9595 189.4725 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 599.7812 162.921 614.675 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 599.7812 162.921 599.7812 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 560.8925 162.921 577.4407 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 560.8925 162.921 560.8925 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 524.0724 162.921 538.5523 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 524.0724 162.921 524.0724 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 483.1143 162.921 498.0084 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 483.1143 162.921 483.1143 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 441.3298 162.921 453.741 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 441.3298 162.921 441.3298 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 408.6463 162.921 423.1264 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 408.6463 162.921 408.6463 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 370.585 162.921 385.0645 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 370.585 162.921 370.585 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 333.3509 162.921 347.8305 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 333.3509 162.921 333.3509 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 284.533 162.921 306.0456 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 284.533 162.921 284.533 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 274.1902 162.921 278.3272 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 274.1902 162.921 274.1902 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 215.443 162.921 227.8542 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 162.921 215.443 162.921 215.443 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 577.8545 185.4112 599.3676 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 577.8545 185.4112 577.8545 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 538.9659 185.4112 560.4788 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 538.9659 185.4112 538.9659 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 498.4222 185.4112 523.2444 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 498.4222 185.4112 498.4222 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 454.1543 185.4112 482.701 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 454.1543 185.4112 454.1543 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 423.54 185.4112 440.5022 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 423.54 185.4112 423.54 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 385.4788 185.4112 408.2325 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 385.4788 185.4112 385.4788 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 348.2444 185.4112 370.1714 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 348.2444 185.4112 348.2444 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 306.4596 185.4112 332.5235 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 306.4596 185.4112 306.4596 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 228.268 185.4112 273.3625 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 185.4112 228.268 185.4112 228.268 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 577.4407 162.921 599.7812 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 538.5523 162.921 560.8925 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 498.0084 162.921 524.0724 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 453.741 162.921 483.1143 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 423.1264 162.921 441.3298 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 385.0645 162.921 408.6463 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 347.8305 162.921 370.585 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 306.0456 162.921 333.3509 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 278.3272 162.921 284.533 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 227.8542 162.921 274.1902 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 162.921 187.7242 162.921 215.443 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 599.3676 185.4112 615.0886 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 560.4788 185.4112 577.8545 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 523.2444 185.4112 538.9659 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 482.701 185.4112 498.4222 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 440.5022 185.4112 454.1543 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 408.2325 185.4112 423.54 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 370.1714 185.4112 385.4788 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 332.5235 185.4112 348.2444 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 273.3625 185.4112 306.4596 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 185.4112 212.685 185.4112 228.268 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 604.3318 153.2677 604.3318 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 604.3318 162.921 604.3318 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 602.8148 153.2677 602.8148 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 602.8148 162.921 602.8148 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 602.4016 153.2677 602.4016 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 602.4016 162.921 602.4016 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 601.4363 153.2677 601.4363 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 601.4363 162.921 601.4363 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 601.0222 153.2677 601.0222 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 601.0222 162.921 601.0222 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 576.6132 153.2677 576.6132 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 576.6132 162.921 576.6132 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 576.2 153.2677 576.2 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 576.2 162.921 576.2 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 573.993 153.2677 573.993 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 573.993 162.921 573.993 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 572.6143 153.2677 572.6143 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 572.6143 162.921 572.6143 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 571.235 153.2677 571.235 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 571.235 162.921 571.235 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 567.5117 153.2677 567.5117 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 567.5117 162.921 567.5117 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 565.5814 153.2677 565.5814 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 565.5814 162.921 565.5814 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 565.1671 153.2677 565.1671 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 565.1671 162.921 565.1671 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 564.6158 153.2677 564.6158 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 564.6158 162.921 564.6158 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 564.2016 153.2677 564.2016 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 564.2016 162.921 564.2016 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 538.0005 153.2677 538.0005 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 538.0005 162.921 538.0005 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 537.587 153.2677 537.587 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 537.587 162.921 537.587 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 535.38 153.2677 535.38 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 535.38 162.921 535.38 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 534.0011 153.2677 534.0011 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 534.0011 162.921 534.0011 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 532.6222 153.2677 532.6222 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 532.6222 162.921 532.6222 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 528.4849 153.2677 528.4849 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 528.4849 162.921 528.4849 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 527.3818 153.2677 527.3818 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 527.3818 162.921 527.3818 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 526.9683 153.2677 526.9683 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 526.9683 162.921 526.9683 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 525.5893 153.2677 525.5893 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 525.5893 162.921 525.5893 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 525.1754 153.2677 525.1754 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 525.1754 162.921 525.1754 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 498.0084 153.2677 498.0084 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 498.0084 162.921 498.0084 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 497.5946 153.2677 497.5946 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 497.5946 162.921 497.5946 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 495.3877 153.2677 495.3877 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 495.3877 162.921 495.3877 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 494.0088 153.2677 494.0088 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 494.0088 162.921 494.0088 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 492.6301 153.2677 492.6301 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 492.6301 162.921 492.6301 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 488.4925 153.2677 488.4925 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 488.4925 162.921 488.4925 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.9762 153.2677 486.9762 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.9762 162.921 486.9762 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.5622 153.2677 486.5622 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.5622 162.921 486.5622 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.0104 153.2677 486.0104 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 486.0104 162.921 486.0104 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 485.5968 153.2677 485.5968 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 485.5968 162.921 485.5968 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 453.741 153.2677 453.741 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 453.741 162.921 453.741 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 453.3276 153.2677 453.3276 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 453.3276 162.921 453.3276 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 452.9136 153.2677 452.9136 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 452.9136 162.921 452.9136 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 448.5007 153.2677 448.5007 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 448.5007 162.921 448.5007 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 445.7425 153.2677 445.7425 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 445.7425 162.921 445.7425 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 444.6391 153.2677 444.6391 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 444.6391 162.921 444.6391 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 444.2258 153.2677 444.2258 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 444.2258 162.921 444.2258 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 442.8467 153.2677 442.8467 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 442.8467 162.921 442.8467 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 442.4328 153.2677 442.4328 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 442.4328 162.921 442.4328 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 422.1613 153.2677 422.1613 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 422.1613 162.921 422.1613 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 421.7474 153.2677 421.7474 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 421.7474 162.921 421.7474 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 419.5405 153.2677 419.5405 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 419.5405 162.921 419.5405 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 418.1618 153.2677 418.1618 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 418.1618 162.921 418.1618 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 416.7827 153.2677 416.7827 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 416.7827 162.921 416.7827 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.6459 153.2677 412.6459 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.6459 162.921 412.6459 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 413.6111 153.2677 413.6111 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 413.6111 162.921 413.6111 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 413.1972 153.2677 413.1972 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 413.1972 162.921 413.1972 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.7837 153.2677 412.7837 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.7837 162.921 412.7837 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.3699 153.2677 412.3699 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 412.3699 162.921 412.3699 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.6857 153.2677 383.6857 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.6857 162.921 383.6857 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.548 153.2677 383.548 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.548 162.921 383.548 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.1341 153.2677 383.1341 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 383.1341 162.921 383.1341 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 380.9277 153.2677 380.9277 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 380.9277 162.921 380.9277 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 379.5488 153.2677 379.5488 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 379.5488 162.921 379.5488 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 375.4112 153.2677 375.4112 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 375.4112 162.921 375.4112 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 373.8945 153.2677 373.8945 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 373.8945 162.921 373.8945 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 373.481 153.2677 373.481 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 373.481 162.921 373.481 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 372.5156 153.2677 372.5156 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 372.5156 162.921 372.5156 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 372.1017 153.2677 372.1017 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 372.1017 162.921 372.1017 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 346.4516 153.2677 346.4516 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 346.4516 162.921 346.4516 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 346.3137 153.2677 346.3137 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 346.3137 162.921 346.3137 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 345.9002 153.2677 345.9002 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 345.9002 162.921 345.9002 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 343.6936 153.2677 343.6936 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 343.6936 162.921 343.6936 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 342.3146 153.2677 342.3146 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 342.3146 162.921 342.3146 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 338.1774 153.2677 338.1774 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 338.1774 162.921 338.1774 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 335.4196 153.2677 335.4196 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 335.4196 162.921 335.4196 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 336.5226 153.2677 336.5226 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 336.5226 162.921 336.5226 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 336.1091 153.2677 336.1091 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 336.1091 162.921 336.1091 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 335.6951 153.2677 335.6951 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 335.6951 162.921 335.6951 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 304.9426 153.2677 304.9426 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 304.9426 162.921 304.9426 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 304.529 153.2677 304.529 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 304.529 162.921 304.529 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 302.3222 153.2677 302.3222 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 302.3222 162.921 302.3222 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.8061 153.2677 296.8061 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.8061 162.921 296.8061 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.5303 153.2677 296.5303 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.5303 162.921 296.5303 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.1169 153.2677 296.1169 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 296.1169 162.921 296.1169 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 295.7031 153.2677 295.7031 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 295.7031 162.921 295.7031 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 291.2901 153.2677 291.2901 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 291.2901 162.921 291.2901 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 289.9109 153.2677 289.9109 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 289.9109 162.921 289.9109 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 287.153 153.2677 287.153 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 287.153 162.921 287.153 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 285.7738 153.2677 285.7738 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 285.7738 162.921 285.7738 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 277.3619 153.2677 277.3619 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 277.3619 162.921 277.3619 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 276.9482 153.2677 276.9482 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 276.9482 162.921 276.9482 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 275.9829 153.2677 275.9829 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 275.9829 162.921 275.9829 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 275.569 153.2677 275.569 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 275.569 162.921 275.569 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 226.475 153.2677 226.475 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 226.475 162.921 226.475 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 226.3374 153.2677 226.3374 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 226.3374 162.921 226.3374 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 225.9237 153.2677 225.9237 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 225.9237 162.921 225.9237 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 222.3381 153.2677 222.3381 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 162.921 222.3381 162.921 222.3381 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 219.5799 153.2677 219.5799 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 219.5799 162.921 219.5799 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 219.3042 153.2677 219.3042 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 219.3042 162.921 219.3042 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 218.8906 153.2677 218.8906 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 218.8906 162.921 218.8906 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 218.4764 153.2677 218.4764 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 218.4764 162.921 218.4764 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 215.443 153.2677 215.443 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 162.921 215.443 162.921 215.443 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 597.4371 175.7578 597.4371 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 597.4371 185.4112 597.4371 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 594.6786 175.7578 594.6786 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 594.6786 185.4112 594.6786 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 595.7818 175.7578 595.7818 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 595.7818 185.4112 595.7818 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 595.3684 175.7578 595.3684 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 595.3684 185.4112 595.3684 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 591.7826 175.7578 591.7826 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 591.7826 185.4112 591.7826 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 589.0244 175.7578 589.0244 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 589.0244 185.4112 589.0244 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 586.4047 175.7578 586.4047 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 586.4047 185.4112 586.4047 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 585.0254 175.7578 585.0254 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 585.0254 185.4112 585.0254 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 580.8889 175.7578 580.8889 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 580.8889 185.4112 580.8889 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 579.5098 175.7578 579.5098 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 579.5098 185.4112 579.5098 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 559.2372 175.7578 559.2372 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 559.2372 185.4112 559.2372 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 556.0655 175.7578 556.0655 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 556.0655 185.4112 556.0655 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 557.1695 175.7578 557.1695 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 557.1695 185.4112 557.1695 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 556.7551 175.7578 556.7551 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 556.7551 185.4112 556.7551 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 553.1702 175.7578 553.1702 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 553.1702 185.4112 553.1702 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 550.4115 175.7578 550.4115 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 550.4115 185.4112 550.4115 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 547.7917 175.7578 547.7917 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 547.7917 185.4112 547.7917 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 546.4127 175.7578 546.4127 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 546.4127 185.4112 546.4127 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 542.2755 175.7578 542.2755 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 542.2755 185.4112 542.2755 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 540.8964 175.7578 540.8964 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 540.8964 185.4112 540.8964 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 522.0035 175.7578 522.0035 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 522.0035 185.4112 522.0035 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 520.0732 175.7578 520.0732 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 520.0732 185.4112 520.0732 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 519.6591 175.7578 519.6591 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 519.6591 185.4112 519.6591 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 517.4524 175.7578 517.4524 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 517.4524 185.4112 517.4524 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 517.7286 175.7578 517.7286 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 517.7286 185.4112 517.7286 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 517.315 175.7578 517.315 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 517.315 185.4112 517.315 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 515.9353 175.7578 515.9353 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 515.9353 185.4112 515.9353 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 513.3152 175.7578 513.3152 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 513.3152 185.4112 513.3152 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 513.177 175.7578 513.177 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 513.177 185.4112 513.177 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 510.4196 175.7578 510.4196 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 510.4196 185.4112 510.4196 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 507.6616 175.7578 507.6616 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 507.6616 185.4112 507.6616 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 507.2477 175.7578 507.2477 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 507.2477 185.4112 507.2477 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 500.9040 175.7578 500.9040 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 500.9040 185.4112 500.9040 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 499.5246 175.7578 499.5246 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 499.5246 185.4112 499.5246 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 480.2187 175.7578 480.2187 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 480.2187 185.4112 480.2187 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 478.8393 175.7578 478.8393 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 478.8393 185.4112 478.8393 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 478.7018 175.7578 478.7018 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 478.7018 185.4112 478.7018 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 476.0816 175.7578 476.0816 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 476.0816 185.4112 476.0816 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 475.9434 175.7578 475.9434 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 475.9434 185.4112 475.9434 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 473.1852 175.7578 473.1852 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 473.1852 185.4112 473.1852 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 470.8412 175.7578 470.8412 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 470.8412 185.4112 470.8412 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 470.4271 175.7578 470.4271 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 470.4271 185.4112 470.4271 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 464.9111 175.7578 464.9111 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 464.9111 185.4112 464.9111 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 464.4972 175.7578 464.4972 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 464.4972 185.4112 464.4972 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 462.2911 175.7578 462.2911 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 462.2911 185.4112 462.2911 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 462.1533 175.7578 462.1533 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 462.1533 185.4112 462.1533 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 461.7397 175.7578 461.7397 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 461.7397 185.4112 461.7397 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 459.533 175.7578 459.533 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 459.533 185.4112 459.533 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 459.395 175.7578 459.395 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 459.395 185.4112 459.395 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 458.9815 175.7578 458.9815 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 458.9815 185.4112 458.9815 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 458.0159 175.7578 458.0159 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 458.0159 185.4112 458.0159 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 457.6022 175.7578 457.6022 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 457.6022 185.4112 457.6022 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 455.3959 175.7578 455.3959 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 455.3959 185.4112 455.3959 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 439.2611 175.7578 439.2611 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 439.2611 185.4112 439.2611 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 436.0893 175.7578 436.0893 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 436.0893 185.4112 436.0893 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 437.1926 175.7578 437.1926 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 437.1926 185.4112 437.1926 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 436.7789 175.7578 436.7789 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 436.7789 185.4112 436.7789 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 433.1932 175.7578 433.1932 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 433.1932 185.4112 433.1932 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 431.8144 175.7578 431.8144 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 431.8144 185.4112 431.8144 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 427.8152 175.7578 427.8152 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 427.8152 185.4112 427.8152 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 426.4359 175.7578 426.4359 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 426.4359 185.4112 426.4359 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 425.0571 175.7578 425.0571 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 425.0571 185.4112 425.0571 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 405.7504 175.7578 405.7504 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 405.7504 185.4112 405.7504 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 404.3716 175.7578 404.3716 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 404.3716 185.4112 404.3716 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 403.2683 175.7578 403.2683 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 403.2683 185.4112 403.2683 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 400.2338 175.7578 400.2338 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 400.2338 185.4112 400.2338 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 400.0965 175.7578 400.0965 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 400.0965 185.4112 400.0965 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 397.3382 175.7578 397.3382 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 397.3382 185.4112 397.3382 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 394.5803 175.7578 394.5803 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 394.5803 185.4112 394.5803 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 394.1667 175.7578 394.1667 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 394.1667 185.4112 394.1667 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 389.2018 175.7578 389.2018 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 389.2018 185.4112 389.2018 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 386.4438 175.7578 386.4438 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 386.4438 185.4112 386.4438 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 368.9302 175.7578 368.9302 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 368.9302 185.4112 368.9302 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 365.758 175.7578 365.758 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 365.758 185.4112 365.758 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 366.8616 175.7578 366.8616 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 366.8616 185.4112 366.8616 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 366.4477 175.7578 366.4477 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 366.4477 185.4112 366.4477 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 362.862 175.7578 362.862 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 362.862 185.4112 362.862 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 360.1045 175.7578 360.1045 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 360.1045 185.4112 360.1045 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 357.3464 175.7578 357.3464 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 357.3464 185.4112 357.3464 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 356.9324 175.7578 356.9324 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 356.9324 185.4112 356.9324 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 351.9677 175.7578 351.9677 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 351.9677 185.4112 351.9677 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 349.2097 175.7578 349.2097 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 349.2097 185.4112 349.2097 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 329.903 175.7578 329.903 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 329.903 185.4112 329.903 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 328.5242 175.7578 328.5242 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 328.5242 185.4112 328.5242 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 328.3864 175.7578 328.3864 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 328.3864 185.4112 328.3864 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 325.7662 175.7578 325.7662 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 325.7662 185.4112 325.7662 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 325.6283 175.7578 325.6283 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 325.6283 185.4112 325.6283 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 322.8704 175.7578 322.8704 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 322.8704 185.4112 322.8704 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 319.2845 175.7578 319.2845 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 319.2845 185.4112 319.2845 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 313.3545 175.7578 313.3545 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 313.3545 185.4112 313.3545 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 313.217 175.7578 313.217 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 313.217 185.4112 313.217 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 312.8033 175.7578 312.8033 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 312.8033 185.4112 312.8033 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 311.0106 175.7578 311.0106 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 311.0106 185.4112 311.0106 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 309.2176 175.7578 309.2176 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 309.2176 185.4112 309.2176 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 307.8384 175.7578 307.8384 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 307.8384 185.4112 307.8384 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 270.6044 175.7578 270.6044 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 270.6044 185.4112 270.6044 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 269.2253 175.7578 269.2253 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 269.2253 185.4112 269.2253 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 270.3288 175.7578 270.3288 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 270.3288 185.4112 270.3288 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 269.9152 175.7578 269.9152 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 269.9152 185.4112 269.9152 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 266.3298 175.7578 266.3298 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 266.3298 185.4112 266.3298 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 263.5716 175.7578 263.5716 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 263.5716 185.4112 263.5716 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 262.1925 175.7578 262.1925 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 262.1925 185.4112 262.1925 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 261.7786 175.7578 261.7786 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 261.7786 185.4112 261.7786 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.572 175.7578 259.572 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.572 185.4112 259.572 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.4344 175.7578 259.4344 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.4344 185.4112 259.4344 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.0205 175.7578 259.0205 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 259.0205 185.4112 259.0205 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.8142 175.7578 256.8142 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.8142 185.4112 256.8142 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.676 175.7578 256.676 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.676 185.4112 256.676 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.2625 175.7578 256.2625 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 256.2625 185.4112 256.2625 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 254.4697 175.7578 254.4697 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 254.4697 185.4112 254.4697 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 254.332 175.7578 254.332 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 254.332 185.4112 254.332 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 253.9182 175.7578 253.9182 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 253.9182 185.4112 253.9182 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 251.7117 175.7578 251.7117 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 251.7117 185.4112 251.7117 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.9189 175.7578 249.9189 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.9189 185.4112 249.9189 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.7812 175.7578 249.7812 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.7812 185.4112 249.7812 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.3673 175.7578 249.3673 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 249.3673 185.4112 249.3673 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 247.1609 175.7578 247.1609 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 247.1609 185.4112 247.1609 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 245.7817 175.7578 245.7817 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 245.7817 185.4112 245.7817 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 244.4028 175.7578 244.4028 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 244.4028 185.4112 244.4028 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.0238 175.7578 243.0238 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.0238 185.4112 243.0238 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 244.127 175.7578 244.127 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 244.127 185.4112 244.127 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.7134 175.7578 243.7134 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.7134 185.4112 243.7134 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.2996 175.7578 243.2996 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 243.2996 185.4112 243.2996 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 241.369 175.7578 241.369 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 241.369 185.4112 241.369 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 240.9552 175.7578 240.9552 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 240.9552 185.4112 240.9552 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 237.5075 175.7578 237.5075 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 237.5075 185.4112 237.5075 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 236.5422 175.7578 236.5422 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 236.5422 185.4112 236.5422 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 231.991 175.7578 231.991 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 231.991 185.4112 231.991 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 229.2334 175.7578 229.2334 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 229.2334 185.4112 229.2334 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 212.685 175.7578 212.685 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 212.685 185.4112 212.685 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 209.9266 175.7578 209.9266 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 209.9266 185.4112 209.9266 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 211.03 175.7578 211.03 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 211.03 185.4112 211.03 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 210.6162 175.7578 210.6162 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 210.6162 185.4112 210.6162 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 208.4098 175.7578 208.4098 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 208.4098 185.4112 208.4098 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 205.6519 175.7578 205.6519 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 205.6519 185.4112 205.6519 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 201.6524 175.7578 201.6524 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 201.6524 185.4112 201.6524 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 200.2734 175.7578 200.2734 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 185.4112 200.2734 185.4112 200.2734 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.8942 175.7578 198.8942 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.8942 185.4112 198.8942 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.7565 175.7578 198.7565 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.7565 185.4112 198.7565 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.3428 175.7578 198.3428 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 198.3428 185.4112 198.3428 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 196.1364 175.7578 196.1364 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 196.1364 185.4112 196.1364 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 195.1711 175.7578 195.1711 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 195.1711 185.4112 195.1711 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 193.3782 175.7578 193.3782 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 193.3782 185.4112 193.3782 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 193.2405 175.7578 193.2405 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 193.2405 185.4112 193.2405 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 192.8266 175.7578 192.8266 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 192.8266 185.4112 192.8266 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 191.8614 175.7578 191.8614 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 191.8614 185.4112 191.8614 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 191.4477 175.7578 191.4477 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 191.4477 185.4112 191.4477 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 189.2411 175.7578 189.2411 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 185.4112 189.2411 185.4112 189.2411 vec gsave /Helvetica findfont 1.0 scalefont /font12 exch def font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate 323.1818 170.1531 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.0s) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate 323.1818 376.3754 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.05) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate 323.1818 583.2312 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.10) show grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 459.1053 -222.6162 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 180.0458 227.0412 moveto /colwidth 146.2684 def gsave /Times-Roman findfont 10.0375 scalefont /font13 exch def font13 setfont (This thread is converting the) justify grestore 180.0458 214.9963 moveto /colwidth 146.2684 def gsave font13 setfont (contents of a text file to a bitmap) justify grestore 180.0458 202.9512 moveto font13 setfont (for display on the screen ) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 265.9783 -50.22803 moveto 212.6005 -50.22803 lineto 212.6005 118.4061 lineto 265.9783 118.4061 lineto 265.9783 -50.22803 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 742.2222 -317.0034 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 272.496 453.609 moveto /colwidth 146.9019 def gsave font13 setfont (This is a slack thread that pumps) justify grestore 272.496 441.5641 moveto font13 setfont (bitmaps to the X server) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 311.269 -50.87037 moveto 265.9782 -50.87037 lineto 265.9782 118.4062 lineto 311.269 118.4062 lineto 311.269 -50.87037 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 424.7864 172.1386 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 62.12601 325.383 moveto /colwidth 58.1206 def gsave font13 setfont (Unix process) justify grestore 62.12601 313.3379 moveto font13 setfont (not running) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 122.4668 224.9564 moveto 78.56329 224.9564 lineto 78.56329 304.2088 lineto 122.4668 304.2088 lineto 122.4668 224.9564 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 453.1004 392.6555 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray -9.934903 382.7186 moveto /colwidth 202.4789 def gsave font13 setfont (Unix process running. To illustrate the) justify grestore -9.934903 370.6735 moveto gsave font13 setfont (granularity of our information gathering, we) justify grestore -9.934903 358.6285 moveto gsave font13 setfont (show system calls \050blue strokes\051 and page faults) justify grestore -9.934903 346.5836 moveto gsave font13 setfont (\050red strokes\051. Other detail has been suppressed) justify grestore grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 121.183 372.4035 moveto 48.739 372.4035 lineto 48.739 598.0351 lineto 121.183 598.0351 lineto 121.183 372.4035 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 820.7495 -285.2067 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 255.3088 459.6363 moveto /Times-Roman findfont 10.0375 scalefont /font14 exch def font14 setfont (Thin grey line indicates) show 261.3088 447.5915 moveto font14 setfont (thread blocked on) show 261.3088 435.5465 moveto font14 setfont (condition variable or) show 261.3088 423.5015 moveto font14 setfont (monitor lock) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 410.1803 -36.50172 moveto 343.4861 -36.50172 lineto 343.4861 91.63571 lineto 410.1803 91.63571 lineto 410.1803 -36.50172 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 824.5697 -33.738 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 269.0615 455.345 moveto /colwidth 249.9906 def gsave font13 setfont (Light red indicates that the thread is ready-to-run. Dark) justify grestore 269.0615 443.3 moveto gsave font13 setfont (red indicates that the thread is scheduled on the VP and) justify grestore 269.0615 431.255 moveto /colwidth 249.9908 def gsave font13 setfont (will run if the VP is executed by the Unix process) justify grestore grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 406.5021 228.9123 moveto 346.5652 228.9123 lineto 346.5652 502.7209 lineto 406.5021 502.7209 lineto 406.5021 228.9123 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 830.2045 251.9436 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 264.9456 478.68 moveto /colwidth 89.12613 def gsave font13 setfont (Red vertical lines) justify grestore 264.9456 466.635 moveto /colwidth 84.74642 def gsave font13 setfont (indicate condition) justify grestore 264.9456 454.5898 moveto /colwidth 91.98068 def gsave font13 setfont (variable notification) justify grestore 264.9456 442.5448 moveto /colwidth 71.87671 def gsave font13 setfont (unblocking the) justify grestore 264.9456 430.4998 moveto font13 setfont (waiting thread) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 412.6497 510.4203 moveto 328.5381 510.4203 lineto 328.5381 624.0068 lineto 412.6497 624.0068 lineto 412.6497 510.4203 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 834.3149 -168.4896 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 271.1754 463.3882 moveto /colwidth 103.5091 def gsave font13 setfont (Yellow flags indicate) justify grestore 271.1754 451.3433 moveto /colwidth 78.83099 def gsave font13 setfont (thread scheduler) justify grestore 271.1754 439.2982 moveto /colwidth 103.5091 def gsave font13 setfont (invocation by a Yield) justify grestore 271.1754 427.2532 moveto font13 setfont (call.) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 416.2489 96.30433 moveto 348.1548 96.30433 lineto 348.1548 221.5806 lineto 416.2489 221.5806 lineto 416.2489 96.30433 lineto closepath stroke grestore 0.0 0.0 0.8 setrgbcolor eofill gsave gsave 0.0 0.0 moveto currentpoint translate 120.9666 249.18 moveto 164.421 249.18 lineto 164.421 261.8264 lineto 120.9666 261.8264 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 122.4666 260.3263 162.921 250.68 vec grestore grestore 0.8 0.0 0.0 setrgbcolor eofill gsave gsave 0.0 0.0 moveto currentpoint translate 119.895 447.0007 moveto 154.7677 447.0007 lineto 154.7677 474.0464 lineto 119.895 474.0464 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 121.395 472.5463 153.2677 448.5007 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 272.6676 90.13572 moveto 344.9861 90.13572 lineto 344.9861 199.7372 lineto 272.6676 199.7372 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 343.4861 91.63571 274.1677 198.2372 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 237.7949 465.6875 moveto 348.0653 465.6875 lineto 348.0653 504.221 lineto 237.7949 504.221 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 346.5654 502.7209 239.2949 467.1875 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 272.6676 501.2206 moveto 348.0653 501.2206 lineto 348.0653 510.2646 lineto 272.6676 510.2646 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 346.5654 502.7209 274.1677 508.7647 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 272.6676 220.0806 moveto 349.6548 220.0806 lineto 349.6548 271.0014 lineto 272.6676 271.0014 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 348.1548 221.5806 274.1677 269.5014 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 254.0594 562.5512 moveto 330.0382 562.5512 lineto 330.0382 590.1106 lineto 254.0594 590.1106 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 328.5381 573.6834 moveto 322.1154 569.9186 315.6924 566.1535 309.2491 564.7288 curveto 291.4562 560.7932 273.5077 574.7021 255.5594 588.6108 curveto stroke grestore grestore gsave /Helvetica findfont 1.0 scalefont /font15 exch def font15 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate 439.8178 -12.47726 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (Figure 1) show grestore 0.8 0.0 0.0 setrgbcolor eofill gsave gsave 0.0 0.0 moveto currentpoint translate 119.895 471.0463 moveto 186.9112 471.0463 lineto 186.9112 511.9196 lineto 119.895 511.9196 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 121.395 472.5463 185.4112 510.4196 vec grestore grestore 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 235.1306 187.4428 235.1306 616.8511 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 603.1842 283.9595 603.1842 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 561.813 283.9595 561.813 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 520.4415 283.9595 520.4415 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 479.0708 283.9595 479.0708 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 437.6992 283.9595 437.6992 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 396.3281 283.9595 396.3281 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 354.957 283.9595 354.957 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 313.5857 283.9595 313.5857 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 272.2145 283.9595 272.2145 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray 297.7498 230.8437 283.9595 230.8437 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 580.75 235.5545 592.7482 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 541.8615 235.5545 553.8594 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 501.7317 235.5545 513.3152 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 464.4972 235.5545 476.0816 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 426.4359 235.5545 434.2963 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 388.3742 235.5545 400.3725 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 351.1404 235.5545 363.9656 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 313.0788 235.5545 325.9041 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 259.7102 235.5545 267.157 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 231.1642 235.5545 241.5068 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 235.5545 199.3084 235.5545 208.4098 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 594.8172 274.1677 617.9841 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 592.7482 274.1677 594.8172 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 555.9276 274.1677 580.75 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 553.8594 274.1677 555.9276 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 515.3842 274.1677 541.8615 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 513.3152 274.1677 515.3842 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 478.15 274.1677 501.7317 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 476.0816 274.1677 478.15 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 436.365 274.1677 457.878 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 434.2963 274.1677 436.365 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 403.6819 274.1677 426.4359 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 400.3725 274.1677 403.6819 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 365.6205 274.1677 388.3742 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 363.9656 274.1677 365.6205 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 327.9726 274.1677 351.1404 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 325.9041 274.1677 327.9726 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 268.8115 274.1677 309.3556 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 267.157 274.1677 268.8115 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 210.4786 274.1677 231.1642 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 274.1677 208.4098 274.1677 210.4786 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 591.3692 225.901 591.3692 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 591.3692 235.5545 591.3692 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 552.7561 225.901 552.7561 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 552.7561 235.5545 552.7561 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 512.7636 225.901 512.7636 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 512.7636 235.5545 512.7636 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 475.5301 225.901 475.5301 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 475.5301 235.5545 475.5301 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 432.7798 225.901 432.7798 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 432.7798 235.5545 432.7798 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 399.6825 225.901 399.6825 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 399.6825 235.5545 399.6825 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 362.4485 225.901 362.4485 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 362.4485 235.5545 362.4485 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 325.2146 225.901 325.2146 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 325.2146 235.5545 325.2146 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 265.9158 225.901 265.9158 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 265.9158 235.5545 265.9158 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 207.9962 225.901 207.9962 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 235.5545 207.9962 235.5545 207.9962 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 594.9551 264.5143 594.9551 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 594.9551 274.1677 594.9551 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 556.3415 264.5143 556.3415 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 556.3415 274.1677 556.3415 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 515.522 264.5143 515.522 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 515.522 274.1677 515.522 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 478.2881 264.5143 478.2881 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 478.2881 274.1677 478.2881 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 436.365 264.5143 436.365 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 436.365 274.1677 436.365 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 402.8545 264.5143 402.8545 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 402.8545 274.1677 402.8545 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 366.0339 264.5143 366.0339 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 366.0339 274.1677 366.0339 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 327.9726 264.5143 327.9726 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 327.9726 274.1677 327.9726 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 269.5014 264.5143 269.5014 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 269.5014 274.1677 269.5014 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 210.2022 264.5143 210.2022 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 274.1677 210.2022 274.1677 210.2022 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 588.6109 270.0306 588.6109 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 588.6109 236.9335 588.6109 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 549.998 270.0306 549.998 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 549.998 236.9335 549.998 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 510.006 270.0306 510.006 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 510.006 236.9335 510.006 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 472.7724 270.0306 472.7724 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 472.7724 236.9335 472.7724 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 431.4005 270.0306 431.4005 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 431.4005 236.9335 431.4005 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 396.9245 270.0306 396.9245 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 396.9245 236.9335 396.9245 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 359.6906 270.0306 359.6906 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 359.6906 236.9335 359.6906 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 322.4565 270.0306 322.4565 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 322.4565 236.9335 322.4565 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 263.1578 270.0306 263.1578 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 263.1578 236.9335 263.1578 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 205.2381 270.0306 205.2381 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 236.9335 205.2381 236.9335 205.2381 vec 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 272.1677 187.3791 moveto 276.1677 187.3791 lineto 276.1677 191.3791 lineto 272.1677 191.3791 lineto clip newpath 0.0 setgray 2.0 setlinewidth 1 setlinecap 1 setlinejoin 274.1677 189.3791 moveto 274.1677 189.3791 lineto 274.1677 189.3791 lineto 274.1677 189.3791 lineto stroke grestore grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 352.3497 -222.6162 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 180.0458 217.019 moveto /colwidth 146.2684 def gsave font13 setfont (This is the X window system) justify grestore 180.0458 204.9741 moveto font13 setfont (server Unix process.) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 159.2228 -50.2279 moveto 116.0075 -50.2279 lineto 116.0075 118.4062 lineto 159.2228 118.4062 lineto 159.2228 -50.2279 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 405.7272 -225.1205 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 182.5153 227.0412 moveto /colwidth 146.2684 def gsave font13 setfont (This is the PCR virtual processor) justify grestore 182.5153 214.9963 moveto /colwidth 146.2684 def gsave font13 setfont (\050VP\051 Unix process that is running) justify grestore 182.5153 202.9512 moveto font13 setfont (the two threads below.) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray 212.6004 -50.22792 moveto 159.2226 -50.22792 lineto 159.2226 118.4062 lineto 212.6004 118.4062 lineto 212.6004 -50.22792 lineto closepath stroke grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 272.6676 116.1375 moveto 289.2877 116.1375 lineto 289.2877 190.8792 lineto 272.6676 190.8792 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 287.7876 117.6375 274.1677 189.3791 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 233.6306 116.9063 moveto 237.6992 116.9063 lineto 237.6992 188.9428 lineto 233.6306 188.9428 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 236.1992 118.4062 235.1306 187.4428 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 182.4227 116.9063 moveto 186.9112 116.9063 lineto 186.9112 190.741 lineto 182.4227 190.741 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 183.9227 118.4062 185.4112 189.2411 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate 134.2732 116.9063 moveto 164.421 116.9063 lineto 164.421 189.2242 lineto 134.2732 189.2242 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin 135.7732 118.4062 162.921 187.7242 vec grestore grestore gsave font12 setfont 0.0 setgray 13.16219 dup matrix scale 90.0 matrix rotate 164.9661 171.0997 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (X) show grestore gsave font12 setfont 0.0 setgray 13.16219 dup matrix scale 90.0 matrix rotate 188.7376 162.6555 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (VP) show grestore gsave font12 setfont 0.0 setgray 13.16219 dup matrix scale 90.0 matrix rotate 239.6384 146.5897 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (image) show grestore gsave font12 setfont 0.0 setgray 13.16219 dup matrix scale 90.0 matrix rotate 279.1436 150.4403 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (buffer) show grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 856.6655 374.927 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray -13.62074 423.9844 moveto /colwidth 216.6487 def gsave /Times-Roman findfont 8.029999 scalefont /font16 exch def font16 setfont (Note: Our data collector reports \042unknown state\042 for processes) justify grestore -13.62074 413.9468 moveto gsave font16 setfont (at the beginning of a capture interval. For clarity we added by) justify grestore -13.62074 403.9094 moveto gsave font16 setfont (hand the state color in two places: the first red \042running\042) justify grestore -13.62074 393.8718 moveto font16 setfont (region in VP, and the pink \042ready-to-run\042 region in image.) show grestore grestore gsave font15 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate 462.0180 -44.64196 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (example of micro-visualization) show grestore gsave font15 setfont 0.0 setgray 10.0 dup matrix scale 90.0 matrix rotate 336.5581 167.7614 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (\050scale: 15mm = approx. 10 milliseconds\051) show grestore grestore grestore grestore grestore grestore % end page 9 showpage %%page 10 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (10) show 102.3825 713.8666 moveto /colwidth 436.8694 def gsave font0 setfont (Now look at the two threads, the third and fourth lines in figure 1. Again a slim grey line shows) justify grestore 102.3825 701.8220 moveto /colwidth 436.8696 def gsave font0 setfont (they are idle. A broader pink line indicates the thread is ready to run. As with the Unix) justify grestore 102.3825 689.7769 moveto gsave font0 setfont (processes, a broad red area shows that the thread has actually acquired a virtual processor.) justify grestore 102.3825 677.7321 moveto gsave font0 setfont (Within the threads, again vertical strokes indicate \042kernel\042 activity, in this case requests to) justify grestore 102.3825 665.687 moveto gsave font0 setfont (the underlying thread mechanism running in the VP. Long vertical strokes from thread-to-) justify grestore 102.3825 653.642 moveto gsave font0 setfont (thread indicate inter-thread communication, in this case notification via a condition variable) justify grestore 102.3825 641.597 moveto gsave font0 setfont (that a thread should wake up. The sender of the communication has a dot at the beginning of) justify grestore 102.3825 629.552 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (the stroke. Short yellow strokes indicate a ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( call, in which a thread offers to voluntarily) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 617.5073 moveto gsave font0 setfont (give up the processor to anyone who may want it. Although PCR has a pre-emptive scheduler) justify grestore 102.3825 605.4621 moveto font0 setfont (so yields are not strictly necessary, threads sometimes yield for performance reasons. ) show 102.3825 585.4839 moveto /colwidth 436.8694 def gsave font0 setfont (Finally, notice the relationship between the red areas in the VP, meaning it has acquired a real) justify grestore 102.3825 573.4386 moveto /colwidth 436.8696 def gsave font0 setfont (processor, and the red areas in the threads, meaning they have acquired the VP. A thread only) justify grestore 102.3825 561.394 moveto gsave font0 setfont (can do real work when two conditions are met: it has acquired a VP, indicated by a red area in) justify grestore 102.3825 549.3488 moveto gsave font0 setfont (the thread, and the VP has itself acquired the real processor, indicated by red in the VP. Thus) justify grestore 102.3825 537.3036 moveto gsave font0 setfont (threads sometimes become red for quite a while, but are making no progress because their VP) justify grestore 102.3825 525.2586 moveto gsave font0 setfont (does not have the processor. This is particularly apparent in the second thread \050fourth line\051 in) justify grestore 102.3825 513.2138 moveto font0 setfont (figure 1.) show 92.345 486.5757 moveto font9 setfont (3.2.2 A problem revealed by micro-behavior visualization) show 102.3825 459.9379 moveto gsave font0 setfont (Figure 1a shows a 10 millisecond slice from Figure 1. Starting from the top left, the X server) justify grestore 102.3825 447.8929 moveto gsave font0 setfont (process is idle, the VP process is about to acquire the processor \050indicated by turning red\051, the) justify grestore 102.3825 435.8478 moveto font0 setfont (image thread is ready-to-run but not scheduled on the VP and the buffer thread is idle.) show 247.9447 291.1997 moveto gsave currentpoint translate 2834.645 dup matrix scale concat gsave 3.527776e-4 dup matrix scale concat gsave -172.0006 -876.1892 matrix translate concat 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 212.0 998.0681 308.9531 998.0681 vec 0.5 setgray eofill gsave gsave -120.9615 808.1351 moveto currentpoint translate 330.0875 130.0615 moveto 436.5767 130.0615 lineto 436.5767 138.0615 lineto 330.0875 138.0615 lineto clip newpath 0.88 0.52 0.52 setrgbcolor 6.0 setlinewidth 0 setlinecap 1 setlinejoin 432.5764 134.0615 334.0875 134.0615 vec grestore grestore 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 210.4639 980.7681 308.9531 980.7681 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 215.5004 980.7681 269.6014 980.7681 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 251.8 912.543 310.9924 912.543 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor 249.3253 912.543 249.2342 912.4942 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 275.9663 998.0681 304.6076 998.0681 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 275.9663 998.0681 275.9663 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 301.4246 998.0681 301.4246 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 301.4246 998.0681 301.4246 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 301.1072 998.0681 301.1072 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 301.1072 998.0681 301.1072 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 300.1526 998.0681 300.1526 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 300.1526 998.0681 300.1526 998.0681 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 291.8784 998.0681 291.8784 1005.494 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 291.8784 998.0681 291.8784 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 285.5128 998.0681 285.5128 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 285.5128 998.0681 285.5128 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 284.8767 998.0681 284.8767 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 284.8767 998.0681 284.8767 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 283.9222 998.0681 283.9222 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 283.9222 998.0681 283.9222 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 282.9664 998.0681 282.9664 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 282.9664 998.0681 282.9664 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 275.9663 998.0681 275.9663 1005.494 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 275.9663 998.0681 275.9663 998.0681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 269.6014 980.7681 269.6014 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 269.6014 980.7681 269.6014 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 263.2364 980.7681 263.2364 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 263.2364 980.7681 263.2364 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 265.7826 980.7681 265.7826 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 265.7826 980.7681 265.7826 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 264.828 980.7681 264.828 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 264.828 980.7681 264.828 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 259.736 980.7681 259.736 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 259.736 980.7681 259.736 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 253.3712 980.7681 253.3712 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 253.3712 980.7681 253.3712 980.7681 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 244.142 980.7681 244.142 988.1944 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 244.142 980.7681 244.142 980.7681 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 240.9594 980.7681 240.9594 988.1944 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 240.9594 980.7681 240.9594 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 237.7767 980.7681 237.7767 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 237.7767 980.7681 237.7767 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 237.4594 980.7681 237.4594 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 237.4594 980.7681 237.4594 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 236.5047 980.7681 236.5047 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 236.5047 980.7681 236.5047 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 231.4127 980.7681 231.4127 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 231.4127 980.7681 231.4127 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 229.185 980.7681 229.185 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 229.185 980.7681 229.185 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 225.0476 980.7681 225.0476 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 225.0476 980.7681 225.0476 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 224.7297 980.7681 224.7297 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 224.7297 980.7681 224.7297 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 223.7746 980.7681 223.7746 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 223.7746 980.7681 223.7746 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 221.5472 980.7681 221.5472 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 221.5472 980.7681 221.5472 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 220.5926 980.7681 220.5926 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 220.5926 980.7681 220.5926 980.7681 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 215.5004 980.7681 215.5004 988.1944 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor 215.5004 980.7681 215.5004 980.7681 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 238.7322 942.1961 259.736 942.1961 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 264.5096 912.4942 312.2456 912.4942 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor 259.736 912.4942 264.5096 912.4942 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor 215.819 912.4942 251.8 912.543 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 258.7816 942.1961 258.7816 949.6223 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor 258.7816 942.1961 258.7816 942.1961 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 263.8726 912.4942 263.8726 919.92 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor 263.8726 912.4942 263.8726 912.4942 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 252.4162 941.1357 252.4162 915.6765 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor 252.4162 941.1357 252.4162 941.1357 vec 0.5 setgray eofill gsave gsave -58.34868 723.1153 moveto currentpoint translate 272.1677 187.3791 moveto 276.1677 187.3791 lineto 276.1677 191.3791 lineto 272.1677 191.3791 lineto clip newpath 0.0 setgray 2.0 setlinewidth 1 setlinecap 1 setlinejoin 274.1677 189.3791 moveto 274.1677 189.3791 lineto 274.1677 189.3791 lineto 274.1677 189.3791 lineto stroke grestore grestore gsave font12 setfont 0.0 setgray 12.0 dup matrix scale 0.4889224 matrix rotate 226.9918 884.4314 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (figure 1a) show grestore gsave font12 setfont 0.0 setgray 12.0 dup matrix scale 0.4889224 matrix rotate 193.6054 995.2703 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (X) show grestore gsave font12 setfont 0.0 setgray 12.0 dup matrix scale 0.4889224 matrix rotate 186.9508 978.4118 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (VP) show grestore gsave font12 setfont 0.0 setgray 12.0 dup matrix scale 0.4889224 matrix rotate 178.0778 939.815 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (image) show grestore gsave font12 setfont 0.0 setgray 12.0 dup matrix scale 0.4889224 matrix rotate 178.9942 909.3456 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (buffer) show grestore 2.0 setlinewidth 0.0 setgray gsave 1.0 setlinewidth 2 setlinecap 1 setlinejoin 172.0006 876.1892 moveto 172.0006 1010.393 lineto 317.7458 1010.393 lineto 317.7458 876.1892 lineto 172.0006 876.1892 lineto closepath stroke grestore grestore grestore grestore 102.3825 271.2212 moveto gsave font0 setfont (When the VP starts running, it eventually runs the image thread. After some work, the image) justify grestore 102.3825 259.1762 moveto /colwidth 436.8694 def gsave font0 setfont (thread tells the buffer thread that there is some image data to transmit by notifying a condition) justify grestore 102.3825 247.1312 moveto /colwidth 436.8696 def gsave font0 setfont (variable \050CV\051. This notification \050shown by the long red stroke from the image to buffer thread\051) justify grestore 102.3825 235.0862 moveto gsave font0 setfont (immediately makes the buffer thread ready-to-run \050shown by the pink color\051. The buffer) justify grestore 102.3825 223.0412 moveto gsave font0 setfont (thread does not run immediately upon being notified because the image thread is still holding) justify grestore 102.3825 210.9962 moveto gsave font0 setfont (the monitor lock. \050See Section 6.1\051 When the image thread leaves the monitor \050indicated by the) justify grestore 102.3825 198.9512 moveto font0 setfont (blue stroke at the end of the dark red region\051, the buffer thread runs.) show 102.3825 178.9727 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (The buffer thread runs only briefly and then ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (s, shown by the short yellow stroke. The) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 166.9277 moveto gsave font10 setfont opsbef 0 {font10 setfont} put (YIELD) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put ( does nothing, the buffer thread continues to run and begins to communicate to the X) 1 buf opsaft 1 null put mixedjustify grestore 102.3825 154.8827 moveto gsave font0 setfont (server, which we deduce from the fact that the X server now starts to run \050top line\051. The buffer) justify grestore 102.3825 142.8377 moveto font0 setfont (thread continues to run for some time and eventually this cycle repeats.) show 102.3825 122.8593 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (Why is that ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( there and what is supposed to be happening? The buffer thread is supposed to) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 110.8142 moveto gsave font0 setfont (be storing up paint requests, merging overlapping requests and sending them only occasionally) justify grestore 102.3825 98.76922 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (to the X server. It does the ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( when it determines that it should not yet communicate to the) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 86.72425 moveto /colwidth 436.8694 def gsave font0 setfont (X server, instead offering to give up the processor to any other thread that desires it. In this) justify grestore grestore grestore % end page 10 showpage %%page 11 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 553.3894 746.79 moveto (11) show 102.3825 713.8666 moveto /colwidth 436.8696 def gsave font0 setfont (case, the scheduler decided to continue running the buffer process so it proceeded to) justify grestore 102.3825 701.8220 moveto font0 setfont (communicate with the X server anyway. ) show 102.3825 682.8176 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (The ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (YIELD) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( by the buffer thread invokes the scheduler to choose the highest priority ready-to-) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 670.7727 moveto gsave font0 setfont (run thread. The image thread is ready-to-run as shown by its pink color but it has lower) justify grestore 102.3825 658.7276 moveto gsave font0 setfont (priority than the buffer thread \050deduced from the figure and confirmed in the source code\051. So) justify grestore 102.3825 646.6826 moveto font0 setfont (in this case the ) show font10 setfont (YIELD) show font0 setfont ( in the buffer thread accomplishes nothing.) show 102.3825 627.6786 moveto gsave font0 setfont (As can be seen in microcosm in Figure 1a, and repeatedly in Figure 1, this failure to yield) justify grestore 102.3825 615.6334 moveto /colwidth 436.8694 def gsave font0 setfont (means that every time the image thread wakes up and signals the buffer thread, the buffer) justify grestore 102.3825 603.5882 moveto /colwidth 436.8696 def gsave font0 setfont (thread runs and wakes up the X server. The failure to merge overlapping requests and the) justify grestore 102.3825 591.5434 moveto font0 setfont (frequent thread and process switches are costly in performance.) show 102.3825 572.539 moveto font0 setfont (We will return to this problem in Section 5.2.) show 72.26999 523.1098 moveto font8 setfont (4. Thread paradigms ) show 82.3075 497.7709 moveto /colwidth 456.9444 def gsave font0 setfont (Birrell provides a good introduction to some of the basic paradigms for thread use [Birrell91]. Here) justify grestore 82.3075 485.7258 moveto gsave font0 setfont (we go further into more advanced paradigms, their necessity and frequency in practice and the) justify grestore 82.3075 473.6809 moveto font0 setfont (problems of performance and correctness entailed by these advanced usages.) show 82.3075 454.6765 moveto gsave font0 setfont (Birrell suggests that forking a new thread is useful in several situations: to exploit concurrency on) justify grestore 82.3075 442.6316 moveto gsave font0 setfont (a multiprocessor \050including waiting for I/O, where one processor is the I/O device\051; to satisfy a) justify grestore 82.3075 430.5866 moveto gsave font0 setfont (human user by making progress on several tasks at once; to provide network service to multiple) justify grestore 82.3075 418.5414 moveto font0 setfont (clients simultaneously; and to defer work to a less busy time [Birrell91, p. 109].) show 82.3075 399.537 moveto gsave font0 setfont (We examined about 650 different code fragments that create threads. We gradually developed a) justify grestore 82.3075 387.492 moveto gsave font0 setfont (collection of categories that we could use to explain how thread uses were similar to one another) justify grestore 82.3075 375.447 moveto font0 setfont (and how they differed. Our final list of categories is:) show 112.42 360.7701 moveto font0 setfont (- defer work \050same as Birrell's\051) show 112.42 346.093 moveto /colwidth 414.8684 def gsave font0 setfont (- pumps \050components of Birrell's pipelines. He describes them for exploiting) justify grestore 142.5325 334.0481 moveto font0 setfont (multiprocessing, but we saw them mostly used for structuring.\051) show 112.42 319.371 moveto font0 setfont (- slack processes, a kind of specialized pump \050new\051) show 112.42 304.694 moveto /colwidth 426.832 def gsave font0 setfont (- sleepers and one-shots \050common uses probably omitted by Birrell because synchronization) justify grestore 142.5325 292.649 moveto font0 setfont (problems in them are rare\051) show 112.42 277.9718 moveto font0 setfont (- deadlock avoiders \050new\051) show 112.42 263.2949 moveto font0 setfont (- task rejuvenation \050new\051) show 112.42 248.6178 moveto font0 setfont (- serializers, another kind of specialized pump \050new\051) show 112.42 233.9407 moveto font0 setfont (- concurrency exploiters \050same as Birrell's\051) show 112.42 219.2637 moveto /colwidth 426.8318 def gsave font0 setfont (- encapsulated forks, which are forks in packages that capture certain paradigms and whose) justify grestore 142.5325 207.2188 moveto font0 setfont (uses are themselves counted in the other categories.) show 82.3075 188.2144 moveto /colwidth 456.9444 def gsave font0 setfont (These static categories complement the thread lifetime characterization in Section 3.1. The eternal) justify grestore 82.3075 176.1694 moveto gsave font0 setfont (threads tend to be sleepers, pumps and serializers with nothing to do. Worker threads are often) justify grestore 82.3075 164.1244 moveto gsave font0 setfont (work deferrers and transient threads are often deadlock avoiders. But the reader is cautioned that) justify grestore 82.3075 152.0794 moveto font0 setfont (the static paradigm can't be predicted from the dynamic lifetime. ) show 112.42 137.4023 moveto font0 setfont ( ) show 82.3075 112.0632 moveto font1 setfont (4.1 Defer work) show 92.345 86.7241 moveto /colwidth 446.907 def gsave font0 setfont (Deferring work is the single most common use of forking in these systems. A procedure can often) justify grestore grestore grestore % end page 11 showpage %%page 12 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (12) show 92.345 713.8666 moveto gsave font0 setfont (reduce the latency seen by its clients by forking a thread to do work not required for the) justify grestore 92.345 701.8220 moveto gsave font0 setfont (procedure's return value. Sometimes work can be deferred to times when the system is under less) justify grestore 92.345 689.7769 moveto gsave font0 setfont (load [Birrell91]. Cedar practice has been to introduce work deferrers freely as the opportunity to) justify grestore 92.345 677.7321 moveto gsave font0 setfont (use them is noticed. Many commands fork an activity whose results will be reported in a separate) justify grestore 92.345 665.687 moveto gsave font0 setfont (window: control in the originating thread returns immediately to the user, an example of latency) justify grestore 92.345 653.642 moveto font0 setfont (reduction for the human client. Some examples of work deferrers are:) show 132.495 639.5898 moveto font0 setfont (- forking to print a document) show 132.495 625.537 moveto font0 setfont (- forking to send a mail message) show 132.495 611.4845 moveto font0 setfont (- forking to create a new window) show 132.495 597.4321 moveto font0 setfont (- forking to update the contents of a window) show 92.345 579.3645 moveto gsave font0 setfont (Some threads are themselves so critical to system responsiveness that they fork to defer almost) justify grestore 92.345 567.3194 moveto gsave font0 setfont (any work at all beyond noticing what work needs to be done. These critical threads play the role) justify grestore 92.345 555.2745 moveto gsave font0 setfont (of interrupt handlers. Forking the real work allows it to be done in a lower priority thread and) justify grestore 92.345 543.2295 moveto gsave font0 setfont (frees the critical thread to respond to the next event. The keyboard-and-mouse watching) justify grestore 92.345 531.1846 moveto font0 setfont (process, called the Notifier, is such a critical, high priority thread in both Cedar and GVX.) show 82.3075 507.0946 moveto font1 setfont (4.2 Pumps ) show 92.345 483.0046 moveto gsave font0 setfont (Pumps are components of pipelines. They pick up input from one place, possibly transform it in) justify grestore 92.345 470.9596 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (some way and produce it as output someplace else.) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont 0.0 4.015 rmoveto} put (1) 1 buf opsaft 1 null put font0 setfont opsbef 2 {0.0 -4.015 rmoveto font0 setfont} put ( Bounded buffers and external devices are) 2 buf opsaft 2 null put mixedjustify grestore 92.345 458.9146 moveto gsave font0 setfont (two common sources and sinks. The former occur in several implementations in our systems for) justify grestore 92.345 446.8696 moveto gsave font0 setfont (connecting threads together, while the latter are accessed with system calls \050read, write\051 and) justify grestore 92.345 434.8246 moveto font0 setfont (shared memory \050raw screen IO and memory shared with an external X server\051. ) show 92.345 416.7571 moveto gsave font0 setfont (Though Birrell suggests creating pipelines to exploit parallelism on a multiprocessor, we find) justify grestore 92.345 404.7122 moveto gsave font0 setfont (them most commonly used in our systems as a programming convenience, another reflection of) justify grestore 92.345 392.667 moveto gsave font0 setfont (the uniprocessor heritage of the systems. This is also their primary use in the well-known Unix) justify grestore 92.345 380.6222 moveto gsave font0 setfont (shell pipelines. For example, in our systems all user input is filtered through a pipeline thread) justify grestore 92.345 368.5769 moveto gsave font0 setfont (that preprocesses events and puts them into another queue, rather than have each reader thread) justify grestore 92.345 356.532 moveto gsave font0 setfont (preprocess on demand. Neither approach necessarily provides a more efficient system, but the) justify grestore 92.345 344.487 moveto gsave font0 setfont (pipeline is conceptually simpler: tokens just appear in a queue. The programmer needs to) justify grestore 92.345 332.442 moveto font0 setfont (understand less about the pieces being connected.) show 92.345 314.3745 moveto gsave font0 setfont (One interesting kind of pump is the slack process. A slack process explicitly adds latency to a) justify grestore 92.345 302.3294 moveto gsave font0 setfont (pipeline in the hope of reducing the total amount of work done, either by merging input or) justify grestore 92.345 290.2844 moveto gsave font0 setfont (replacing earlier data with later data before placing it on its output. Slack processes are useful) justify grestore 92.345 278.2394 moveto gsave font0 setfont (when the downstream consumer of the data incurs high per-transaction costs. The buffer thread) justify grestore 92.345 266.1944 moveto font0 setfont (discussed in Sections 3.2 and 5.2 is an example of a slack process. ) show 82.3075 242.1045 moveto font1 setfont (4.3 Sleepers and oneshots) show 92.345 218.0145 moveto gsave font0 setfont (Sleepers are processes that repeatedly wait for a triggering event and then execute. Often the) justify grestore 92.345 205.9694 moveto gsave font0 setfont (triggering event is a timeout. Examples include: call this procedure in K seconds; blink the) justify grestore 92.345 193.9244 moveto gsave font0 setfont (cursor in M milliseconds; check for network connection timeout every T seconds. Other common) justify grestore 92.345 181.8794 moveto gsave font0 setfont (events are external input and service callbacks from other activities. For instance, our systems) justify grestore 92.345 138.9191 moveto font0 setfont currentpoint /undery exch def /underx exch def ( ) show 1.0 setlinewidth currentpoint currentpoint pop undery 1.2 sub dup underx exch vec moveto 92.345 122.8592 moveto gsave font10 setfont opsbef 0 {font10 setfont 0.0 4.015 rmoveto} put (1) 0 buf opsaft 0 null put font0 setfont opsbef 1 {0.0 -4.015 rmoveto font0 setfont} put (We use the term ) 1 buf opsaft 1 null put font9 setfont opsbef 2 {font9 setfont} put (pump) 2 buf opsaft 2 null put font0 setfont opsbef 3 {font0 setfont} put (, rather than the more common ) 3 buf opsaft 3 null put font9 setfont opsbef 4 {font9 setfont} put (filter) 4 buf opsaft 4 null put font0 setfont opsbef 5 {font0 setfont} put ( because data transformation, ala) 5 buf opsaft 5 null put mixedjustify grestore 92.345 110.8142 moveto gsave font0 setfont (filters, is just one of the things that pumps can do. In general, pumps control both the data) justify grestore 92.345 98.76915 moveto gsave font0 setfont (transformation and the timing of the transfer. We also like the connotation of an active entity) justify grestore 92.345 86.72413 moveto font0 setfont (conveyed by ) show font9 setfont (pump) show font0 setfont ( as opposed to the passivity of ) show font9 setfont (filter) show font0 setfont (.) show grestore grestore % end page 12 showpage %%page 13 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (13) show 92.345 713.8666 moveto gsave font0 setfont (use callbacks from the garbage collector to finalize objects and callbacks from the filesystem) justify grestore 92.345 701.8220 moveto gsave font0 setfont (when files change state. These callbacks are removed from time-critical paths in the garbage) justify grestore 92.345 689.7769 moveto gsave font0 setfont (collector and filesystem by putting an event in a work queue serviced by a sleeper thread. The) justify grestore 92.345 677.7321 moveto font0 setfont (client's code is then called from the sleeper.) show 92.345 658.2881 moveto gsave font0 setfont (Sleepers frequently do very little work before sleeping again. For instance, various cache) justify grestore 92.345 646.2429 moveto font0 setfont (managers in our systems simply throw away aged values in a cache then go back to sleep.) show 92.345 626.7988 moveto gsave font0 setfont (Another kind of sleeper is the garbage collector's background thread which cleans pages dirtied) justify grestore 92.345 614.7539 moveto gsave font0 setfont (by other threads. If it gets too far behind in its work it could cause virtual memory thrashing by) justify grestore 92.345 602.709 moveto gsave font0 setfont (cleaning pages no longer resident in physical memory. Its rate of awakening must depend on the) justify grestore 92.345 590.6639 moveto font0 setfont (amount of page dirtying which depends on the workload of all the other threads in the system.) show 92.345 571.2198 moveto gsave font0 setfont (OneShots are sleeper processes that sleep for a while, run and then go away. This paradigm is) justify grestore 92.345 559.175 moveto gsave font0 setfont (used repeatedly in Cedar, for example, to implement guarded buttons of several kinds. \050A) justify grestore 92.345 547.1299 moveto gsave font0 setfont (guarded button must be pressed twice, in close, but not too close succession. They usually look) justify grestore 92.345 535.0847 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (like \042) 0 buf opsaft 0 null put opsbef 1 { currentpoint /undery exch def /underx exch def font0 setfont} put (Button) 1 buf opsaft 1 { 1.0 setlinewidth currentpoint currentpoint pop undery -2.3 sub dup underx exch vec moveto} put opsbef 2 {font0 setfont} put (\042 on the screen.\051 After a one-shot is forked it sleeps for an arming period that must) 2 buf opsaft 2 null put mixedjustify grestore 92.345 523.04 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (pass before a second click is acceptable. Then it changes the button appearance from \042) 0 buf opsaft 0 null put opsbef 1 { currentpoint /undery exch def /underx exch def font0 setfont} put (Button) 1 buf opsaft 1 { 1.0 setlinewidth currentpoint currentpoint pop undery -2.3 sub dup underx exch vec moveto} put opsbef 2 {font0 setfont} put (\042 to) 2 buf opsaft 2 null put mixedjustify grestore 92.345 510.9948 moveto gsave font0 setfont (\042Button\042 and sleeps a second time. During this period a second click invokes a procedure) justify grestore 92.345 498.95 moveto gsave font0 setfont (associated with the button, but if the timeout expires without a second click, the one-shot just) justify grestore 92.345 486.9047 moveto font0 setfont (repaints the guarded button.) show 82.3075 460.9794 moveto font1 setfont (4.4 Deadlock avoiders) show 92.345 435.054 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (Cedar often uses ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( to avoid violating lock order constraints. The window manager makes) 2 buf opsaft 2 null put mixedjustify grestore 92.345 423.009 moveto gsave font0 setfont (heavy use of this paradigm. For example, after adjusting the boundary between two windows the) justify grestore 92.345 410.9639 moveto gsave font0 setfont (contents of the windows must be repainted. The boundary-moving thread forks new threads to do) justify grestore 92.345 398.9189 moveto gsave font0 setfont (the repainting because it already holds some, but not all of the locks needed for the repainting.) justify grestore 92.345 386.8739 moveto gsave font0 setfont (Acquiring these locks would require unwinding the adjusting process far enough to release locks) justify grestore 92.345 374.829 moveto gsave font0 setfont (that would violate locking order, then reacquiring all the necessary locks in the right order. It is) justify grestore 92.345 362.7839 moveto gsave font0 setfont (far simpler to fork the painting processes, unwind the adjuster completely and let the painters) justify grestore 92.345 350.7389 moveto font0 setfont (acquire the locks that they need in separate processes.) show 92.345 331.2949 moveto gsave font0 setfont (Another case of deadlock avoidance is forking the callbacks from a service module to a client) justify grestore 92.345 319.2498 moveto gsave font0 setfont (module. Forking permits the service thread to proceed, eventually releasing locks it holds that) justify grestore 92.345 307.2048 moveto gsave font0 setfont (will be needed by the client. The fork also insulates the service from things that may go wrong in) justify grestore 92.345 295.1597 moveto gsave font0 setfont (the client callback. For instance, Cedar permits clients to register callback procedures with the) justify grestore 92.345 283.1148 moveto gsave font0 setfont (garbage collector that are called to finalize \050clean up\051 data structures. The finalization service) justify grestore 92.345 271.0698 moveto font0 setfont (thread forks each callback.) show 82.3075 245.1444 moveto font1 setfont (4.5 Task rejuvenation) show 92.345 219.219 moveto gsave font0 setfont (Sometimes threads get into bad states, such as arise from uncaught exceptions or stack overflow,) justify grestore 92.345 207.1739 moveto gsave font0 setfont (from which recovery is impossible within the thread itself. In many cases, however, cleanup and) justify grestore 92.345 195.1289 moveto gsave font0 setfont (recovery is possible if a new \042task rejuvenation\042 thread is forked. For uncaught errors, an) justify grestore 92.345 183.084 moveto gsave font0 setfont (exception handler may simply fork a new copy of the service. For stack overflow, a new thread is) justify grestore 92.345 171.0389 moveto gsave font0 setfont (forked to report the stack overflow. Using threads for task rejuvenation can be tricky and is a bit) justify grestore 92.345 158.9939 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (counter-intuitive \050This thread is in trouble. Ok let's make ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (two ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (of them!\051 However, it is a) 2 buf opsaft 2 null put mixedjustify grestore 92.345 146.949 moveto gsave font0 setfont (paradigm that adds significantly to the robustness of our systems and its use is growing. A recent) justify grestore 92.345 134.904 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (addition is a task-rejuvenating ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (that was added to the input event dispatcher in Cedar. The) 2 buf opsaft 2 null put mixedjustify grestore 92.345 122.859 moveto gsave font0 setfont (dispatcher makes unforked callbacks to client procedures because \050a\051 this code is on the critical) justify grestore 92.345 110.814 moveto gsave font0 setfont (path for user-visible performance and \050b\051 most callbacks are very short \050e.g. enqueue an event\051) justify grestore 92.345 98.76895 moveto gsave font0 setfont (and so a fork overhead would be significant. But not forking makes the dispatcher vulnerable to) justify grestore 92.345 86.72391 moveto gsave font0 setfont (uncaught runtime errors that occur in the callbacks. Using task rejuvenation, the new copy of the) justify grestore grestore grestore % end page 13 showpage %%page 14 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.759 746.79 moveto (14) show 92.345 713.8666 moveto font0 setfont (dispatcher keeps running.) show 92.345 693.9067 moveto gsave font0 setfont (Task rejuvenation is a controversial paradigm. It's ability to mask underlying design problems) justify grestore 92.345 681.8615 moveto font0 setfont (suggests that it be used with caution.) show 82.3075 655.248 moveto font1 setfont (4.6 Serializers) show 92.345 628.6342 moveto gsave font0 setfont (A serializer is a queue and a thread that processes the work on the queue. The queue acts as a) justify grestore 92.345 616.5893 moveto gsave font0 setfont (point of serialization in the system. The primary example is in the window system where input) justify grestore 92.345 604.5443 moveto gsave font0 setfont (events can arrive from a number of different sources. They are handled by a single thread in order) justify grestore 92.345 592.4993 moveto gsave font0 setfont (to preserve their ordering. This same paradigm is present in most other window systems and in) justify grestore 92.345 580.4545 moveto gsave font0 setfont (many cases it is the only paradigm. In the Macintosh, Microsoft Windows, and X programming) justify grestore 92.345 568.4095 moveto gsave font0 setfont (models, for example, each application runs in a serializer thread that pulls events from a queue) justify grestore 92.345 556.3644 moveto font0 setfont (associated with the application's window.) show 82.3075 529.7507 moveto font1 setfont (4.7 Concurrency exploiters) show 92.345 503.137 moveto gsave font0 setfont (Concurrency exploiters are threads created specifically to make use of multiple processors. They) justify grestore 92.345 491.092 moveto gsave font0 setfont (tend to be very problem-specific in their details. Since our systems have only relatively recently) justify grestore 92.345 479.0468 moveto gsave font0 setfont (begun to run on multiprocessors we were not surprised to find very few concurrency exploiters in) justify grestore 92.345 467.0019 moveto font0 setfont (them. ) show 82.3075 440.3882 moveto font1 setfont (4.8 Encapsulated forks) show 92.345 413.7745 moveto gsave font0 setfont (One way that our systems promote use of common thread paradigms is by providing modules that) justify grestore 92.345 401.7293 moveto gsave font0 setfont (encapsulate the paradigms. This section describes three such packages used frequently in our) justify grestore 92.345 389.6844 moveto font0 setfont (systems. ) show 92.345 363.0707 moveto font9 setfont (DelayedFork and PeriodicalFork) show 102.3825 336.4572 moveto /colwidth 436.8696 def gsave font0 setfont (DelayedFork expresses the paradigm of a one-shot. It calls a procedure at some time in the) justify grestore 102.3825 324.412 moveto gsave font0 setfont (future. Although one-shots are common in our system, DelayedFork is only used in our) justify grestore 102.3825 312.3671 moveto font0 setfont (window systems. \050Its limited use might be because it appeared only recently.\051) show 102.3825 292.4068 moveto gsave font0 setfont (PeriodicalFork is simply a DelayedFork that repeats over and over again at fixed intervals. It) justify grestore 102.3825 280.3617 moveto gsave font0 setfont (encapsulates the sleeper paradigm where the wakeups are prompted solely by the passage of) justify grestore 102.3825 268.3167 moveto font0 setfont (time. ) show 92.345 241.703 moveto font9 setfont (MBQueue) show 102.3825 215.0893 moveto gsave font0 setfont (The module MBQueue \050the name means Menu/Button Queue\051 encapsulates the serializer) justify grestore 102.3825 203.0442 moveto gsave font0 setfont (paradigm in our systems. MBQueue creates a queue as a serialization context and a thread to) justify grestore 102.3825 190.9993 moveto gsave font0 setfont (process it. Mouse clicks and key strokes cause procedures to be enqueued for the context: the) justify grestore 102.3825 178.9543 moveto font0 setfont (thread then calls the procedures in the order received. ) show 102.3825 158.994 moveto gsave font0 setfont (We consider a queue together with a thread processing it an important building block of user) justify grestore 102.3825 146.949 moveto gsave font0 setfont (interfaces. This is borne out by the fact that our system actually contains several minor) justify grestore 102.3825 134.904 moveto gsave font0 setfont (variations of MBQueue. Why is there not a more general package? It seems that each instance) justify grestore 102.3825 122.859 moveto gsave font0 setfont (adds serialization to a specific interface already familiar to the programmer. Furthermore, the) justify grestore 102.3825 110.814 moveto gsave font0 setfont (serialization is often on a critical interactive performance path. Keeping a familiar interface to) justify grestore 102.3825 98.76902 moveto gsave font0 setfont (the programmer and reducing latency cause new variations to be preferred over a single) justify grestore 102.3825 86.72403 moveto font0 setfont (generic implementation.) show grestore grestore % end page 14 showpage %%page 15 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (15) show 92.345 713.8666 moveto font9 setfont (Miscellaneous) show 102.3825 689.7769 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (Many modules that do callbacks offer a ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (fork) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( boolean parameter in their interface, indicating) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 677.7319 moveto gsave font0 setfont (whether or not the called-back procedure is to be called directly or in a forked thread. The) justify grestore 102.3825 665.6869 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (default is almost always ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (TRUE) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (, meaning the callback will be forked. Unforked callbacks are) 2 buf opsaft 2 null put mixedjustify grestore 102.3825 653.6418 moveto gsave font0 setfont (usually intended for experts, because they make future execution of the calling thread within) justify grestore 102.3825 641.5968 moveto font0 setfont (the module dependent on successful completion of the client callback. ) show 82.3075 617.507 moveto font1 setfont (4.9 Paradigm summary) show 92.345 593.417 moveto /colwidth 446.907 def gsave font0 setfont (Table 4 summarizes the absolute and relative frequencies of the paradigms in our systems. Note) justify grestore 92.345 581.372 moveto gsave font0 setfont (that in keeping with our emphasis on using threads as program structuring devices this is a static) justify grestore 92.345 569.327 moveto gsave font0 setfont (count. \050Threads may be counted in more than one category because they change their behavior.\051) justify grestore 92.345 557.282 moveto gsave font0 setfont (Some threads seem not to fit easily into any category. These are captured in the \042Unknown or) justify grestore 92.345 545.2368 moveto font0 setfont (other\042 entries.) show 216.2592 527.1695 moveto font1 setfont (Table 4. Static Counts, Cedar and GVX) show 92.345 509.102 moveto font0 setfont 44.60656 0.0 rmoveto font1 setfont 44.60656 0.0 rmoveto 44.60656 0.0 rmoveto ( Cedar ) show 44.60253 0.0 rmoveto ( GVX ) show font0 setfont 8.919297 0.0 rmoveto 92.345 491.0344 moveto font1 setfont (Defer work) show font0 setfont 31.77564 0.0 rmoveto 44.60656 0.0 rmoveto ( 108) show 25.64575 0.0 rmoveto ( 31%) show 20.62802 0.0 rmoveto ( 77) show 26.7619 0.0 rmoveto ( 33%) show 22.85836 0.0 rmoveto 92.345 478.9894 moveto font1 setfont (Pumps) show font0 setfont 8.917294 0.0 rmoveto 92.345 466.9444 moveto font1 setfont ( General pumps) show font0 setfont 2.779373 0.0 rmoveto ( ) show 37.91559 0.0 rmoveto ( 48) show 28.99225 0.0 rmoveto ( 14%) show 20.62802 0.0 rmoveto ( 33) show 26.7619 0.0 rmoveto (14%) show 25.08869 0.0 rmoveto 92.345 454.8995 moveto font1 setfont ( Slack processes) show font0 setfont ( ) show 42.36618 0.0 rmoveto ( 7) show 27.87809 0.0 rmoveto ( 2%) show 19.51385 0.0 rmoveto ( 2) show 25.64775 0.0 rmoveto ( 1%) show 26.20485 0.0 rmoveto 92.345 442.8546 moveto font1 setfont (Sleepers) show font0 setfont 45.71572 0.0 rmoveto 44.60656 0.0 rmoveto ( 67) show 26.7619 0.0 rmoveto ( 19%) show 20.62802 0.0 rmoveto ( 15) show 26.7619 0.0 rmoveto ( 6%) show 26.20485 0.0 rmoveto 92.345 430.8095 moveto font1 setfont (Oneshots) show font0 setfont 41.81313 0.0 rmoveto 44.60656 0.0 rmoveto ( 25) show 26.7619 0.0 rmoveto ( 7%) show 19.51385 0.0 rmoveto ( 11) show 26.7619 0.0 rmoveto ( 5%) show 92.345 418.7644 moveto font1 setfont (Deadlock avoidance) show font0 setfont 30.65544 0.0 rmoveto ( 35) show 26.7619 0.0 rmoveto ( 10%) show 20.62802 0.0 rmoveto ( 6) show 27.87809 0.0 rmoveto ( 3%) show 26.20485 0.0 rmoveto 92.345 406.7193 moveto font1 setfont (Task rejuvenation) show font0 setfont 41.25103 0.0 rmoveto ( 11) show 26.7619 0.0 rmoveto ( 3%) show 21.74419 0.0 rmoveto ( 0) show 27.87809 0.0 rmoveto ( 0%) show 26.20485 0.0 rmoveto 92.345 394.6744 moveto font1 setfont (Serializers) show font0 setfont 35.12216 0.0 rmoveto 44.60656 0.0 rmoveto ( 5) show 27.87809 0.0 rmoveto ( 1%) show 23.97452 0.0 rmoveto ( 7) show 27.87809 0.0 rmoveto ( 3%) show 26.20485 0.0 rmoveto 92.345 382.6293 moveto font1 setfont (Encapsulated) show font0 setfont ( ) show font1 setfont (fork) show font0 setfont ( ) show 37.34643 0.0 rmoveto ( 14) show 28.99225 0.0 rmoveto ( 4%) show 23.97452 0.0 rmoveto ( 5) show 27.87809 0.0 rmoveto ( 2%) show 26.20485 0.0 rmoveto 92.345 370.5844 moveto font0 setfont 44.60656 0.0 rmoveto 92.345 358.5394 moveto font1 setfont (Concurrency exploiters) show font0 setfont 13.92497 0.0 rmoveto ( 3) show 27.87809 0.0 rmoveto ( 1%) show 23.97452 0.0 rmoveto ( 0) show 27.87809 0.0 rmoveto ( 0%) show 92.345 346.4942 moveto font1 setfont (Unknown or other) show font10 setfont 0.0 4.015 rmoveto (2) show 0.0 -4.015 rmoveto font0 setfont 36.23148 0.0 rmoveto ( 25) show 26.7619 0.0 rmoveto ( 7%) show 23.97452 0.0 rmoveto ( 78) show 26.7619 0.0 rmoveto (33%) show 25.08869 0.0 rmoveto 92.345 328.4268 moveto font1 setfont (TOTAL) show font0 setfont 6.130904 0.0 rmoveto 44.60656 0.0 rmoveto 44.60656 0.0 rmoveto (348) show 27.87608 0.0 rmoveto (100%) show 19.51185 0.0 rmoveto (234 100% ) show 92.345 310.3594 moveto gsave font0 setfont (Our categories seem to apply well to other systems. For instance, Lampson and Redell describe) justify grestore 92.345 298.3143 moveto gsave font0 setfont (the applications Pilot, Violet and Gateway \050which although Mesa-based share no code with the) justify grestore 92.345 286.2692 moveto gsave font0 setfont (systems we examined\051, but do not identify general types of threads [Lampson80]. Yet from the) justify grestore 92.345 274.2243 moveto font0 setfont (published description one can deduce the following:) show 122.4575 260.1719 moveto font0 setfont (Pilot: almost all sleepers.) show 122.4575 246.1194 moveto font0 setfont (Violet: sleepers, one-shots and work deferral.) show 122.4575 232.0668 moveto font0 setfont (Gateway: sleepers and pumps.) show 72.26999 183.8868 moveto font8 setfont (5. Issues in thread use ) show 82.3075 159.7968 moveto /colwidth 456.9444 def gsave font0 setfont (Given a modern platform providing threads, system builders have the option of using thread) justify grestore 92.345 114.8291 moveto font0 setfont currentpoint /undery exch def /underx exch def ( ) show 1.0 setlinewidth currentpoint currentpoint pop undery 1.2 sub dup underx exch vec moveto 92.345 98.76906 moveto /colwidth 446.907 def gsave font10 setfont opsbef 0 {font10 setfont 0.0 4.015 rmoveto} put (2) 0 buf opsaft 0 null put font0 setfont opsbef 1 {0.0 -4.015 rmoveto font0 setfont} put (The large number of unknown threads in GVX is due to our unfamiliarity with this code, rather) 1 buf opsaft 1 null put mixedjustify grestore 92.345 86.72406 moveto font0 setfont (reflecting any significant difference in paradigm use.) show grestore grestore % end page 15 showpage %%page 16 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (16) show 82.3075 713.8666 moveto /colwidth 456.9444 def gsave font0 setfont (primitives to accomplish tasks that they would have used other techniques to accomplish on other) justify grestore 82.3075 701.8220 moveto gsave font0 setfont (platforms. The designer must balance the modest cost of creating a thread against the benefits in) justify grestore 82.3075 689.7769 moveto gsave font0 setfont (structural simplification and concurrency that would accrue from its introduction. In addition to) justify grestore 82.3075 677.7321 moveto gsave font0 setfont (the cost of creating it, a thread incurs a modest ongoing cost for the virtual memory occupied by its) justify grestore 82.3075 665.687 moveto gsave font0 setfont (stack. Our PCR thread implementation allocates virtual memory for the maximum possible stack) justify grestore 82.3075 653.642 moveto gsave font0 setfont (size of each thread. If there is very little state associated with a thread this may be a very) justify grestore 82.3075 641.597 moveto font0 setfont (inefficient use of memory [Draves91]. ) show 82.3075 600.1851 moveto font1 setfont (5.1 Easy thread uses ) show 92.345 558.7734 moveto /colwidth 446.907 def gsave font0 setfont (Our programmers have become very adept at using the sleeper, oneshot, pump \050in paths without) justify grestore 92.345 546.7284 moveto gsave font0 setfont (critical timing constraints\051 and work deferrer paradigms. For the most part these require little) justify grestore 92.345 534.6834 moveto gsave font0 setfont (interaction between threads beyond taking care to provide mutual exclusion \050monitors\051 for) justify grestore 92.345 522.6383 moveto gsave font0 setfont (shared data. Pump threads interact with threads on either side of them in pipelines, but the) justify grestore 92.345 510.5932 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (interactions generally follow well-known producer-consumer patterns. Using ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( to create) 2 buf opsaft 2 null put mixedjustify grestore 92.345 498.5484 moveto gsave font0 setfont (sleeper threads has fallen into disfavor with the advent of PCR thread implementation: 100) justify grestore 92.345 486.5034 moveto gsave font0 setfont (kilobytes for each of hundreds of sleepers' stacks is just too expensive. The PeriodicalProcess for) justify grestore 92.345 474.4584 moveto gsave font0 setfont (timeout driven sleepers and other sleeper encapsulations often can accomplish the same thing) justify grestore 92.345 462.4132 moveto font0 setfont (using closures to maintain the little bit of state necessary between activations. ) show 92.345 431.3544 moveto gsave font0 setfont (Deadlock avoiders also are usually very simple, but the overall locking schemes in which they are) justify grestore 92.345 419.3095 moveto font0 setfont (involved are often very, very complicated \050and far beyond the scope of this paper\051. ) show 82.3075 377.8976 moveto font1 setfont (5.2 Hard thread uses ) show 92.345 336.4857 moveto gsave font0 setfont (Some of the thread paradigms seem much more difficult. First, there is little guidance in the) justify grestore 92.345 324.4406 moveto gsave font0 setfont (literature and in our experience for using concurrency exploiters in interactive systems. The) justify grestore 92.345 312.3957 moveto gsave font0 setfont (arrival of relatively low-cost workstations and operating systems supporting multiprocessing) justify grestore 92.345 300.3506 moveto font0 setfont (offers new incentives to understand this paradigm better. ) show 92.345 269.2918 moveto gsave font0 setfont (Second, designing slack processes and other pumps in paths with timing constraints continues to) justify grestore 92.345 257.2468 moveto gsave font0 setfont (challenge both the slack process implementors and the PCR implementors. Bad performance in) justify grestore 92.345 245.2018 moveto gsave font0 setfont (the pipelines that provide feedback for typing \050character echoing\051 and mouse motion is) justify grestore 92.345 233.1568 moveto font0 setfont (immediately apparent to the user, yet improving the performance is often very difficult. ) show 92.345 202.0979 moveto gsave font0 setfont (The buffer thread of Figure 1 and Section 3.2 is an example of a poorly performing slack) justify grestore 92.345 190.053 moveto gsave font0 setfont (process--though it's supposed to introduce slack in sending requests to X server, it is not doing so) justify grestore 92.345 178.008 moveto font0 setfont (because when it tries to yield the processor, as the highest priority thread it gets it right back. ) show 92.345 146.949 moveto gsave font0 setfont (Fixing the problem by lowering the priority of the buffer thread is clearly wrong, since that could) justify grestore 92.345 134.9041 moveto gsave font0 setfont (cause starvation of screen painting. We believe that the architecture of having a producer thread) justify grestore 92.345 122.8591 moveto gsave font0 setfont (notify a consumer \050buffer\051 thread periodically of work to do is a good one, so we did not consider) justify grestore 92.345 110.8141 moveto gsave font0 setfont (changing the basic paradigm by which these two threads interact. Rewriting the buffer thread to) justify grestore 92.345 98.76908 moveto gsave font0 setfont (simply sleep waiting for a timeout before sending its events doesn't work either, for reasons) justify grestore 92.345 86.72408 moveto font0 setfont (discussed in Section 6.3.) show grestore grestore % end page 16 showpage %%page 17 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (17) show 138.5052 123.8657 moveto gsave currentpoint translate 2834.645 dup matrix scale concat gsave 3.527776e-4 dup matrix scale concat gsave 331.28 -61.54845 matrix translate concat 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -321.1688 188.0466 moveto -317.1688 188.0466 lineto -317.1688 617.3424 lineto -321.1688 617.3424 lineto clip newpath 0.4 0.4 0.4 setrgbcolor 2.0 setlinewidth 0 setlinecap 1 setlinejoin -319.1688 190.0466 -319.1688 615.3425 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -291.9067 187.8862 moveto -287.9067 187.8862 lineto -287.9067 618.851 lineto -291.9067 618.851 lineto clip newpath 0.4 0.4 0.4 setrgbcolor 2.0 setlinewidth 0 setlinecap 1 setlinejoin -289.9067 189.8862 -289.9067 616.8511 vec grestore grestore 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.606 0.52 setrgbcolor -289.9067 189.8862 -289.9067 317.7231 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 192.0926 -289.9067 220.9146 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 299.2439 -289.9067 316.2062 vec 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -199.2889 187.8862 moveto -195.2889 187.8862 lineto -195.2889 618.4234 lineto -199.2889 618.4234 lineto clip newpath 0.4 0.4 0.4 setrgbcolor 2.0 setlinewidth 0 setlinecap 1 setlinejoin -197.2889 189.8862 -197.2889 616.4234 vec grestore grestore 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 577.9482 -197.2889 616.4234 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 577.9482 -197.2889 577.9482 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 459.2125 -197.2889 545.6786 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 459.2125 -197.2889 459.2125 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 391.3636 -197.2889 429.0119 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 391.3636 -197.2889 391.3636 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 213.4679 -197.2889 353.716 vec 5.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -197.2889 213.4679 -197.2889 213.4679 vec 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -239.9018 178.7574 moveto -231.9018 178.7574 lineto -231.9018 620.8508 lineto -239.9018 620.8508 lineto clip newpath 0.88 0.52 0.52 setrgbcolor 6.0 setlinewidth 0 setlinecap 1 setlinejoin -235.9018 182.7574 -235.9018 616.8511 vec grestore grestore 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 563.8818 -235.9018 582.9123 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 488.5862 -235.9018 509.6854 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 430.6666 -235.9018 486.1040 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 365.7143 -235.9018 396.7421 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 220.9146 -235.9018 301.5884 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -235.9018 193.1961 -235.9018 218.8462 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 590.7732 -197.2889 618.0781 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 582.9123 -197.2889 584.9812 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 519.201 -197.2889 547.7466 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 486.1040 -197.2889 488.5862 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 402.5342 -197.2889 430.6666 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 396.7421 -197.2889 398.8106 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 311.1037 -197.2889 353.716 vec 9.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -197.2889 218.8462 -197.2889 220.9146 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.606 0.52 setrgbcolor -197.2889 189.8862 -197.2889 191.1275 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 580.9818 -245.5551 580.9818 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 580.9818 -235.9018 580.9818 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 487.3451 -245.5551 487.3451 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 487.3451 -235.9018 487.3451 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 396.4662 -245.5551 396.4662 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 396.4662 -235.9018 396.4662 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 216.0879 -245.5551 216.0879 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -235.9018 216.0879 -235.9018 216.0879 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 582.4988 -206.942 582.4988 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 582.4988 -197.2889 582.4988 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 485.9661 -206.942 485.9661 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 485.9661 -197.2889 485.9661 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 400.4656 -206.942 400.4656 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 400.4656 -197.2889 400.4656 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 220.5008 -206.942 220.5008 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.8 0.0 setrgbcolor -197.2889 220.5008 -197.2889 220.5008 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 576.9825 -201.4258 576.9825 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 576.9825 -234.5227 576.9825 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 460.04 -201.4258 460.04 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 460.04 -234.5227 460.04 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -237.2809 393.7084 -201.4258 393.7084 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -237.2809 393.7084 -237.2809 393.7084 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 212.916 -201.4258 212.916 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -234.5227 212.916 -234.5227 212.916 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 603.1844 -191.7727 603.1844 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 561.8135 -191.7727 561.8135 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 520.4419 -191.7727 520.4419 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 479.0708 -191.7727 479.0708 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 437.6996 -191.7727 437.6996 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 396.3284 -191.7727 396.3284 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 354.9572 -191.7727 354.9572 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 313.5862 -191.7727 313.5862 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 272.2149 -191.7727 272.2149 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 230.8437 -191.7727 230.8437 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 setgray -177.9822 189.4725 -191.7727 189.4725 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 596.3116 -319.1688 615.3425 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 596.3116 -319.1688 596.3116 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 525.1532 -319.1688 544.5974 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 525.1532 -319.1688 525.1532 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 468.061 -319.1688 480.8857 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 468.061 -319.1688 468.061 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 408.4861 -319.1688 427.9306 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 408.4861 -319.1688 408.4861 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 318.7108 -319.1688 352.6354 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -319.1688 318.7108 -319.1688 318.7108 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 587.05 -289.9067 595.3243 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 587.05 -289.9067 587.05 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 544.4375 -289.9067 586.2222 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 544.4375 -289.9067 544.4375 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 482.3806 -289.9067 524.1653 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 482.3806 -289.9067 482.3806 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 427.7709 -289.9067 462.1087 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 427.7709 -289.9067 427.7709 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 352.475 -289.9067 407.0851 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -289.9067 352.475 -289.9067 352.475 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 602.103 -328.8218 602.103 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 602.103 -319.1688 602.103 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 600.5862 -328.8218 600.5862 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 600.5862 -319.1688 600.5862 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 600.1729 -328.8218 600.1729 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 600.1729 -319.1688 600.1729 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 599.7586 -328.8218 599.7586 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 599.7586 -319.1688 599.7586 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 598.7937 -328.8218 598.7937 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 598.7937 -319.1688 598.7937 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 544.5974 -328.8218 544.5974 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 544.5974 -319.1688 544.5974 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 544.1836 -328.8218 544.1836 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 544.1836 -319.1688 544.1836 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 540.3226 -328.8218 540.3226 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 540.3226 -319.1688 540.3226 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 537.5645 -328.8218 537.5645 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 537.5645 -319.1688 537.5645 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 536.1855 -328.8218 536.1855 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 536.1855 -319.1688 536.1855 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 531.7725 -328.8218 531.7725 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 531.7725 -319.1688 531.7725 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 527.7734 -328.8218 527.7734 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 527.7734 -319.1688 527.7734 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 527.2218 -328.8218 527.2218 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 527.2218 -319.1688 527.2218 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 526.8082 -328.8218 526.8082 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 526.8082 -319.1688 526.8082 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 526.394 -328.8218 526.394 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 526.394 -319.1688 526.394 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 480.3344 -328.8218 480.3344 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 480.3344 -319.1688 480.3344 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 479.9208 -328.8218 479.9208 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 479.9208 -319.1688 479.9208 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 476.8867 -328.8218 476.8867 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 476.8867 -319.1688 476.8867 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 473.0256 -328.8218 473.0256 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 473.0256 -319.1688 473.0256 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 470.2676 -328.8218 470.2676 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 470.2676 -319.1688 470.2676 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 469.8533 -328.8218 469.8533 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 469.8533 -319.1688 469.8533 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 471.7844 -328.8218 471.7844 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 471.7844 -319.1688 471.7844 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 471.3708 -328.8218 471.3708 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 471.3708 -319.1688 471.3708 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 429.5858 -328.8218 429.5858 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 429.5858 -319.1688 429.5858 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 425.7245 -328.8218 425.7245 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 425.7245 -319.1688 425.7245 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 425.3104 -328.8218 425.3104 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 425.3104 -319.1688 425.3104 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 422.9661 -328.8218 422.9661 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 422.9661 -319.1688 422.9661 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 413.3133 -328.8218 413.3133 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 413.3133 -319.1688 413.3133 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 410.1412 -328.8218 410.1412 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 410.1412 -319.1688 410.1412 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.7276 -328.8218 409.7276 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.7276 -319.1688 409.7276 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.314 -328.8218 409.314 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.314 -319.1688 409.314 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.1757 -328.8218 409.1757 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 409.1757 -319.1688 409.1757 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 350.0152 -328.8218 350.0152 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 350.0152 -319.1688 350.0152 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 349.0498 -328.8218 349.0498 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 349.0498 -319.1688 349.0498 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 348.6361 -328.8218 348.6361 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 348.6361 -319.1688 348.6361 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 347.1192 -328.8218 347.1192 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 347.1192 -319.1688 347.1192 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 344.7747 -328.8218 344.7747 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -319.1688 344.7747 -319.1688 344.7747 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 324.503 -328.8218 324.503 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 324.503 -319.1688 324.503 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 322.1586 -328.8218 322.1586 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 322.1586 -319.1688 322.1586 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 321.7449 -328.8218 321.7449 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 321.7449 -319.1688 321.7449 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 320.3658 -328.8218 320.3658 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 320.3658 -319.1688 320.3658 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 319.9518 -328.8218 319.9518 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -319.1688 319.9518 -319.1688 319.9518 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 592.152 -299.56 592.152 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 592.152 -289.9067 592.152 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 593.2551 -299.56 593.2551 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 593.2551 -289.9067 593.2551 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 590.2216 -299.56 590.2216 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 590.2216 -289.9067 590.2216 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 589.2564 -299.56 589.2564 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 589.2564 -289.9067 589.2564 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 590.3594 -299.56 590.3594 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 590.3594 -289.9067 590.3594 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 586.36 -299.56 586.36 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 586.36 -289.9067 586.36 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 583.3261 -299.56 583.3261 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 583.3261 -289.9067 583.3261 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 582.9123 -299.56 582.9123 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 582.9123 -289.9067 582.9123 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 581.3956 -299.56 581.3956 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 581.3956 -289.9067 581.3956 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 577.3962 -299.56 577.3962 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 577.3962 -289.9067 577.3962 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 574.0865 -299.56 574.0865 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 574.0865 -289.9067 574.0865 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 567.1914 -299.56 567.1914 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 567.1914 -289.9067 567.1914 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 563.606 -299.56 563.606 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 563.606 -289.9067 563.606 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 563.1924 -299.56 563.1924 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 563.1924 -289.9067 563.1924 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 562.227 -299.56 562.227 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 562.227 -289.9067 562.227 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 561.8135 -299.56 561.8135 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 561.8135 -289.9067 561.8135 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 561.6754 -299.56 561.6754 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 561.6754 -289.9067 561.6754 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 559.4691 -299.56 559.4691 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 559.4691 -289.9067 559.4691 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 559.055 -299.56 559.055 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 559.055 -289.9067 559.055 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 560.572 -299.56 560.572 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 560.572 -289.9067 560.572 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 558.7796 -299.56 558.7796 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 558.7796 -289.9067 558.7796 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 554.918 -299.56 554.918 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 554.918 -289.9067 554.918 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 555.1935 -299.56 555.1935 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 555.1935 -289.9067 555.1935 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 552.1603 -299.56 552.1603 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 552.1603 -289.9067 552.1603 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 553.677 -299.56 553.677 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 553.677 -289.9067 553.677 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 553.2632 -299.56 553.2632 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 553.2632 -289.9067 553.2632 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 551.3325 -299.56 551.3325 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 551.3325 -289.9067 551.3325 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 550.919 -299.56 550.919 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 550.919 -289.9067 550.919 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 549.1265 -299.56 549.1265 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 549.1265 -289.9067 549.1265 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 546.5059 -299.56 546.5059 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 546.5059 -289.9067 546.5059 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 521.6829 -299.56 521.6829 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 521.6829 -289.9067 521.6829 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.0633 -299.56 519.0633 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.0633 -289.9067 519.0633 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.6144 -299.56 519.6144 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.6144 -289.9067 519.6144 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.201 -299.56 519.201 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 519.201 -289.9067 519.201 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 514.9259 -299.56 514.9259 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 514.9259 -289.9067 514.9259 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.9608 -299.56 513.9608 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.9608 -289.9067 513.9608 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.8226 -299.56 513.8226 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.8226 -289.9067 513.8226 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.4091 -299.56 513.4091 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 513.4091 -289.9067 513.4091 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 512.0298 -299.56 512.0298 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 512.0298 -289.9067 512.0298 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 512.3056 -299.56 512.3056 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 512.3056 -289.9067 512.3056 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 511.8919 -299.56 511.8919 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 511.8919 -289.9067 511.8919 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 509.2716 -299.56 509.2716 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 509.2716 -289.9067 509.2716 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 509.548 -299.56 509.548 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 509.548 -289.9067 509.548 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 506.1 -299.56 506.1 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 506.1 -289.9067 506.1 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 505.6866 -299.56 505.6866 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 505.6866 -289.9067 505.6866 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 504.0317 -299.56 504.0317 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 504.0317 -289.9067 504.0317 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 488.9997 -299.56 488.9997 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 488.9997 -289.9067 488.9997 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 486.7935 -299.56 486.7935 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 486.7935 -289.9067 486.7935 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 486.38 -299.56 486.38 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 486.38 -289.9067 486.38 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 487.7586 -299.56 487.7586 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 487.7586 -289.9067 487.7586 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 460.4538 -299.56 460.4538 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 460.4538 -289.9067 460.4538 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 449.973 -299.56 449.973 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 449.973 -289.9067 449.973 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 448.1805 -299.56 448.1805 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 448.1805 -289.9067 448.1805 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 429.839 -299.56 429.839 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 429.839 -289.9067 429.839 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 430.5288 -299.56 430.5288 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 430.5288 -289.9067 430.5288 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 407.4989 -299.56 407.4989 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 407.4989 -289.9067 407.4989 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 402.6719 -299.56 402.6719 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 402.6719 -289.9067 402.6719 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 403.3617 -299.56 403.3617 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 403.3617 -289.9067 403.3617 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 402.948 -299.56 402.948 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 402.948 -289.9067 402.948 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 399.0867 -299.56 399.0867 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 399.0867 -289.9067 399.0867 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 398.9485 -299.56 398.9485 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 398.9485 -289.9067 398.9485 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 401.2931 -299.56 401.2931 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 401.2931 -289.9067 401.2931 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 400.8793 -299.56 400.8793 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 400.8793 -289.9067 400.8793 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 396.88 -299.56 396.88 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 396.88 -289.9067 396.88 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 394.1221 -299.56 394.1221 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 394.1221 -289.9067 394.1221 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 383.2276 -299.56 383.2276 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 383.2276 -289.9067 383.2276 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 380.6076 -299.56 380.6076 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 380.6076 -289.9067 380.6076 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 365.0242 -299.56 365.0242 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 365.0242 -289.9067 365.0242 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 364.6107 -299.56 364.6107 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 364.6107 -289.9067 364.6107 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 364.059 -299.56 364.059 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 364.059 -289.9067 364.059 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 363.6452 -299.56 363.6452 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 363.6452 -289.9067 363.6452 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 363.0938 -299.56 363.0938 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 363.0938 -289.9067 363.0938 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.7145 -299.56 361.7145 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.7145 -289.9067 361.7145 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.9905 -299.56 361.9905 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.9905 -289.9067 361.9905 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.5765 -299.56 361.5765 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 361.5765 -289.9067 361.5765 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 358.9565 -299.56 358.9565 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 358.9565 -289.9067 358.9565 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 358.8188 -299.56 358.8188 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 358.8188 -289.9067 358.8188 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 354.9572 -299.56 354.9572 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 354.9572 -289.9067 354.9572 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 352.1992 -299.56 352.1992 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 352.1992 -289.9067 352.1992 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 316.2062 -299.56 316.2062 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 316.2062 -289.9067 316.2062 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 313.8617 -299.56 313.8617 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 313.8617 -289.9067 313.8617 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 311.242 -299.56 311.242 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 311.242 -289.9067 311.242 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 311.1039 -299.56 311.1039 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 311.1039 -289.9067 311.1039 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.6902 -299.56 310.6902 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.6902 -289.9067 310.6902 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.5523 -299.56 310.5523 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.5523 -289.9067 310.5523 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.0006 -299.56 310.0006 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 310.0006 -289.9067 310.0006 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 306.1394 -299.56 306.1394 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 306.1394 -289.9067 306.1394 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 305.7258 -299.56 305.7258 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 305.7258 -289.9067 305.7258 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 304.7603 -299.56 304.7603 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 304.7603 -289.9067 304.7603 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 304.2085 -299.56 304.2085 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 304.2085 -289.9067 304.2085 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 303.2434 -299.56 303.2434 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 303.2434 -289.9067 303.2434 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 302.8296 -299.56 302.8296 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 302.8296 -289.9067 302.8296 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 302.4158 -299.56 302.4158 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 302.4158 -289.9067 302.4158 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.2439 -299.56 299.2439 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.2439 -289.9067 299.2439 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.9338 -299.56 299.9338 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.9338 -289.9067 299.9338 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.5198 -299.56 299.5198 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 299.5198 -289.9067 299.5198 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 220.225 -299.56 220.225 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 220.225 -289.9067 220.225 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 221.3285 -299.56 221.3285 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 221.3285 -289.9067 221.3285 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 220.9146 -299.56 220.9146 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 220.9146 -289.9067 220.9146 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 216.5018 -299.56 216.5018 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 216.5018 -289.9067 216.5018 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 213.33 -299.56 213.33 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 213.33 -289.9067 213.33 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 210.9857 -299.56 210.9857 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 210.9857 -289.9067 210.9857 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 209.6064 -299.56 209.6064 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -289.9067 209.6064 -289.9067 209.6064 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 193.058 -299.56 193.058 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 193.058 -289.9067 193.058 vec 0.1 setlinewidth 0 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 192.0926 -299.56 192.0926 vec 0.1 setlinewidth 1 setlinecap 1 setlinejoin 0.0 0.0 0.8 setrgbcolor -289.9067 192.0926 -289.9067 192.0926 vec gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -149.2114 170.1534 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.0s) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -149.2114 583.2317 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.10) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -149.2114 376.3756 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (0.05) show grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 321.8884 30.29562 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 98.17142 423.9844 moveto /colwidth 257.9265 def gsave font13 setfont (In this diagram YieldButNotToMe succeeds more often in) justify grestore 98.17142 411.9394 moveto gsave font13 setfont (handing the virtual processor \050and the real processor\051 back) justify grestore 98.17142 399.8944 moveto gsave font13 setfont (to the image thread. Consequently there are fewer thread) justify grestore 98.17142 387.8493 moveto gsave font13 setfont (switches, fewer process switches, more merges in the buffer) justify grestore 98.17142 375.8044 moveto font13 setfont (thread, and less total work done in the X server.) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray -44.48594 123.7346 moveto -124.3166 123.7346 lineto -124.3166 401.5188 lineto -44.48594 401.5188 lineto -44.48594 123.7346 lineto closepath stroke grestore 0.8 0.8 0.0 setrgbcolor eofill gsave gsave 0.0 0.0 moveto currentpoint translate -198.7889 219.4145 moveto -122.8164 219.4145 lineto -122.8164 403.0188 lineto -198.7889 403.0188 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin -124.3166 401.5188 -197.2889 220.9146 vec grestore grestore 0.0 0.8 0.0 setrgbcolor eofill gsave gsave 0.0 0.0 moveto currentpoint translate -198.7889 400.0188 moveto -122.8164 400.0188 lineto -122.8164 487.4661 lineto -198.7889 487.4661 lineto clip newpath 0.5 setgray 1.0 setlinewidth 1 setlinecap 1 setlinejoin -124.3166 401.5188 -197.2889 485.9661 vec grestore grestore gsave font15 setfont 0.0 setgray 16.9 dup matrix scale 90.0 matrix rotate -27.22758 125.709 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (Figure 2) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -309.9753 161.4633 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (X) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -283.5818 157.4736 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (VP) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -230.3372 124.1884 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (image) show grestore gsave font12 setfont 0.0 setgray 20.28 dup matrix scale 90.0 matrix rotate -191.7348 128.2501 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (buffer) show grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -255.8672 299.5884 moveto -143.3008 299.5884 lineto -143.3008 445.2422 lineto -255.8672 445.2422 lineto clip newpath 2 setlinejoin 1 setlinecap 2.0 setlinewidth 0.0 setgray -253.8672 301.5884 -179.786 301.5884 vec 2 setlinejoin 1 setlinecap 1.0 setlinewidth 0.6 setgray -179.786 301.5884 -144.8008 443.7423 vec grestore grestore 0.5 setgray eofill gsave gsave 0.0 0.0 moveto currentpoint translate -256.597 442.2422 moveto -143.3007 442.2422 lineto -143.3007 511.6854 lineto -256.597 511.6854 lineto clip newpath 2 setlinejoin 1 setlinecap 2.0 setlinewidth 0.0 setgray -254.597 509.6854 -181.6107 509.6854 vec 2 setlinejoin 1 setlinecap 1.0 setlinewidth 0.6 setgray -181.6107 509.6854 -144.8008 443.7423 vec grestore grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 301.4043 412.2278 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray 37.10183 423.9844 moveto /colwidth 146.731 def gsave font13 setfont (These black lines mark the ends) justify grestore 37.10183 411.9394 moveto /colwidth 146.731 def gsave font13 setfont (of PCR scheduler quanta where) justify grestore 37.10183 399.8944 moveto /colwidth 136.9458 def gsave font13 setfont (YieldButNotToMe terminates) justify grestore 37.10183 387.8493 moveto /colwidth 146.731 def gsave font13 setfont (and the higher priority buffer) justify grestore 37.10183 375.8044 moveto font13 setfont (thread runs again.) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.5 setgray -64.9702 443.7423 moveto -144.8008 443.7423 lineto -144.8008 608.7742 lineto -64.9702 608.7742 lineto -64.9702 443.7423 lineto closepath stroke grestore gsave gsave 1.014 dup matrix scale 90.0 matrix rotate 389.4118 439.6282 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 setgray -13.62074 423.9844 moveto /colwidth 216.6487 def gsave font16 setfont (Note: Our data collector reports \042unknown state\042 for processes) justify grestore -13.62074 413.9468 moveto gsave font16 setfont (at the beginning of a capture interval. For clarity we added by) justify grestore -13.62074 403.9094 moveto /colwidth 216.6487 def gsave font16 setfont (hand the state color in three places: the first two red \042running\042) justify grestore -13.62074 393.8718 moveto font16 setfont (regions in ) show /Times-Bold findfont 8.029999 scalefont /font17 exch def font17 setfont (VP) show font16 setfont (, and the pink \042ready-to-run\042 region in ) show font17 setfont (image) show font16 setfont (.) show grestore grestore gsave font15 setfont 0.0 setgray 14.08333 dup matrix scale 90.0 matrix rotate -9.285068 67.54845 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (improvement from YieldButNotToMe) show grestore gsave font15 setfont 0.0 setgray 10.0 dup matrix scale 90.0 matrix rotate -132.396 162.711 matrix translate matrix concatmatrix matrix concatmatrix concat 0.0 0.0 moveto (\050scale: 15mm = approx. 10 milliseconds\051) show grestore grestore grestore grestore 82.3075 86.724 moveto grestore grestore % end page 17 showpage %%page 18 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (18) show 92.345 713.8666 moveto /colwidth 446.907 def gsave font0 setfont (We fixed the immediate problem by creating a new yield primitive, called YieldButNotToMe) justify grestore 92.345 701.8220 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (which gives the processor to the highest priority ready thread ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (other than its caller,) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( if such a) 2 buf opsaft 2 null put mixedjustify grestore 92.345 689.7769 moveto gsave font0 setfont (thread exists. Most of the time the image thread is the thread favored with the extra cycles and) justify grestore 92.345 677.7321 moveto gsave font0 setfont (there is a big improvement in the system's perceived performance. However, the semantic) justify grestore 92.345 665.687 moveto gsave font0 setfont (compromise entailed in YieldButNotToMe and the uncertainty that the additional cycles will go) justify grestore 92.345 653.642 moveto font0 setfont (to the correct thread suggest that the final solution to these problems still eludes us. ) show 92.345 633.9571 moveto gsave font0 setfont (The improved result when the buffer thread uses YieldButNotToMe can be seen in Figure 2.) justify grestore 92.345 621.9123 moveto gsave font0 setfont (Notice that now when the image thread notifies the buffer thread, the buffer thread usually runs) justify grestore 92.345 609.8671 moveto gsave font0 setfont (for only a moment before yielding back to the image thread. The result is that the X server runs) justify grestore 92.345 597.8222 moveto gsave font0 setfont (only five times in the same time interval. The fewer switches to the X server make the buffer) justify grestore 92.345 585.7772 moveto gsave font0 setfont (thread more effective at doing rectangle combination, there is less time spent in thread switching) justify grestore 92.345 573.7321 moveto gsave font0 setfont (and the image thread gets much more processor resource over the interval. The user experiences) justify grestore 92.345 561.6872 moveto font0 setfont (about a three-fold performance improvement.) show 92.345 542.0022 moveto gsave font0 setfont (Finally, even beyond the problems encountered with priorities in managing a pipeline, we found) justify grestore 92.345 529.9574 moveto gsave font0 setfont (priorities to be problematic. Birrell describes a stable priority inversion in which a high priority) justify grestore 92.345 517.9123 moveto gsave font0 setfont (thread waits on a lock held by a low priority thread that is prevented from running by a middle-) justify grestore 92.345 505.8674 moveto gsave font0 setfont (priority cpu hog [Birrell91, pp. 99-100]. Like Birrell, we chose not to incur the implementation) justify grestore 92.345 493.8222 moveto gsave font0 setfont (overhead of providing priority inheritance from blocked threads to threads holding locks. \050Notice) justify grestore 92.345 481.7772 moveto gsave font0 setfont (that the problem occurs for abstract resources such as the condition associated with a CV as well) justify grestore 92.345 469.7321 moveto gsave font0 setfont (as for real resources such as locks: the thread primitives have little hope of automatically) justify grestore 92.345 457.6872 moveto gsave font0 setfont (adjusting thread priority in such situations.\051 The problem is not hypothetical: we experienced) justify grestore 92.345 445.6422 moveto gsave font0 setfont (enough real problems with priority inversions that we found it necessary to put the following two) justify grestore 92.345 433.5972 moveto gsave font0 setfont (workarounds into our systems. First, for one particular kind of lock in the system, PCR does) justify grestore 92.345 421.5523 moveto gsave font0 setfont (donate cycles from a blocked thread to the thread that is blocking it. This is done only for the per-) justify grestore 92.345 409.5072 moveto gsave font0 setfont (monitor metalock that locks each monitor's queue of waiting threads. It is not done for monitors) justify grestore 92.345 397.4622 moveto gsave font0 setfont (themselves, where we don't know how to implement it efficiently. Second, PCR utilizes a high-) justify grestore 92.345 385.4172 moveto gsave font0 setfont (priority sleeper thread \050which we call the SystemDaemon\051 that regularly wakes up and donates,) justify grestore 92.345 373.3721 moveto gsave font0 setfont (using a directed yield, a small timeslice to another thread chosen at random. In this way we) justify grestore 92.345 361.3272 moveto font0 setfont (ensure that all ready threads get some cpu resource, regardless of their priorities.) show 82.3075 335.0806 moveto font1 setfont (5.3 Common mistakes ) show 92.345 308.8339 moveto gsave font0 setfont (Our dynamic and static inspections of old code revealed occasional correctness and performance) justify grestore 92.345 296.7889 moveto font0 setfont (problems caused by improper thread usage. Two questionable practices stood out. ) show 92.345 277.1039 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (First, we saw many instances of ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (WAIT) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( code that did not recheck the predicate associated with the) 2 buf opsaft 2 null put mixedjustify grestore 92.345 265.0588 moveto font0 setfont (condition variable. Recall that proper use of ) show font10 setfont (WAIT) show font0 setfont ( when using Mesa monitors is ) show 102.3825 245.3739 moveto font10 setfont (WHILE) show font0 setfont ( ) show font10 setfont (NOT) show font0 setfont ( \050) show font10 setfont (OK) show font0 setfont ( to proceed\051 ) show font10 setfont (DO) show font0 setfont ( ) show font10 setfont (WAIT) show font0 setfont ( cv ) show font10 setfont (END) show font0 setfont ( ) show 92.345 225.6889 moveto font0 setfont (not the ) show 102.3825 206.004 moveto font10 setfont (IF) show font0 setfont ( ) show font10 setfont (NOT ) show font0 setfont (\050) show font10 setfont (OK) show font0 setfont ( to proceed\051 ) show font10 setfont (THEN) show font0 setfont ( ) show font10 setfont (WAIT) show font0 setfont ( cv ) show 92.345 186.319 moveto font0 setfont (which would be appropriate with Hoare's original monitors.) show 92.345 166.6341 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (The ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (IF) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (-based approach will work in Mesa with sufficient constraints on the number and behavior) 2 buf opsaft 2 null put mixedjustify grestore 92.345 154.589 moveto gsave font0 setfont (of the threads using the monitor, but its use cannot be recommended. The practice has been a) justify grestore 92.345 142.5441 moveto gsave font0 setfont (continuing source of bugs as programs are modified and the correctness conditions become) justify grestore 92.345 130.4991 moveto font0 setfont (untrue. ) show 92.345 110.8141 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (Second, there were cases where timeouts had been introduced to compensate for missing ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFYs) 1 buf opsaft 1 null put mixedjustify grestore 92.345 98.76911 moveto gsave font0 setfont (\050bugs\051, instead of fixing the underlying problem. The problem with this is that the system can) justify grestore 92.345 86.72413 moveto gsave font0 setfont (become timeout driven--it apparently works correctly but slowly. Debugging the poor) justify grestore grestore grestore % end page 18 showpage %%page 19 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (19) show 92.345 713.8666 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (performance is often harder than figuring out why a system has stopped due to a missing ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (.) 2 buf opsaft 2 null put mixedjustify grestore 92.345 701.8220 moveto font0 setfont (Of course, legitimate timeouts can mask an omitted ) show font10 setfont (NOTIFY) show font0 setfont ( as well. ) show 92.345 682.6838 moveto 82.3075 657.1662 moveto font1 setfont (5.4 When a fork fails) show 92.345 631.6486 moveto gsave font0 setfont (Sometimes an attempt to fork may fail for lack of resources. As with many other resource) justify grestore 92.345 619.6038 moveto gsave font0 setfont (allocation failures it's difficult to plan a response. Earlier versions of the systems would raise an) justify grestore 92.345 607.5588 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (error when a ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (FORK) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( failed: the standard programming practice was to catch the error and to try to) 2 buf opsaft 2 null put mixedjustify grestore 92.345 595.5135 moveto gsave font0 setfont (recover, but good recovery schemes seem never to have been worked out. The resulting code) justify grestore 92.345 583.4687 moveto gsave font0 setfont (seems overly complex to no good end: the machinery for catching the error is always set up even) justify grestore 92.345 571.4237 moveto gsave font0 setfont (though once an error is caught nobody really knows what to do about it. Memory allocation) justify grestore 92.345 559.3788 moveto font0 setfont (failures present similar problems.) show 92.345 540.2407 moveto gsave font0 setfont (Our more recent implementations simply wait in the fork implementation for more resources to) justify grestore 92.345 528.1957 moveto gsave font0 setfont (become available, but the behaviors seen by the user, such as long delays in response or even) justify grestore 92.345 516.1507 moveto font0 setfont (complete unresponsiveness, go unexplained. ) show 92.345 497.0125 moveto gsave font0 setfont (A number of techniques may be adopted to avoid running out of resources: unfortunately, the) justify grestore 92.345 484.9674 moveto gsave font0 setfont (better we succeed at that, the less experience we gain with techniques for appropriately) justify grestore 92.345 472.9224 moveto font0 setfont (recovering from the situation. ) show font10 setfont ( ) show font0 setfont ( ) show 82.3075 447.4047 moveto font1 setfont (5.5 On robustness in a changing environment) show 92.345 421.8873 moveto gsave font0 setfont (Two final comments on the archeology of thread-related bugs. First, we found many instances of) justify grestore 92.345 409.8424 moveto gsave font0 setfont (timeouts and pauses with ridiculous values. These values presumably were chosen with some) justify grestore 92.345 397.7973 moveto gsave font0 setfont (particular now-obsolete processor speed or network architecture in mind. For user interface-) justify grestore 92.345 385.7524 moveto gsave font0 setfont (related timeouts, values based on wall-clock time are appropriate, but timeouts related to) justify grestore 92.345 373.7073 moveto gsave font0 setfont (processor speeds, or more insidiously, to expected network server response times, are more) justify grestore 92.345 361.6624 moveto gsave font0 setfont (difficult to specify simply for all time. This may be an area of future research. For instance,) justify grestore 92.345 349.6172 moveto gsave font0 setfont (dynamically tuning application timeout values based on end-to-end system performance may be) justify grestore 92.345 337.5723 moveto font0 setfont (a workable solution.) show 92.345 318.4342 moveto gsave font0 setfont (Second, we saw several places where the correctness of threaded code depended on strong memory) justify grestore 92.345 306.3892 moveto gsave font0 setfont (ordering, an assumption no longer true in some modern multiprocessors with weakly ordered) justify grestore 92.345 294.3443 moveto gsave font0 setfont (memory [Frailong93][Sites93]. The monitor implementation for weak ordering can use memory) justify grestore 92.345 282.299 moveto gsave font0 setfont (barrier instructions to ensure that all monitor-protected data access is consistent, but other uses) justify grestore 92.345 270.2541 moveto gsave font0 setfont (that would be correct with strong ordering will not work. As a simple example, imagine a thread) justify grestore 92.345 258.2091 moveto gsave font0 setfont (that once a minute constructs a record of time-date values and stores a pointer to that record into) justify grestore 92.345 246.1642 moveto gsave font0 setfont (a global variable. Under the assumptions of strong ordering and atomic write of the pointer) justify grestore 92.345 234.119 moveto gsave font0 setfont (value, this is safe. Under weak ordering, readers of the global variable can follow a pointer to a) justify grestore 92.345 222.074 moveto gsave font0 setfont (record that has not yet had its fields filled in. As another example, Birrell offers a performance) justify grestore 92.345 210.0291 moveto gsave font0 setfont (hint for calling an intialization routine exactly once [Birrell91, p. 97]. Under weak ordering, a) justify grestore 92.345 197.9841 moveto gsave font0 setfont (thread can both believe that the initializer has already been called, but not yet be able to see the) justify grestore 92.345 185.9391 moveto font0 setfont (initialized data.) show 82.3075 160.4216 moveto font1 setfont (5.6 Some contrasting experiences: multi-threading and X windows) show 92.345 134.9041 moveto gsave font0 setfont (The usual, single-threaded client interface to an X server is through Xlib, a library that) justify grestore 92.345 122.8591 moveto gsave font0 setfont (translates an X client's procedural interface into the message-oriented interface of the X server.) justify grestore 92.345 110.8141 moveto gsave font0 setfont (Xlib does the required translation and manages the I/O connection to the server, both for reading) justify grestore 92.345 98.76906 moveto gsave font0 setfont (events and writing commands. We studied two approaches to using X windows from a multi-) justify grestore 92.345 86.72406 moveto gsave font0 setfont (threaded client. One approach uses Xlib, modified only to make it thread-safe [Schmitmann93].) justify grestore grestore grestore % end page 19 showpage %%page 20 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (20) show 92.345 713.8666 moveto gsave font0 setfont (The other approach uses Xl, an X client library designed from scratch with multi-threading in) justify grestore 92.345 701.8220 moveto font0 setfont (mind [Jacobi92]. ) show 92.345 681.7325 moveto gsave font0 setfont (A major difference between the two approaches concerns management of the I/O connection to the) justify grestore 92.345 669.6876 moveto gsave font0 setfont (server. Xl introduced a new serializing thread that was associated with the I/O connection. The) justify grestore 92.345 657.6429 moveto gsave font0 setfont (job of this thread was solely to read from the I/O connection and dispatch events to waiting) justify grestore 92.345 645.5976 moveto gsave font0 setfont (threads. In contrast, the ported library allowed any client thread to do the read and a monitor) justify grestore 92.345 633.5526 moveto gsave font0 setfont (lock on the library provided serialization. There were two problems with this: priority inversion) justify grestore 92.345 621.5078 moveto gsave font0 setfont (and honoring the clients' timeout parameter on the GetEvent routine. When a client thread) justify grestore 92.345 609.463 moveto gsave font0 setfont (blocks on the read call it holds the library mutex. A priority inversion could occur if the thread) justify grestore 92.345 597.418 moveto gsave font0 setfont (were preempted. Furthermore, it is not possible for other threads to timeout on their attempt to) justify grestore 92.345 585.3729 moveto gsave font0 setfont (obtain the library mutex. Therefore, each read had to be done with a short timeout after which) justify grestore 92.345 573.3276 moveto gsave font0 setfont (the mutex was released, allowing other threads to continue. In contrast, with the introduction of) justify grestore 92.345 561.2826 moveto gsave font0 setfont (a reading thread, the client timeout is handled perfectly by the condition variable timeout) justify grestore 92.345 549.2378 moveto gsave font0 setfont (mechanism and priority inversion can only occur during the short time period when a low-) justify grestore 92.345 537.1928 moveto font0 setfont (priority thread checks to see if there are events on the input queue.) show 92.345 517.1034 moveto gsave font0 setfont (A second benefit of introducing this thread concerns interaction between output requests and) justify grestore 92.345 505.0584 moveto gsave font0 setfont (input events. The X specification requires that the output queue be flushed whenever a read is) justify grestore 92.345 493.0135 moveto gsave font0 setfont (done on the input stream. This is done to ensure that any commands that might trigger a) justify grestore 92.345 480.9684 moveto gsave font0 setfont (response are delivered to the server before the client waits on the reply. The ported library) justify grestore 92.345 468.9234 moveto gsave font0 setfont (retained this behavior, but the short timeout on the read operations \050to handle the problem) justify grestore 92.345 456.8784 moveto gsave font0 setfont (described above\051 caused an excessive number of output flushes, defeating the throughput gains of) justify grestore 92.345 444.8334 moveto gsave font0 setfont (batching requests. With the introduction of a reading thread, however, there is no need to couple) justify grestore 92.345 432.7884 moveto gsave font0 setfont (the input and output together. The reading thread can block indefinitely and other mechanisms) justify grestore 92.345 420.7433 moveto gsave font0 setfont (such as an explicit flush by clients or a periodic timeout by a maintenance thread ensure that) justify grestore 92.345 408.6984 moveto font0 setfont (output gets flushed in a timely manner.) show 92.345 388.609 moveto gsave font0 setfont (Another difference in the two approaches is the introduction of an extra thread for the batching of) justify grestore 92.345 376.5641 moveto gsave font0 setfont (graphics requests. Both systems do batching on a higher level to eliminate unnecessary X) justify grestore 92.345 364.519 moveto gsave font0 setfont (requests. Xl uses the slack process mentioned previously. It makes the connection to the server) justify grestore 92.345 352.474 moveto gsave font0 setfont (asynchronous in order to improve throughput, especially when performing many graphics) justify grestore 92.345 340.429 moveto gsave font0 setfont (operations. The Xlib port uses external knowledge when the painting is finished to trigger a) justify grestore 92.345 328.384 moveto gsave font0 setfont (flush of the batched requests. This limits asynchronous graphics operations and leads to a few) justify grestore 92.345 316.339 moveto font0 setfont (superfluous flushes. ) show 92.345 296.2496 moveto gsave font0 setfont (In summary, this example illustrates the benefit of introducing an additional thread to help) justify grestore 92.345 284.2045 moveto font0 setfont (manage concurrency and interactions with external I/O events. ) show 72.26999 233.3288 moveto font8 setfont (6. Issues in thread implementation ) show 82.3075 205.869 moveto font1 setfont (6.1 Spurious lock conflicts) show 92.345 179.0833 moveto gsave font0 setfont (A spurious lock conflict occurs between a thread notifying a CV and the thread that it awakens.) justify grestore 92.345 167.0384 moveto gsave font0 setfont (Birrell describes its occurence on a multiprocessor: the scheduler starts to run the notified thread) justify grestore 92.345 154.9933 moveto gsave font0 setfont (on another processor while the notifying thread, still running on its processor, holds the) justify grestore 92.345 142.9484 moveto gsave font0 setfont (associated monitor lock. The notifyee runs for a few microseconds and then blocks waiting for the) justify grestore 92.345 130.9034 moveto gsave font0 setfont (monitor lock. The cost of this behavior is that of useless trips through the scheduler made by the) justify grestore 92.345 118.8583 moveto font0 setfont (notifyee's processor [Birrell91].) show 92.345 98.76905 moveto gsave font0 setfont (We observed this phenomenon in our micro-visualizations even on a uniprocessor, where it) justify grestore 92.345 86.72404 moveto gsave font0 setfont (occurs when the waiting thread has higher priority than the notifying thread. Figure 3) justify grestore grestore grestore % end page 20 showpage %%page 21 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 553.3894 746.79 moveto (21) show 92.345 713.8666 moveto gsave font0 setfont (illustrates the behavior before and after the notify implementation was fixed to correct the) justify grestore 92.345 701.8220 moveto gsave font0 setfont (behavior. Since the Mesa language does not allow condition variable notifies outside of monitor) justify grestore 92.345 689.7769 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (locks, Birrell's technique of moving the ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( out of the locked region is not applicable. In our) 2 buf opsaft 2 null put mixedjustify grestore 92.345 677.7321 moveto gsave font0 setfont (systems the fix \050defer processor rescheduling, but not the notification itself, until after monitor) justify grestore 92.345 665.687 moveto gsave font0 setfont opsbef 0 {font0 setfont} put (exit\051 was made in the runtime implementation. The changed implementation of ) 0 buf opsaft 0 null put font10 setfont opsbef 1 {font10 setfont} put (NOTIFY) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( prevents) 2 buf opsaft 2 null put mixedjustify grestore 92.345 653.642 moveto font0 setfont (the problem both in the case of interpriority notifications and on multiprocessors.) show 140.5513 538.8493 moveto gsave currentpoint translate 2834.645 dup matrix scale concat gsave 3.527776e-4 dup matrix scale concat gsave 333.975 -900.132 matrix translate concat 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -274.6579 929.5101 -267.17 929.5101 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -52.19436 927.8657 -11.33638 927.8657 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -88.85645 927.8657 -61.18008 927.8657 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -88.85645 952.1864 -58.68426 952.1864 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -250.6962 952.8056 -227.2368 952.8056 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -305.7768 952.8056 -283.6435 952.8056 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -258.1842 929.5101 -227.2368 929.5101 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -305.7768 929.5101 -283.6435 929.5101 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -61.18008 927.8657 -52.19436 927.8657 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -61.18008 927.8657 -61.18008 927.8657 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -58.68426 952.1864 -43.70796 952.1864 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -58.68426 952.1864 -58.68426 952.1864 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -283.6435 952.8056 -250.6962 952.8056 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -283.6435 952.8056 -283.6435 952.8056 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -267.17 929.5101 -258.1842 929.5101 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -267.17 929.5101 -267.17 929.5101 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -283.6435 929.5101 -274.6579 929.5101 vec 6.0 setlinewidth 0 setlinecap 1 setlinejoin 0.88 0.52 0.52 setrgbcolor -283.6435 929.5101 -283.6435 929.5101 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -55.18957 927.8657 -49.19916 927.8657 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -61.67949 952.1864 -52.69357 952.1864 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.4 0.4 0.4 setrgbcolor -43.70796 952.1864 -11.33638 952.1864 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -59.93197 930.4657 -59.93197 950.434 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -270.165 952.8056 -261.1795 952.8056 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -286.6386 952.8056 -276.1556 952.8056 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -261.1795 929.5101 -253.6915 929.5101 vec 14.0 setlinewidth 0 setlinecap 1 setlinejoin 0.64 0.16 0.16 setrgbcolor -276.1556 929.5101 -270.165 929.5101 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -267.9187 953.6383 -267.9187 932.006 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -267.9187 953.6383 -267.9187 953.6383 vec 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -282.8948 953.6383 -282.8948 932.006 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -282.8948 953.6383 -282.8948 953.6383 vec gsave /Helvetica-Oblique findfont 1.0 scalefont /font18 exch def font18 setfont 0.0 setgray 8.32 dup matrix scale -217.6398 951.454 matrix translate matrix concatmatrix concat 0.0 0.0 moveto (Low priority notifying thread) show grestore gsave font18 setfont 0.0 setgray 8.32 dup matrix scale -217.6398 929.5101 matrix translate matrix concatmatrix concat 0.0 0.0 moveto (High priority waiting thread) show grestore gsave font18 setfont 0.0 setgray 8.32 dup matrix scale -294.4925 913.4634 matrix translate matrix concatmatrix concat 0.0 0.0 moveto (Naive wakeup) show grestore gsave font18 setfont 0.0 setgray 8.32 dup matrix scale -94.99576 913.0316 matrix translate matrix concatmatrix concat 0.0 0.0 moveto (Careful wakeup) show grestore gsave gsave 0.832 dup matrix scale -199.5275 891.5625 matrix translate matrix concatmatrix concat 0.0 setgray -159.5439 122.0310 moveto font14 setfont ( A low priority thread notifying a high) show -153.5439 109.9859 moveto font14 setfont (priority thread results in a contended) show -153.5439 97.94091 moveto font14 setfont (monitor entry and 3 thread switches) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.0 setgray -332.2678 962.282 moveto -332.2678 1002.275 lineto -184.2374 1002.275 lineto -184.2374 962.282 lineto -332.2678 962.282 lineto closepath stroke grestore gsave gsave 0.832 dup matrix scale 1.508286 894.638 matrix translate matrix concatmatrix concat 0.0 setgray -134.7607 111.278 moveto font14 setfont ( Done carefully, only a single) show -128.7607 99.23301 moveto font14 setfont (thread switch is required) show grestore 1.0 setlinewidth 1 setlinecap 1 setlinejoin 0.0 setgray -110.6126 965.3578 moveto -110.6126 996.4041 lineto 4.774627 996.4041 lineto 4.774627 965.3578 lineto -110.6126 965.3578 lineto closepath stroke grestore gsave font15 setfont 0.0 setgray 8.32 dup matrix scale -192.8668 907.963 matrix translate matrix concatmatrix concat 0.0 0.0 moveto (Figure 3) show grestore 1.0 setlinewidth 0 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -54.11265 952.8975 -54.11265 961.6931 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.304 0.0 0.8 setrgbcolor -54.11265 952.8975 -54.11265 952.8975 vec 3.0 setlinewidth 1 setlinecap 1 setlinejoin 0.8 0.0 0.0 setrgbcolor -59.93197 950.434 -59.93197 950.434 vec grestore grestore grestore 82.3075 511.3947 moveto font1 setfont (6.2 Priorities) show 92.345 483.94 moveto gsave font0 setfont (PCR approximates a strict priority scheduler, by which we mean that if a process of a given) justify grestore 92.345 471.8951 moveto gsave font0 setfont (priority is currently scheduled to run on a processor, no process with higher priority is ready to) justify grestore 92.345 459.85 moveto gsave font0 setfont (run. As we have seen in Section 5.2, strict priority is not a desirable model on which to run our) justify grestore 92.345 447.8052 moveto gsave font0 setfont (client code: a model that provides some cpu resource to all runnable threads has proven) justify grestore 92.345 435.76 moveto gsave font0 setfont (necessary to overcome stable priority inversions. Similarly, the YieldButNotToMe and) justify grestore 92.345 423.7152 moveto gsave font0 setfont (SystemDaemon hacks, also described above, violate strict priority semantics yet have proven) justify grestore 92.345 411.6701 moveto gsave font0 setfont (useful in making our system perform well. The SystemDaemon hack pushes the thread model a) justify grestore 92.345 399.625 moveto gsave font0 setfont (bit in the direction of proportional fair-share scheduling \050threads at each priority progress at a) justify grestore 92.345 387.58 moveto gsave font0 setfont (rate proportional to a function of the current distribution of threads among priorities\051, a model) justify grestore 92.345 375.5351 moveto gsave font0 setfont (intuitively better suited to controlling long-term average behavior than to controlling moment-) justify grestore 92.345 363.49 moveto font0 setfont (by-moment processor allocation to meet near-real-time requirements. ) show 92.345 342.899 moveto gsave font0 setfont (We do not regard this as a satisfactory state of affairs. These implementation hacks mean that) justify grestore 92.345 330.854 moveto gsave font0 setfont (the thread model is incompletely specified with respect to priorities, adversely affecting our) justify grestore 92.345 318.809 moveto gsave font0 setfont (ability to reason about existing code and to provide guidance for engineering new code. Priority) justify grestore 92.345 306.764 moveto gsave font0 setfont (inversions and techniques for avoiding them are the subjects of considerable research in the) justify grestore 92.345 294.7191 moveto gsave font0 setfont (realtime computing context [Sha90][Pilling91]. We believe that someone should investigate) justify grestore 92.345 282.674 moveto font0 setfont (these techniques for interactive systems and report on the result. ) show 82.3075 255.2195 moveto font1 setfont (6.3 The effect of the time-slice quantum) show 92.345 227.7649 moveto gsave font0 setfont (Only after several months of study of Figure 2 did we realize something else it was showing us:) justify grestore 92.345 215.7199 moveto gsave font0 setfont (the importance of the time-slice quantum. Figure 2 has been annotated by hand with a black) justify grestore 92.345 203.6749 moveto gsave font0 setfont (stroke every 50 milliseconds denoting the end of the PCR time-slice. The end of a timeslice ends) justify grestore 92.345 191.6299 moveto gsave font0 setfont (the effect of a YieldButNotToMe or a directed yield. In Figure 2 the lower priority image thread) justify grestore 92.345 179.5849 moveto gsave font0 setfont (stops running and \050after a brief gap\051 the buffer thread again runs. \050The gap occurs when various) justify grestore 92.345 167.5399 moveto font0 setfont (threads, not shown, run briefly because they have timed out\051.) show 92.345 146.949 moveto gsave font0 setfont (What we did not realize for a long time is that it is the 50 millisecond quantum that is clocking) justify grestore 92.345 134.904 moveto gsave font0 setfont (the sending of the X requests from the buffer thread. That is, the only reason this performs well) justify grestore 92.345 122.859 moveto gsave font0 setfont (is that the quantum is 50 milliseconds. For instance, if the quantum were 1 second, then X events) justify grestore 92.345 110.814 moveto gsave font0 setfont (would be buffered for one second before being sent and the user would observe very bursty screen) justify grestore 92.345 98.76898 moveto gsave font0 setfont (painting. If the quantum were 1 millisecond, then the YieldButNotToMe would yield only very) justify grestore 92.345 86.724 moveto font0 setfont (briefly and we would back to Figure 1 again.) show grestore grestore % end page 21 showpage %%page 22 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (22) show 92.345 713.8666 moveto gsave font0 setfont (Above we mentioned that it does not work to rewrite the buffer thread to sleep for a timed) justify grestore 92.345 701.8220 moveto gsave font0 setfont (interval, instead of doing a yield. The reason is that the smallest sleep interval is the remainder) justify grestore 92.345 689.7769 moveto gsave font0 setfont (of the scheduler quantum. Our 50 millisecond quantum is a little bit too long for snappy keyboard) justify grestore 92.345 677.7321 moveto gsave font0 setfont (echoing and line drawing, both instances where immediate response is more important than the) justify grestore 92.345 665.687 moveto gsave font0 setfont (throughput improvement achieved by buffering. However, if the scheduler quantum were 20) justify grestore 92.345 653.642 moveto font0 setfont (milliseconds, using a timeout instead of a yield in the buffer thread would work fine.) show 92.345 633.6474 moveto gsave font0 setfont (We conclude that the choice of scheduler quantum is not to be taken lightly in the design of) justify grestore 92.345 621.6024 moveto gsave font0 setfont (interactive thread systems, since it can severely affect the performance of different, correct,) justify grestore 92.345 609.5574 moveto font0 setfont (multiprogramming algorithms.) show 72.26999 558.8076 moveto font8 setfont (7. Visualization tools ) show 82.3075 532.1481 moveto /colwidth 456.9444 def gsave font0 setfont (An important tool in our study is the program that we use to examine the interactions between) justify grestore 82.3075 520.1031 moveto gsave font0 setfont (threads. The visualization system lets us see what threads are involved in performing a certain task) justify grestore 82.3075 508.0582 moveto gsave font0 setfont (and how they interact. Our visualization system consists of three major parts. The first two parts,) justify grestore 82.3075 496.0132 moveto font0 setfont (HistorySpy and KTrace, gather information, while the third, ThreadsVis, displays the information.) show 82.3075 476.0185 moveto gsave font0 setfont (HistorySpy collects detailed information about four kinds of events: thread creation \050fork\051, thread) justify grestore 82.3075 463.9737 moveto gsave font0 setfont (transition to blocked state \050blocked monitor entry, condition wait\051, thread transition to unblocked) justify grestore 82.3075 451.9286 moveto gsave font0 setfont (state \050monitor exit, notify and broadcast\051 and thread transition to running state \050chosen for) justify grestore 82.3075 439.8834 moveto gsave font0 setfont (execution by the thread scheduler\051. For each event the program counters on the call stack are) justify grestore 82.3075 427.8384 moveto gsave font0 setfont (gathered. The first few PCs in the callstacks are later used to identify the kind of transition and all) justify grestore 82.3075 415.7935 moveto gsave font0 setfont (the PCs are mapped to procedure names for inspection by the ThreadsVis user. The time overhead) justify grestore 82.3075 403.7484 moveto gsave font0 setfont (of HistorySpy is dominated by recording the call stacks, which takes about 45 microseconds per) justify grestore 82.3075 391.7034 moveto gsave font0 setfont (frame on a Sparcstation 2. Events have an average of 12 frames. A measured series of tasks took) justify grestore 82.3075 379.6584 moveto gsave font0 setfont (about 20% longer with HistorySpy turned on and gathering about 300 events/second. Note that) justify grestore 82.3075 367.6133 moveto gsave font0 setfont (events such as uncontended monitor entry and exit and notifies with no waiters do not cause) justify grestore 82.3075 355.5684 moveto font0 setfont (transitions and are not recorded by HistorySpy. ) show 82.3075 335.5738 moveto gsave font0 setfont (KTrace is a similar system for monitoring Unix kernel events. It consists of a SunOS kernel) justify grestore 82.3075 323.5286 moveto gsave font0 setfont (modified to put events into a large in-memory ring buffer and a user process that empties the) justify grestore 82.3075 311.4836 moveto gsave font0 setfont (buffer. KTrace events are transition to idle, user process execution, interrupts, trap entry and exit,) justify grestore 82.3075 299.4386 moveto gsave font0 setfont (page faults, internal kernel sleeps and system calls. Detailed information about each type of event) justify grestore 82.3075 287.3936 moveto gsave font0 setfont (is also gathered, such as which process, which interrupt, the event slept upon and so on. \050KTrace) justify grestore 82.3075 275.3485 moveto gsave font0 setfont (does not capture call stacks.\051 Tracing of different types of events can be turned on and off) justify grestore 82.3075 263.3036 moveto gsave font0 setfont (dynamically, to limit unnecessary overhead. A disabled trace point just costs a few instructions and) justify grestore 82.3075 251.2586 moveto gsave font0 setfont (an enabled trace point costs about 5 microseconds on a Sparcstation 2. This includes reading the) justify grestore 82.3075 239.2136 moveto gsave font0 setfont (microsecond hardware clock and adding a record to the circular trace buffer. The biggest source of) justify grestore 82.3075 227.1687 moveto gsave font0 setfont (overhead is the background job that runs periodically and copies the kernel's trace buffer to disk.) justify grestore 82.3075 215.1236 moveto gsave font0 setfont (Programs use from 2% to 3% more CPU time when tracing is turned on, but on a uniprocessor they) justify grestore 82.3075 203.0787 moveto gsave font0 setfont (run 10% to 11% slower in terms of elapsed time because they compete with the process that empties) justify grestore 82.3075 191.0336 moveto gsave font0 setfont (the trace buffer. The same measurement on a multiprocessor shows only the 2-3% slowdown as) justify grestore 82.3075 178.9886 moveto font0 setfont (expected.) show 82.3075 158.9939 moveto gsave font0 setfont (The ThreadsVis program automatically converts the data from KTrace and HistorySpy into an) justify grestore 82.3075 146.9489 moveto gsave font0 setfont (interactive graphical form. Using a graphical editor with embedded buttons [Pier88][Bier92], the) justify grestore 82.3075 134.904 moveto gsave font0 setfont (picture is easily panned, zoomed, or edited. Any item in the picture can be clicked to pop up) justify grestore 82.3075 122.859 moveto gsave font0 setfont (additional information, including the callstacks for thread events. There are obvious advantages to) justify grestore 82.3075 110.814 moveto gsave font0 setfont (viewing the trace data graphically and interactively, but a complete discussion of thread) justify grestore 82.3075 98.76892 moveto gsave font0 setfont (visualization techniques is beyond the scope of this paper. \050The reader interested in parallel) justify grestore 82.3075 86.72391 moveto font0 setfont (visualization systems might start with the references in [Halstead90].\051) show grestore grestore % end page 22 showpage %%page 23 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (23) show 82.3075 713.8666 moveto gsave font0 setfont (The PCRTrace package, used in gathering data for the statistics for Section 3.1, is a PCR) justify grestore 82.3075 701.8220 moveto gsave font0 setfont (instrumented to record events like thread switches, thread preemptions, IO operations performed,) justify grestore 82.3075 689.7769 moveto gsave font0 setfont (contended and uncontended monitor entry, etc. Events are recorded in an in-memory trace buffer) justify grestore 82.3075 677.7321 moveto font0 setfont (and analyzed off-line. ) show 72.26999 626.6234 moveto font8 setfont (8. Suggestions for future work) show 82.3075 599.6047 moveto gsave font0 setfont (Two areas stand out as needing further work. First, micro-visualization of threads is very) justify grestore 82.3075 587.5598 moveto gsave font0 setfont (compute and memory intensive. We were not satisfied with either the performance or the user) justify grestore 82.3075 575.5148 moveto gsave font0 setfont (interface of our visualization tools, even when we ran them on 50 MIP multiprocessor RISC) justify grestore 82.3075 563.4698 moveto gsave font0 setfont (machines. We had two persistent user interface problems: managing the huge number of events in) justify grestore 82.3075 551.425 moveto gsave font0 setfont (even a few seconds of visualization \050our figures here were drastically cut down for purposes of) justify grestore 82.3075 539.38 moveto font0 setfont (presentation\051; and better relating the visualized events to what occured during event capture. ) show 82.3075 519.116 moveto gsave font0 setfont (Second, we believe that work from the real-time scheduling community must be explored in the) justify grestore 82.3075 507.0709 moveto gsave font0 setfont (context of large, interactive systems. Both strict priority scheduling and fair-share priority) justify grestore 82.3075 495.026 moveto font0 setfont (scheduling seem to complicate rather than ease the programming of highly reactive systems.) show 72.26999 443.9174 moveto font8 setfont (9. Conclusions ) show 82.3075 416.8988 moveto gsave font0 setfont (We have analyzed two interactive computing systems that make heavy use of light-weight threads) justify grestore 82.3075 404.8537 moveto gsave font0 setfont (and have been in daily use for many years by many people. The model of threads both these) justify grestore 82.3075 392.8088 moveto gsave font0 setfont (systems use is one based on preemptable threads that use monitors and condition variables to) justify grestore 82.3075 380.7636 moveto gsave font0 setfont (control thread interactions. Both systems run on top of the Portable Common Runtime, which) justify grestore 82.3075 368.7188 moveto font0 setfont (provides preemptable user-level threads based on a strict priority-based scheduling model.) show 82.3075 348.4548 moveto gsave font0 setfont (Our analysis has focused on how people use threads for program structuring rather than for) justify grestore 82.3075 336.4099 moveto gsave font0 setfont (achieving multiprocessor performance. As such, we have focused more on a static analysis of) justify grestore 82.3075 324.3649 moveto gsave font0 setfont (program code, coupled with an analysis of thread micro-behavior, than on macroscopic thread) justify grestore 82.3075 312.3197 moveto font0 setfont (runtime statistics.) show 82.3075 292.0558 moveto gsave font0 setfont (These systems exemplify some paradigms that may be useful to the thread programmer who is) justify grestore 82.3075 280.0108 moveto gsave font0 setfont (ready for more advanced thread uses, such as slack processes, serializers, deadlock avoiders and) justify grestore 82.3075 267.9658 moveto font0 setfont (task rejuvenators.) show 82.3075 247.7018 moveto gsave font0 setfont (These systems also show that even very experienced communities may struggle at times to use) justify grestore 82.3075 235.6568 moveto gsave font0 setfont (threads well. Some thread paradigms using monitor mechanisms are easy for programmers to use;) justify grestore 82.3075 223.6117 moveto gsave font0 setfont (others, such as slack processes and priorities, challenge both application programmers and thread) justify grestore 82.3075 211.5668 moveto font0 setfont (system implementors.) show 82.3075 191.3029 moveto gsave font0 setfont (One of our major conclusions is a suggestion for future work in this area: there is still much to be) justify grestore 82.3075 179.2579 moveto gsave font0 setfont (learned from a careful analysis of large systems. The more unusual paradigms described in this) justify grestore 82.3075 167.213 moveto gsave font0 setfont (paper, such as task rejuvenation and deadlock avoidance, arose from a relatively small community) justify grestore 82.3075 155.168 moveto gsave font0 setfont (over a small number of years. There are likely other innovative uses of threads waiting to be) justify grestore 82.3075 143.123 moveto font0 setfont (discovered. ) show 82.3075 122.859 moveto gsave font0 setfont (Reading code and microscopic visualization taught us new things about systems we had created and) justify grestore 82.3075 110.814 moveto gsave font0 setfont (used over a ten year period. Even after a year of looking at the same 100 millisecond pictures we) justify grestore 82.3075 98.76898 moveto gsave font0 setfont (are seeing new things in them. To understand systems it is not enough to describe how things) justify grestore 82.3075 86.724 moveto font0 setfont (should be; one also needs to know how they are. ) show grestore grestore % end page 23 showpage %%page 24 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.759 746.79 moveto (24) show 72.26999 713.8666 moveto font8 setfont (Acknowledgements) show 82.3075 694.7231 moveto gsave font0 setfont (This work would not have been possible without the efforts of the hundreds of Cedar and GVX) justify grestore 82.3075 682.678 moveto gsave font0 setfont (programmers who created these systems. Alan Demers created the PCR thread package and) justify grestore 82.3075 670.6334 moveto gsave font0 setfont (participated in hours of discussions regarding thread primitives and scheduling. John Corwin and) justify grestore 82.3075 658.5882 moveto font0 setfont (Chris Uhler assisted us in building and using instrumented versions of GVX.) show 82.3075 639.4444 moveto gsave font0 setfont (This work was supported by Xerox. Portions were also paid for by ARPA under contract) justify grestore 82.3075 627.3993 moveto font0 setfont (DABT63-91-C-0027.) show 72.26999 608.2553 moveto font8 setfont (Bibliography) show 82.3075 593.4853 moveto gsave font0 setfont ([Accetta86] Accetta, R. Baron, W. Bolosky, D. Golub, R. Rashid, A. Tevanian, M. Young, ``Mach: A) justify grestore 91.22881 581.4405 moveto /colwidth 447.775 def gsave font0 setfont opsbef 0 {font0 setfont} put (New Kernel Foundation for UNIX Development.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Proceedings of the Summer 1986 USENIX) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 569.3953 moveto font9 setfont (Conference) show font0 setfont (, July 1986.) show 82.3075 554.6253 moveto /colwidth 456.9444 def gsave font0 setfont opsbef 0 {font0 setfont} put ([Bier92] E. Bier. ``EmbeddedButtons: Supporting Buttons in Documents.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (ACM Transactions on) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 542.5802 moveto font9 setfont (Information Systems) show font0 setfont (, 10\0504\051, October 1992, pages 381-407.) show 82.3075 527.8104 moveto gsave font0 setfont opsbef 0 {font0 setfont} put ([Birrell91] A. Birrell. ``An Introduction to Programming with Threads.'' in) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put ( Systems Programming) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 515.7653 moveto font9 setfont (with Modula-3, ) show font0 setfont (G. Nelson editor. Prentice Hall, 1991, pp. 88-118.) show 82.3075 500.9952 moveto font0 setfont ([Custer93] H. Custer. ) show font9 setfont (Inside Windows NT) show font0 setfont (. Microsoft Press, 1993.) show 82.3075 486.225 moveto gsave font0 setfont ([Draves91] R. Draves, B. Bershad, R. Rashid, R. Dean. ``Using Continuations to Implement Thread) justify grestore 91.22881 474.18 moveto /colwidth 422.1254 def gsave font0 setfont opsbef 0 {font0 setfont} put (Management and Communication in Operating Systems.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Proceedings of the 13th ACM) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 462.1352 moveto font9 setfont (Symposium on Operating Systems Principles) show font0 setfont (, in ) show font9 setfont (Operating Systems Review, ) show font0 setfont (25\0505\051) show font9 setfont (, ) show font0 setfont (October 1991.) show font9 setfont ( ) show 82.3075 447.365 moveto /colwidth 456.9444 def gsave font0 setfont ([Frailong93] J. Frailong, M. Cekleov, P. Sindhu, J. Gastinel, M. Splain, J. Price, A. Singhal. ``The) justify grestore 91.22881 435.32 moveto font0 setfont (Next-Generation SPARC Multiprocessing System Architecture.'' ) show font9 setfont (Proceedings of COMPCON 93.) show 82.3075 420.55 moveto gsave font0 setfont ([Halstead90] R. Halstead, Jr., D. Kranz. ``A Replay Mechanism for Mostly Functional Parallel) justify grestore 91.22881 408.505 moveto font0 setfont (Programs.'' ) show font9 setfont (DEC Cambridge Research Lab Technical Report 90/6) show font0 setfont (, November 13, 1990.) show 82.3075 393.735 moveto gsave font0 setfont opsbef 0 {font0 setfont} put ([Jacobi92] Jacobi, C. ``Migrating Widgets.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Proceedings of the 6th Annual X Technical Conference) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 381.69 moveto font0 setfont (in ) show font9 setfont (The X Resource) show font0 setfont (, Issue 1, January 1992, p. 157.) show 82.3075 366.92 moveto /colwidth 434.9503 def gsave font0 setfont ([Lampson80] B. Lampson, D. Redell. ``Experience with Processes and Monitors in Mesa.'') justify grestore 91.22881 354.875 moveto font9 setfont (Communications of the ACM) show font0 setfont (, 23\0502\051, February 1980.) show 82.3075 340.1048 moveto /colwidth 456.9444 def gsave font0 setfont opsbef 0 {font0 setfont} put ([Owicki89] Owicki, S. ``Experience with the Firefly Multiprocessor Workstation.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Research Report) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 328.0597 moveto font9 setfont (51) show font0 setfont (, Digital Equipment Corp. Systems Research Center, September, 1989.) show 82.3075 313.2899 moveto gsave font0 setfont ([Pier88] K. Pier, E. Bier, M. Stone. ``An Introduction to Gargoyle: an Interactive Illustration Tool.'') justify grestore 91.22881 301.2447 moveto /colwidth 426.027 def gsave font0 setfont opsbef 0 {font0 setfont} put (J.C. van Vliet \050editor\051, ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Document Manipulation and Typography, Proceedings of the Int'l) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 289.1997 moveto /colwidth 448.0232 def gsave font9 setfont opsbef 0 {font9 setfont} put (Conference on Electronic Publishing, Document Manipulation and Typography) 0 buf opsaft 0 null put font0 setfont opsbef 1 {font0 setfont} put (, Nice \050France\051,) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 277.1548 moveto font0 setfont (April 20-22, 1988. Cambridge University Press, 1988, pp. 223-238.) show 82.3075 262.3846 moveto /colwidth 456.9444 def gsave font0 setfont ([Pilling91] M. Pilling. ``Dangers of Priority as a Structuring Principle for Real-Time Languages.'') justify grestore 91.22881 250.3396 moveto font9 setfont (Australian Computer Science Communications) show font0 setfont (, 13\0501\051, February 1991, pp. 18-1 - 18-10.) show 82.3075 235.5696 moveto gsave font0 setfont ([Powell91] M. Powell, S. Kleiman, S. Barton, D. Shah, D. Stein, M. Weeks. ``SunOS Multi-thread) justify grestore 91.22881 223.5246 moveto font0 setfont (Architecture.'' ) show font9 setfont (Proceedings of the Winter 1991 ) show (USENIX) show ( Conference) show font0 setfont (, Jan. 1991, pp. 65-80.) show 82.3075 208.7545 moveto gsave font0 setfont opsbef 0 {font0 setfont} put ([Scheifler92] R. Scheifler, J. Gettys. ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (X Window System: The Complete Reference to Xlib, X Protocol,) 1 buf opsaft 1 null put mixedjustify grestore 91.22881 196.7095 moveto font9 setfont (ICCCM, XLFD) show font0 setfont (. Third edition. Digital Press, 1992.) show 82.3075 181.9394 moveto /colwidth 455.0303 def gsave font0 setfont ([Schmitmann93] C. Schmidtmann, M Tao, S. Watt. ``Design and Implementation of a Multi-) justify grestore 91.22881 169.8944 moveto font0 setfont (Threaded Xlib.'' ) show font9 setfont (Proceedings of the Winter) show font0 setfont ( ) show font9 setfont (1993 Usenix Conference) show font0 setfont (, Jan. 1993, pp 193-204.) show 82.3075 155.1244 moveto /colwidth 456.9444 def gsave font0 setfont opsbef 0 {font0 setfont} put ([Sha90] L. Sha, J. Goodenough. ``Real-Time Scheduling Theory and Ada.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (IEEE Computer, ) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (23\0504\051) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (,) 3 buf opsaft 3 null put mixedjustify grestore 91.22881 143.0794 moveto font0 setfont (April 1990, pp 53-62.) show font9 setfont ( ) show 82.3075 128.3093 moveto font0 setfont ([Sites93] Sites, R. ``Alpha AXP Architecture.'' ) show font9 setfont (CACM) show font0 setfont ( 36\0502\051, February, 1993, pp. 33-44.) show 82.3075 113.5392 moveto gsave font0 setfont ([Smith82] D. Smith, C. Irby, R. Kimball, B. Verplank, E. Harslem. ``Designing the STAR User) justify grestore 91.22881 101.4943 moveto font0 setfont (Interface.'' ) show font9 setfont (BYTE Magazine) show font0 setfont (, \0507\0514,) show font9 setfont ( ) show font0 setfont (April 1982, pp. 242-282.) show 82.3075 86.72413 moveto gsave font0 setfont ([Swinehart86] D. Swinehart, P. Zellweger, R. Beach, R. Hagmann. ``A Structural View of the) justify grestore grestore grestore % end page 24 showpage %%page 25 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (25) show 91.22881 713.8666 moveto /colwidth 425.474 def gsave font0 setfont opsbef 0 {font0 setfont} put (Cedar Programming Environment.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (ACM Transactions on) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put ( ) 2 buf opsaft 2 null put font9 setfont opsbef 3 {font9 setfont} put (Programming Languages and) 3 buf opsaft 3 null put mixedjustify grestore 91.22881 701.8220 moveto font9 setfont (Systems) show font0 setfont (, \0508\0514, October, 1986.) show 82.3075 687.7693 moveto /colwidth 450.0086 def gsave font0 setfont ([Weiser89] M. Weiser, A. Demers, C. Hauser. ``The Portable Common Runtime Approach to) justify grestore 91.22881 675.7245 moveto /colwidth 448.0232 def gsave font0 setfont opsbef 0 {font0 setfont} put (Interoperability.'' ) 0 buf opsaft 0 null put font9 setfont opsbef 1 {font9 setfont} put (Proceedings of the 12th ACM Symposium on Operating Systems Principles) 1 buf opsaft 1 null put font0 setfont opsbef 2 {font0 setfont} put (, in) 2 buf opsaft 2 null put mixedjustify grestore 91.22881 663.6795 moveto font9 setfont (Operating Systems Review, ) show font0 setfont (23\0505\051) show font9 setfont (, ) show font0 setfont (December 1989.) show font9 setfont ( ) show 72.26999 86.72406 moveto grestore grestore % end page 25 showpage %%page 26 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (26) show 72.26999 713.8666 moveto font8 setfont (Appendix: Summary of Cedar and GVX eternal threads. ) show 82.3075 678.9938 moveto /colwidth 456.9444 def gsave font0 setfont (These threads are created when Cedar or GVX is started and they never exit. These one line) justify grestore 82.3075 666.9487 moveto font0 setfont (descriptions give some sense of what long-lived threads are used for in these systems. ) show 82.3075 640.7941 moveto 82.3075 628.749 moveto font11 setfont 0.0 4.015 rmoveto (Cedar eternal thread descriptions:) show 0.0 -4.015 rmoveto font0 setfont 26.30108 0.0 rmoveto 82.3075 616.7043 moveto font0 setfont (0: Idler thread created by PCR to occupy its scheduler when nothing else is runnable.) show 82.3075 604.6591 moveto font0 setfont (1: Idler thread created by PCR to occupy its scheduler when nothing else is runnable.) show 82.3075 592.614 moveto font0 setfont (2: Unknown sleeper thread.) show 82.3075 580.569 moveto font0 setfont (3: Feedback window typescript thread.) show 82.3075 568.5242 moveto font0 setfont (4: Garbage collection daemon.) show 82.3075 556.4792 moveto font0 setfont (5: System daemon. Provides a proportional scheduling capability.) show 82.3075 544.4342 moveto font0 setfont (6: Finalization manager. Forks threads to handle finalization tasks when necessary.) show 82.3075 532.3893 moveto font0 setfont (7: Waits for Unix signals and feeds them to Cedar.) show 82.3075 520.3442 moveto font0 setfont (8: PFS file system cache sweeping thread.) show 82.3075 508.2992 moveto font0 setfont (9: Cache sweeper for Cedar's \050distributed\051 naming facilities.) show 82.3075 496.2543 moveto font0 setfont (10: SunRPCAuth housekeeping thread.) show 82.3075 484.2092 moveto font0 setfont (11: Serializer thread for window painting operations.) show 82.3075 472.1641 moveto font0 setfont (12: Serializer thread for window painting operations.) show 82.3075 460.119 moveto font0 setfont (13: Serializer thread for window painting operations.) show 82.3075 448.074 moveto font0 setfont (14: Caret blinking thread.) show 82.3075 436.0291 moveto font0 setfont (15: Serializer thread for window input events.) show 82.3075 423.9841 moveto font0 setfont (16: Serializer thread for window input events.) show 82.3075 411.939 moveto font0 setfont (17: Serializer thread for window input events.) show 82.3075 399.8941 moveto font0 setfont (18: Serializer thread for window input events.) show 82.3075 387.849 moveto font0 setfont (19: Manager thread for ForkOps package \050provides \042hot\042 threads for periodically executing ) show 82.3075 375.804 moveto font0 setfont ( and delayed execution tasks\051.) show 82.3075 363.759 moveto font0 setfont (20: Manager thread for CommTimer package \050provides a timeout service\051.) show 82.3075 351.714 moveto font0 setfont (21: Buffering thread for collecting bytes to be sent to the network.) show 82.3075 339.669 moveto font0 setfont (22: SUN YP name cache sweeper thread.) show 82.3075 327.624 moveto font0 setfont (23: Fake X server events generator \050for when the X server is quiescent\051.) show 82.3075 315.579 moveto font0 setfont (24: GC cursor thread. Waits until the GC-happening cursor should be shown and does so.) show 82.3075 303.5341 moveto font0 setfont (25: Unknown sleeper thread.) show 82.3075 291.4889 moveto font0 setfont (26: Serializer thread for typescript painting operations.) show 82.3075 279.444 moveto font0 setfont (27: Input serialization thread.) show 82.3075 267.399 moveto font0 setfont (28: Input event-to-function matcher thread.) show 82.3075 255.3539 moveto font0 setfont (29: Popup menu thread. Waits for popup requests and executes them.) show 82.3075 243.309 moveto font0 setfont (30: X server connection input events thread.) show 82.3075 231.2639 moveto font0 setfont (31: Buffered X server connection output thread.) show 82.3075 219.219 moveto font0 setfont (32: ForkOps thread, waiting for a task to execute.) show 82.3075 207.1739 moveto font0 setfont (33: Unknown.) show 82.3075 195.129 moveto font0 setfont (34: ForkOps thread, waiting for a task to execute.) show 82.3075 183.084 moveto font0 setfont (35: Commander typescript \050equivalent to a Unix shell\051 thread.) show 82.3075 171.0389 moveto font0 setfont (36: Clock thread.) show 82.3075 158.9939 moveto font0 setfont (37: ForkOps thread, waiting for a task to execute.) show 82.3075 146.949 moveto 82.3075 134.904 moveto font11 setfont 0.0 4.015 rmoveto (GVX eternal thread descriptions) show 0.0 -4.015 rmoveto font10 setfont 0.0 4.015 rmoveto (:) show 0.0 -4.015 rmoveto 82.3075 122.859 moveto font0 setfont (0: Idler thread created by PCR to occupy its scheduler when nothing else is runnable.) show 82.3075 110.814 moveto font0 setfont (1: PCR console reader thread.) show 82.3075 98.76898 moveto font0 setfont (2: System daemon.) show 82.3075 86.724 moveto font0 setfont (3: Finalization manager.) show grestore grestore % end page 26 showpage %%page 27 gsave 2834.646 2834.646 scale gsave 0.0254 dup matrix scale concat 0.013837 dup matrix scale concat font0 setfont 552.9706 746.79 moveto (27) show 82.3075 713.8666 moveto font0 setfont (4: GVX desktop events thread.) show 82.3075 701.8220 moveto font0 setfont (5: User abort thread. \050Only the System Daemon runs at higher priority.\051) show 82.3075 689.7769 moveto font0 setfont (6: Inactive session timeout thread.) show 82.3075 677.7321 moveto font0 setfont (7: Distributed sessions probe thread.) show 82.3075 665.687 moveto font0 setfont (8: Unknown.) show 82.3075 653.642 moveto font0 setfont (9: Display flusher thread.) show 82.3075 641.597 moveto font0 setfont (10: Network listener thread.) show 82.3075 629.552 moveto font0 setfont (11: Network listener thread.) show 82.3075 617.5073 moveto font0 setfont (12: Interrupt thread. \050Only the System Daemon runs at higher priority.\051) show 82.3075 605.4621 moveto font0 setfont (13: X server connection event reader thread.) show 82.3075 593.4171 moveto font0 setfont (14: X connection event matcher.) show 82.3075 581.372 moveto font0 setfont (15: X event dispatcher.) show 82.3075 569.3272 moveto font0 setfont (16: Background event handler.) show 82.3075 557.282 moveto font0 setfont (17: Input event-to-function matcher helper thread.) show 82.3075 545.2372 moveto font0 setfont (18: Input event-to-function matcher thread.) show 82.3075 533.1924 moveto font0 setfont (19: Unknown.) show 82.3075 521.147 moveto font0 setfont (20: Forked events manager thread.) show 82.3075 509.102 moveto font0 setfont (21: Free pages sweeper thread.) show 82.3075 497.0571 moveto font0 setfont (22: Cursor blinking thread.) show 72.26999 86.72421 moveto grestore grestore % end page 27 showpage %%Trailer %%Pages: 27