%!PS-Adobe-2.0 %%Creator: dvips, version 5.396 (C) 1986-90 Radical Eye Software %%Title: final.dvi %%Pages: 4 1 %%BoundingBox: 0 0 612 792 %%DocumentFonts: Times-Bold Times-Roman Times-Italic Courier %%EndComments %%BeginProcSet: tex.pro /TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{ isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale Resolution VResolution vsize neg mul TR}B /@letter{/vsize 10 N}B /@landscape{ /isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@legal{/vsize 13 N} B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[ 1 0 0 -1 0 0]N /FBB[0 0 0 0]N /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /E{pop nn dup definefont setfont}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ctr 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{ ]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto}B /eop{ clear SI restore showpage userdict /eop-hook known{eop-hook}if}B /@start{ userdict /start-hook known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for} B /p /show load N /RMat[1 0 0 -1 0 0]N /BDot 8 string N /v{/ruley X /rulex X V }B /V{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{ 1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w }B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /w{0 rmoveto}B /x{0 S rmoveto} B /y{3 2 roll p a}B /bos{/SS save N}B /eos{clear SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro TeXDict begin /rf{655360 div mul Resolution mul 7227 div /PixPerEm X findfont dup length 1 add dict /nn X{1 index /FID ne{nn 3 1 roll put}{pop pop}ifelse} forall 256 dict begin nn /Encoding get 0 1 255{2 copy get 3 index 2 index get 1000 mul PixPerEm div N pop}for pop pop nn /Metrics currentdict put end /fontname X /nn dup nn definefont[PixPerEm 0 0 PixPerEm neg 0 0]makefont N fontname{/foo setfont}2 array copy cvx N fontname load 0 nn put}B /ObliqueSlant{dup sin S cos div neg}B /SlantFont{/foo X[1 0 foo 1 0 0] TransFont}B /ExtendFont{/foo X 3 2 roll[S{foo div}forall]3 1 roll[foo 0 0 1 0 0]TransFont}B /TransFont{S findfont S makefont dup length dict /nn X{1 index /FID ne{nn 3 1 roll put}{pop pop}ifelse}forall dup nn definefont pop}B end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N }B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true N}B /@hoffset{ /ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X}B /@llx{/llx X} B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{ transform{itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale} if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if}if}N /normalscale {Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if} N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N @MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults}B /@setspecial{CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}{initclip}ifelse ho vo TR hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}B /@endspecial{grestore clear SpecialSave restore end}B /@defspecial{SDict begin}B /@fedspecial{end}B /li{ lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 setlinecap newpath}B /st{stroke SaveX SaveY moveto}B /fil{fill SaveX SaveY moveto}B /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}B end %%EndProcSet TeXDict begin 1000 300 300 @start /Fa [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 25 25 25 25 0 25 25 25 25 25 25 25 0 0 25 0 25 25 25 25 25 25 25 25 0 25 25 0 25 25 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 25 25 0 25 0 0 0 0 0 0 0 0 0 25 0 0 25 25 0 25 0 0 0 0 ] /Courier 1000 655360 rf /Fb [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 11 14 17 17 28 26 11 11 11 17 19 8 11 8 9 17 17 17 17 17 17 17 17 17 17 9 9 19 19 19 15 31 24 22 22 24 20 18 24 24 11 13 24 20 30 24 24 18 24 22 18 20 24 24 31 24 24 20 11 9 11 16 17 11 15 17 15 17 15 11 17 17 9 9 17 9 26 17 17 17 17 11 13 9 17 17 24 17 17 15 16 7 16 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 17 17 6 17 17 17 17 6 15 17 11 11 18 18 0 17 17 17 8 0 15 12 11 15 15 17 33 33 0 15 0 11 11 11 11 11 11 11 11 0 11 11 0 11 11 11 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 9 0 0 0 0 20 24 30 10 0 0 0 0 0 22 0 0 0 9 0 0 9 17 24 17 0 0 0 0 ] /Times-Roman 1000 524288 rf /Fc [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 10 12 12 21 19 8 8 8 12 14 6 8 6 7 12 12 12 12 12 12 12 12 12 12 7 7 14 14 14 11 23 18 17 17 18 15 14 18 18 8 10 18 15 22 18 18 14 18 17 14 15 18 18 24 18 18 15 8 7 8 12 12 8 11 12 11 12 11 8 12 12 7 7 12 7 19 12 12 12 12 8 10 7 12 12 18 12 12 11 12 5 12 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 12 12 4 12 12 12 12 4 11 12 8 8 14 14 0 12 12 12 6 0 11 9 8 11 11 12 25 25 0 11 0 8 8 8 8 8 8 8 8 0 8 8 0 8 8 8 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 0 7 0 0 0 0 15 18 22 8 0 0 0 0 0 17 0 0 0 7 0 0 7 12 18 12 0 0 0 0 ] /Times-Roman 1000 393216 rf /Fd [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 10 12 15 15 24 23 10 10 10 15 16 7 10 7 8 15 15 15 15 15 15 15 15 15 15 8 8 16 16 16 13 27 21 19 19 21 18 16 21 21 10 11 21 18 26 21 21 16 21 19 16 18 21 21 27 21 21 18 10 8 10 14 15 10 13 15 13 15 13 10 15 15 8 8 15 8 23 15 15 15 15 10 11 8 15 15 21 15 15 13 14 6 14 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 15 15 5 15 15 15 15 5 13 15 10 10 16 16 0 15 15 15 7 0 13 10 10 13 13 15 29 29 0 13 0 10 10 10 10 10 10 10 10 0 10 10 0 10 10 10 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0 8 0 0 0 0 18 21 26 9 0 0 0 0 0 19 0 0 0 8 0 0 8 15 21 15 0 0 0 0 ] /Times-Roman 1000 458752 rf /Fe [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 14 17 21 21 35 32 14 14 14 21 23 10 14 10 12 21 21 21 21 21 21 21 21 21 21 12 12 23 23 23 18 38 30 28 28 30 25 23 30 30 14 16 30 25 37 30 30 23 30 28 23 25 30 30 39 30 30 25 14 12 14 19 21 14 18 21 18 21 18 14 21 21 12 12 21 12 32 21 21 21 21 14 16 12 21 21 30 21 21 18 20 8 20 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 21 21 7 21 21 21 21 7 18 21 14 14 23 23 0 21 21 21 10 0 19 15 14 18 18 21 42 42 0 18 0 14 14 14 14 14 14 14 14 0 14 14 0 14 14 14 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 11 0 0 0 0 25 30 37 13 0 0 0 0 0 28 0 0 0 12 0 0 12 21 30 21 0 0 0 0 ] /Times-Roman 1000 655360 rf /Ff [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 17 28 25 25 50 41 17 17 17 25 28 12 17 12 14 25 25 25 25 25 25 25 25 25 25 17 17 28 28 28 25 46 36 33 36 36 33 30 39 39 19 25 39 33 47 36 39 30 39 36 28 33 36 36 50 36 36 33 17 14 17 29 25 17 25 28 22 28 22 17 25 28 14 17 28 14 41 28 25 28 28 22 19 17 28 25 36 25 25 22 20 11 20 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 25 25 8 25 25 25 25 14 25 25 17 17 28 28 0 25 25 25 12 0 27 17 17 25 25 25 50 50 0 25 0 17 17 17 17 17 17 17 17 0 17 17 0 17 17 17 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 15 0 0 0 0 33 39 50 16 0 0 0 0 0 36 0 0 0 14 0 0 14 25 36 28 0 0 0 0 ] /Times-Bold 1000 786432 rf /Fg [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 14 17 21 21 35 32 14 14 14 21 28 10 14 10 12 21 21 21 21 21 21 21 21 21 21 14 14 28 28 28 21 38 25 25 28 30 25 25 30 30 14 18 28 23 35 28 30 25 30 25 21 23 30 25 35 25 23 23 16 12 16 18 21 14 21 21 18 21 18 12 21 21 12 12 18 12 30 21 21 21 21 16 16 12 21 18 28 18 18 16 17 11 17 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 21 21 7 21 21 21 21 9 23 21 14 14 21 21 0 21 21 21 10 0 22 15 14 23 23 21 37 42 0 21 0 14 14 14 14 14 14 14 14 0 14 14 0 14 14 14 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 11 0 0 0 0 23 30 39 13 0 0 0 0 0 28 0 0 0 12 0 0 12 21 28 21 0 0 0 0 ] /Times-Italic 1000 655360 rf /Fh [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 15 25 23 23 45 38 15 15 15 23 26 11 15 11 13 23 23 23 23 23 23 23 23 23 23 15 15 26 26 26 23 42 33 30 33 33 30 28 35 35 18 23 35 30 43 33 35 28 35 33 25 30 33 33 45 33 33 30 15 13 15 26 23 15 23 25 20 25 20 15 23 25 13 15 25 13 38 25 23 25 25 20 18 15 25 23 33 23 23 20 18 10 18 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 23 23 8 23 23 23 23 13 23 23 15 15 25 25 0 23 23 23 11 0 25 16 15 23 23 23 45 45 0 23 0 15 15 15 15 15 15 15 15 0 15 15 0 15 15 15 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 0 14 0 0 0 0 30 35 45 15 0 0 0 0 0 33 0 0 0 13 0 0 13 23 33 25 0 0 0 0 ] /Times-Bold 1000 717619 rf /Fi [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 17 20 25 25 41 39 17 17 17 25 28 12 17 12 14 25 25 25 25 25 25 25 25 25 25 14 14 28 28 28 22 46 36 33 33 36 30 28 36 36 17 19 36 30 44 36 36 28 36 33 28 30 36 36 47 36 36 30 17 14 17 23 25 17 22 25 22 25 22 17 25 25 14 14 25 14 39 25 25 25 25 17 19 14 25 25 36 25 25 22 24 10 24 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 25 25 8 25 25 25 25 9 22 25 17 17 28 28 0 25 25 25 12 0 23 17 17 22 22 25 50 50 0 22 0 17 17 17 17 17 17 17 17 0 17 17 0 17 17 17 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 0 14 0 0 0 0 30 36 44 15 0 0 0 0 0 33 0 0 0 14 0 0 14 25 36 25 0 0 0 0 ] /Times-Roman 1000 786432 rf /Fj [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 20 33 30 30 60 50 20 20 20 30 34 15 20 15 17 30 30 30 30 30 30 30 30 30 30 20 20 34 34 34 30 56 43 40 43 43 40 37 47 47 23 30 47 40 56 43 47 37 47 43 33 40 43 43 60 43 43 40 20 17 20 35 30 20 30 33 27 33 27 20 30 33 17 20 33 17 50 33 30 33 33 27 23 20 33 30 43 30 30 27 24 13 24 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 30 30 10 30 30 30 30 17 30 30 20 20 33 33 0 30 30 30 15 0 32 21 20 30 30 30 60 60 0 30 0 20 20 20 20 20 20 20 20 0 20 20 0 20 20 20 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 0 18 0 0 0 0 40 47 60 20 0 0 0 0 0 43 0 0 0 17 0 0 17 30 43 33 0 0 0 0 ] /Times-Bold 1000 943718 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 300 TeXDict begin @letter %%EndSetup %%Page: 1 1 bop 140 158 a Fj(Object-Orie)o(nted)12 b(Interfaces)i(in)h(the)f(Mach)h(3.0)g (Multi-Server)e(System)340 278 y Fi(Paulo)f(Guedes)641 b(Daniel)12 b(P)-6 b(.)13 b(Julin)247 336 y(OSF)f(Research)h(Institute)405 b(School)11 b(of)h(Computer)g(Science)264 394 y(11)g(Cambridge)g(Center)428 b(Carnegie)12 b(Mellon)g(University)240 452 y(Cambridge,)g(MA)25 b(02142)466 b(Pittsbur)o(gh,)11 b(P)-5 b(A)25 b(15213)354 511 y(pjg@osf.or)o(g)630 b(dpj@cs.cmu.edu)344 673 y Fh(Abstract)-7 773 y Fg(The)9 b(Mach)f(3.0)h(multi-server)g(system)g(decomposes)g(the)g (func-)-57 823 y(tionality)e(of)h(the)h(operating)f(system)i(between)f(a)g (micro-kernel,)h(a)-57 873 y(set)i(of)e(system)i(servers)i(running)c(in)h (user-mode)g(and)g(an)g(emula-)-57 923 y(tion)d(library)h(executing)h(in)f (the)g(address)h(space)g(of)f(applications.)-57 972 y(The)k(interfaces)g (provided)g(by)h(the)e(system)i(servers)h(are)f(object-)-57 1022 y(oriented)8 b(and)f(both)h(the)g(servers)i(and)e(the)g(emulation)e (library)i(are)-57 1072 y(written)h(in)h(an)g(object-oriented)f(language.)-7 1122 y(In)g(this)g(paper)h(we)g(present)h(how)e(the)h(interfaces)f(between)h (the)-57 1172 y(components)15 b(are)h(specified)f(and)g(implemented)g(to)g (guarantee)-57 1221 y(consistency)d(and)f(early)i(detection)e(of)g(errors,)i (yet)g(maintainin)o(g)-57 1271 y(the)c(flexibility)e(to)i(extend)h(and)f (configure)f(the)h(system)h(by)g(adding)-57 1321 y(new)g(or)h(modified)d (servers)k(without)c(affecting)h(existing)h(pieces.)-57 1479 y Ff(1)50 b(Intr)o(oduction)-7 1579 y Fe(A)10 b(current)f(trend)h(in)f (operating)g(system)h(design)g(is)f(to)h(attempt)-57 1629 y(to)j(distribute)e (the)i(complete)h(system)f(functionality)e(between)j(a)-57 1678 y(micro-kernel)f(and)g(a)h(set)f(of)g(system)g(servers)h(executing)f(in) f(us-)-57 1728 y(er)h(mode)f(and)g(communicating)g(by)g(message)i(exchange)f ([6,)f(1].)-57 1778 y(This)g(approach)h(provides)f(a)h(clean)g(separation)f (between)h(the)g(d-)-57 1828 y(if)o(ferent)d(parts)f(of)h(the)g(system,)h (thus)e(easing)h(their)f(development,)-57 1878 y(maintenance)j(and)g (extension.)18 b(Most)11 b(of)g(the)g(operating)g(system)-57 1928 y(functionality)f(is)i(provided)f(by)h(the)g(servers)h(and)g(can)g(be)f (devel-)-57 1977 y(oped)e(and)g(tested)h(like)e(any)i(user)f(application.)-7 2027 y(Object-oriented)h(programming)g(provides)g(another)h(dimen-)-57 2077 y(sion)f(of)h(software)g(development)f(tools)g(to)g(help)h(meet)g(the)g (same)-57 2127 y(objectives)f(of)h(easier)h(development,)f(maintenance)h(and) e(exten-)-57 2177 y(sibility)m(.)17 b(One)12 b(way)g(to)f(apply)g(these)i (tools)d(to)h(operating)g(system)-57 2226 y(design)e(is)h(to)f(de\256ne)i(an) f(object-oriented)e(model)i(for)f(all)g(interac-)-57 2276 y(tions)g(between)i (clients)g(of)f(the)g(operating)g(system)h(and)f(that)g(sys-)-57 2326 y(tem)e(itself,)f(and)h(to)e(use)i(object-oriented)e(techniques)h(to)g (structure)-57 2376 y(those)j(interactions.)-7 2426 y(The)k(Mach)g(3.0)f (multi-server)f(system)i(uses)g(both)e(these)i(ap-)-57 2476 y(proaches)f(to)f(operating)g(system)h(construction.)21 b(The)13 b(function-)-57 2525 y(ality)g(of)g(the)g(operating)g(system)h(is)g(provided) e(by)h(a)h(three-layer)-57 2575 y(architecture)g(composed)g(of)g(a)h (micro-kernel,)f(a)h(set)f(of)g(system)-57 2625 y(servers)k(and)f(emulation)g (libraries)f(executing)h(in)g(the)g(address)1013 673 y(space)i(of)e(user)h (programs.)37 b(The)19 b(interactions)d(between)i(sys-)1013 723 y(tem)10 b(components)f(are)h(de\256ned)f(using)g(an)h(object-oriented)d (mod-)1013 773 y(el,)16 b(and)e(the)h(system)f(itself)g(is)g(implemented)g (using)g(an)h(object-)1013 823 y(oriented)9 b(language.)1063 873 y(The)i(next)g(section)f(presents)i(a)f(brief)g(overview)f(of)h(the)f (Mach)1013 922 y(3.0)j(multi-server)n(.)22 b(The)14 b(rest)f(of)g(the)g (paper)g(describes)h(how)e(the)1013 972 y(interfaces)f(exported)f(by)h(the)f (servers)i(are)f(speci\256ed)h(and)f(imple-)1013 1022 y(mented)h(in)f(C++.)21 b(Static-type)11 b(checking)h(is)f(used)h(to)g(guarantee)1013 1072 y(consistency)j(and)g(early)g(detection)f(of)h(errors,)i(yet)e(the)g (system)1013 1122 y(is)10 b(\257exible)f(enough)g(to)h(allow)f(independent)g (development)g(of)h(its)1013 1171 y(components)e(and)h(can)h(be)f(extended)f (and)h(con\256gured)g(by)f(adding)1013 1221 y(new)j(or)g(modi\256ed)g (servers)h(without)d(af)o(fecting)i(other)g(servers)g(or)1013 1271 y(the)f(emulation)f(library)m(.)1013 1424 y Ff(2)50 b(Ar)o(chitectur)o (e)1063 1519 y Fe(The)9 b("multi-server)e(emulation)g(system")i(for)e(Mach)i (3.0)g([8)o(])f(is)1013 1569 y(a)g(research)i(system)e(that)g(combines)g(the) g(use)g(of)g(several)h(indepen-)1013 1619 y(dent)g(servers)h(and)g(an)f (object-oriented)f(approach.)15 b(The)c(primary)1013 1668 y(goal)h(of)g(the)h (project)e(is)i(to)f(provide)f(a)i(generic)g(architecture)g(for)1013 1718 y(the)f(emulation)f(of)i(dif)o(ferent)e(operating)g(systems.)22 b(The)13 b(current)1013 1768 y(prototype)f(provides)g(binary)h(compatibility) e(with)h(UNIX)1888 1753 y Fd(1)1918 1768 y Fe(BS-)1013 1818 y(D)j(4.3.)29 b(There)16 b(are)g(three)f(major)g(layers)g(\(see)h(Figure)f (1.\).)29 b(At)1013 1868 y(the)10 b(bottom)f(is)h(a)h(standard)e(Mach)i(3.0)f (micro-kernel,)h(providing)1013 1917 y(the)e(basic)g(Mach)h(abstractions:)j (virtual)8 b(memory)i(management,)1013 1967 y(inter)o(-process)d (communication,)i(task)f(management)h(and)f(device)1013 2017 y(handling)g([4].)1063 2067 y(Next)j(comes)i(a)f(collection)e(of)h(mostly)g (generic)g(servers)i(exe-)1013 2117 y(cuting)e(as)i(tasks)g(in)e(user)i (mode,)g(that)f(implement)g(all)g(the)g(high-)1013 2166 y(level)7 b(functionality)t(required)g(of)g(a)h(complete)f(operating)f(system,)1013 2216 y(independent)17 b(of)h(any)h(given)f(system')n(s)g(interface:)31 b(\256le)19 b(man-)1013 2266 y(agement,)13 b(process)g(management,)h (networking,)d(etc.)21 b(Many)12 b(of)1013 2316 y(those)7 b(servers)i(are)f (written)f(speci\256cally)h(for)f(use)h(within)e(this)h(sys-)1013 2366 y(tem,)13 b(using)d(an)j(object-oriented)d(structure)h(and)h(a)g (collection)e(of)1013 2416 y(re-usable)g(classes)i(to)e(simplify)e(their)i (development.)1063 2465 y(Finally)m(,)d(the)g(third)f(and)i(higher)f(layer)g (consists)g(of)g(a)h(collection)1013 2515 y(of)f(emulation)g(libraries)g (executing)g(in)h(the)f(address)i(spaces)g(of)e(us-)p 1013 2546 389 2 v 1058 2574 a Fc(1)1073 2586 y Fb(UNIX)h(is)g(a)g(registered)f (trademark)g(of)h(UNIX)g(System)g(Laboratories)f(in)h(the)1013 2625 y(United)g(States)g(and)f(other)h(countries.)p eop %%Page: 2 2 bop -57 709 a @beginspecial -300 @voffset -100 @hoffset 64 @hscale 64 @vscale @setspecial %%BeginDocument: fig1.ps /__NXdef{1 index where{pop pop pop}{def}ifelse}bind def /__NXbdef{1 index where{pop pop pop}{bind def}ifelse}bind def /UserObjects 10 array __NXdef /defineuserobject{ exch dup 1 add dup UserObjects length gt{ array dup 0 UserObjects putinterval /UserObjects exch def }{pop}ifelse UserObjects exch 3 -1 roll put }__NXbdef /undefineuserobject{UserObjects exch null put}__NXbdef /execuserobject{UserObjects exch get exec}__NXbdef /__NXRectPath{4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath}__NXbdef /__NXProcessRectArgs{ 1 index type /arraytype eq{ exch 0 4 2 index length 1 sub{ dup 3 add 1 exch{1 index exch get exch}for 5 1 roll 5 index exec }for pop pop }{exec}ifelse }__NXbdef /rectfill{gsave newpath {__NXRectPath fill} __NXProcessRectArgs grestore}__NXbdef /rectclip{newpath {__NXRectPath} __NXProcessRectArgs clip newpath}__NXbdef /rectstroke{ gsave newpath dup type /arraytype eq{dup length 6 eq}{false}ifelse{ {gsave __NXRectPath null concat stroke grestore} dup length array cvx copy dup 2 4 -1 roll put __NXProcessRectArgs }{{__NXRectPath stroke} __NXProcessRectArgs}ifelse grestore }__NXbdef /xyshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show 3 index 3 index 2 mul 1 add get add exch 3 index 3 index 2 mul get add exch moveto pop }for pop pop }__NXbdef /xshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show exch 3 index 3 index get add exch moveto pop }for pop pop }__NXbdef /yshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show 3 index 3 index get add moveto pop }for pop pop }__NXbdef /arct{arcto pop pop pop pop}__NXbdef /setbbox{pop pop pop pop}__NXbdef /ucache{}__NXbdef /ucachestatus{mark 0 0 0 0 0}__NXbdef /setucacheparams{cleartomark}__NXbdef /uappend{systemdict begin cvx exec end}__NXbdef /ueofill{gsave newpath uappend eofill grestore}__NXbdef /ufill{gsave newpath uappend fill grestore}__NXbdef /ustroke{ gsave newpath dup length 6 eq {exch uappend concat}{uappend}ifelse stroke grestore }__NXbdef /__NXustrokepathMatrix dup where {pop pop}{matrix def}ifelse /ustrokepath{ newpath dup length 6 eq{ exch uappend __NXustrokepathMatrix currentmatrix exch concat strokepath setmatrix }{uappend strokepath}ifelse } __NXbdef /upath{ [exch {/ucache cvx}if pathbbox /setbbox cvx {/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx}pathforall]cvx } __NXbdef /setstrokeadjust{pop}__NXbdef /currentstrokeadjust{false}__NXbdef /selectfont{exch findfont exch dup type /arraytype eq {makefont}{scalefont}ifelse setfont}__NXbdef /_NXCombineArrays{ counttomark dup 2 add index dup length 3 -1 roll { 2 index length sub dup 4 1 roll 1 index exch 4 -1 roll putinterval exch }repeat pop pop pop }__NXbdef /setcmykcolor{ 1.0 exch sub dup dup 6 -1 roll sub dup 0 lt{pop 0}if 5 1 roll 4 -1 roll sub dup 0 lt{pop 0}if 3 1 roll exch sub dup 0 lt{pop 0}if setrgbcolor }__NXbdef /currentcmykcolor{currentrgbcolor 3{1.0 exch sub 3 1 roll}repeat 0}__NXbdef /flushgraphics{}def /setwindowtype{pop pop}def /currentwindowtype{pop 0}def /setalpha{pop}def /currentalpha{1.0}def /hidecursor{}def /obscurecursor{}def /revealcursor{}def /setcursor{4 {pop}repeat}bind def /showcursor{}def /NextStepEncoding where not{ /NextStepEncoding StandardEncoding 256 array copy def 0 [129/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/Ccedilla/Egrave /Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/Ugrave/Uacute /Ucircumflex/Udieresis/Yacute/Thorn/mu/multiply/divide/copyright 176/registered 181/brokenbar 190/logicalnot 192/onesuperior 201/twosuperior 204/threesuperior 209/plusminus/onequarter/onehalf/threequarters/agrave /aacute/acircumflex/atilde/adieresis/aring/ccedilla/egrave/eacute /ecircumflex/edieresis/igrave 226/iacute 228/icircumflex/idieresis/eth /ntilde 236/ograve/oacute/ocircumflex/otilde/odieresis 242/ugrave/uacute /ucircumflex 246/udieresis/yacute 252/thorn/ydieresis] {dup type /nametype eq {NextStepEncoding 2 index 2 index put pop 1 add}{exch pop}ifelse }forall pop /NextStepEncoding NextStepEncoding readonly def /_NXfstr 128 string dup 0 (_NX) putinterval def /findfont{ % Because we can never let NextStepEncoding get into % SharedFontDirectory, we cannot reencode a font to NextStepEncoding % if we are in shared mode. So if currentshared is true, % we call the normal findfont and return that /currentshared where {pop currentshared} {false} ifelse {//findfont exec} {dup _NXfstr 3 125 getinterval cvs length 3 add _NXfstr 0 3 -1 roll getinterval cvn exch FontDirectory 2 index known {pop FontDirectory exch get} {//findfont exec dup /Encoding get StandardEncoding eq { dup length dict exch {1 index /FID ne {2 index 3 1 roll put}{pop pop}ifelse}forall dup /Encoding NextStepEncoding put definefont }{exch pop} ifelse }ifelse }ifelse }bind def }{pop}ifelse /_NXProcArray 5 array __NXdef /_NXChannels 0 __NXdef /_NXTotalBytes 0 __NXdef /_NXDoImageOp{ 1 index{dup}{1}ifelse /_NXChannels exch store _NXChannels 2 add 2 roll _NXProcArray 0 _NXChannels getinterval astore pop 5 index 4 index mul 2 index{1 sub 8 idiv 1 add mul}{mul 1 sub 8 idiv 1 add}ifelse 4 index mul /_NXTotalBytes exch store pop exch pop gsave matrix invertmatrix concat 0.5 setgray 0 0 4 2 roll rectfill grestore { 0 1 _NXChannels 1 sub{ _NXProcArray exch get exec length _NXTotalBytes exch sub /_NXTotalBytes exch store}for _NXTotalBytes 0 le{exit}if }loop /_NXProcArray 5 array def }__NXbdef /colorimage{_NXDoImageOp}__NXbdef /alphaimage{1 add _NXDoImageOp}def /landscape false def /t300 [0.000 0.006 0.011 0.017 0.022 0.028 0.033 0.039 0.045 0.050 0.056 0.061 0.067 0.073 0.078 0.084 0.089 0.095 0.101 0.117 0.133 0.148 0.164 0.179 0.195 0.210 0.225 0.240 0.255 0.270 0.285 0.299 0.314 0.329 0.344 0.359 0.374 0.389 0.404 0.419 0.435 0.451 0.466 0.482 0.498 0.513 0.529 0.544 0.560 0.576 0.591 0.610 0.632 0.654 0.677 0.699 0.721 0.744 0.766 0.788 0.821 0.866 0.911 0.955 1.000 ] def /t400 [0.000 0.003 0.006 0.009 0.012 0.014 0.017 0.020 0.023 0.026 0.029 0.032 0.035 0.038 0.041 0.043 0.046 0.049 0.056 0.063 0.071 0.079 0.087 0.095 0.104 0.117 0.130 0.143 0.157 0.173 0.189 0.205 0.225 0.245 0.259 0.272 0.285 0.298 0.314 0.329 0.345 0.361 0.376 0.392 0.407 0.423 0.439 0.454 0.470 0.486 0.502 0.528 0.554 0.580 0.605 0.628 0.650 0.672 0.695 0.727 0.762 0.796 0.857 0.922 1.000 ] def /tlinear [0.000 0.016 0.031 0.047 0.062 0.078 0.094 0.109 0.125 0.141 0.156 0.172 0.188 0.203 0.219 0.234 0.250 0.266 0.281 0.297 0.312 0.328 0.344 0.359 0.375 0.391 0.406 0.422 0.438 0.453 0.469 0.484 0.500 0.516 0.531 0.547 0.562 0.578 0.594 0.609 0.625 0.641 0.656 0.672 0.688 0.703 0.719 0.734 0.750 0.766 0.781 0.797 0.812 0.828 0.844 0.859 0.875 0.891 0.906 0.922 0.938 0.953 0.969 0.984 1.000 ] def /dmatrix matrix def /desiredpat 0 def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul exch dup mul add sqrt round def /freq dpi 18.75 div 8 div round dup 0 eq { pop 1 } if 8 mul dpi exch div def /sangle 1 0 dmatrix defaultmatrix dtransform exch atan def /graymode true def /pats 16 array def /mymatrix matrix def /savedgray 0 def /F /fill load def /rc /rectclip load def /GS /gsave load def /GR /grestore load def /SL /setlinewidth load def /SC /setlinecap load def /CS { closepath S } bind def /A /strokepath load def /TR /translate load def /M /moveto load def /C /closepath load def /smat { mymatrix currentmatrix pop } bind def /rmat { mymatrix setmatrix } bind def /sp { P exch get exec } bind def systemdict /setshared known { 300 dpi eq { /tran t300 def } { /tran t400 def } ifelse } { /tran tlinear def } ifelse systemdict /xshow known not { /xhow { /pts exch def /str exch def 0 1 str length 1 sub { currentpoint 3 -1 roll str 1 index 1 getinterval show 3 1 roll moveto pts exch get 0 rmoveto } for } bind def } { /xhow { checkink xshow } bind def } ifelse systemdict /xyshow known not { /xyhow { /pts exch def /str exch def 0 1 str length 1 sub { currentpoint 3 -1 roll str 1 index 1 getinterval show 3 1 roll moveto 2 mul pts 1 index get pts 3 -1 roll 1 add get rmoveto } for } bind def } { /xyhow { checkink xyshow } bind def } ifelse /PrintInColor systemdict /colorimage known def PrintInColor { /HUE 0 def /SAT 0 def /BRIGHT 0 def /Colors [[0 0 ] [0 0 ] [0.00 1.0] [0.37 1.0] [0.60 1.0] [0.50 1.0] [0.83 1.0] [0.16 1.0] ] def /K { Colors exch get dup 0 get /HUE exch store 1 get /BRIGHT exch store HUE 0 eq BRIGHT 0 eq and {1.0 SAT sub setgray } {HUE SAT BRIGHT sethsbcolor } ifelse } def /mysetgray { /SAT exch 1.0 exch sub store HUE 0 eq BRIGHT 0 eq and {1.0 SAT sub setgray } {HUE SAT BRIGHT sethsbcolor } ifelse } bind def } { /mysetgray /setgray load def /K /pop load def } ifelse /setpattern { /bwidth exch def /bpside exch def /bstring exch def /onbits 0 def /offbits 0 def freq sangle landscape {90 add} if {/y exch def /x exch def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen tran offbits 64 mul offbits onbits add div cvi get mysetgray } bind def /myfonts [] def /procarray 30 array def 3.86 setmiterlimit currentscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def /currentpat -1 def /checkpat { graymode currentpat desiredpat ne or { pats desiredpat get exec /graymode false store /currentpat desiredpat store } if } bind def /Z { checkpat fill } bind def /checkink { graymode not { orgfreq organgle orgproc cvx setscreen /graymode true store savedgray mysetgray } if } bind def /F { checkink fill } bind def /dorectfill { checkink rectfill } bind def /dorectstroke { checkink rectstroke } bind def /S { checkink stroke } bind def /G { /savedgray exch def savedgray mysetgray } def /makecontextpattern { exch pop [null 8 1 /setpattern cvx] 4 array copy dup 0 5 -1 roll put cvx pats 3 1 roll put } def /P [ 0 1 15 { [ /desiredpat 3 -1 roll /store cvx ] cvx } for ] def /patoffsetx 0 def /patoffsety 0 def /currentpat null def /DiacriticEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve /ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex /udieresis /dagger /.notdef /cent /sterling /section /bullet /paragraph /germandbls /registered /copyright /trademark /acute /dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef /yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown /exclamdown /logicalnot /.notdef /florin /.notdef /.notdef /guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde /Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis /fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron ] def /DiacriticEncode { /basefontdict exch def /newfontdict basefontdict maxlength 2 add dict def basefontdict {exch dup /FID ne {dup /Encoding eq {exch pop DiacriticEncoding } {exch} ifelse newfontdict 3 1 roll put } {pop pop} ifelse } forall newfontdict } def /line { pop pop pop pop } def /rrectpath { smat 4 2 roll TR /h exch def /w exch def /r exch def mark r 0 M w 0 w h r arcto w h 0 h r arcto 0 h 0 0 r arcto 0 0 w 0 r arcto C cleartomark rmat } def /RF { rrectpath F } bind def /RP { checkpat rrectpath fill } bind def /RS { rrectpath S } bind def /RQ { checkpat rrectpath A fill } bind def /NF { dorectfill } bind def /NR { checkpat 4 2 roll rectfill } bind def /W { savedgray 5 1 roll 1.0 G dorectfill G } bind def /invertbox { pop pop pop pop } def /highbox { pop pop pop pop } def /PP { newpath 3 1 roll M 1 sub { lineto } repeat } bind def /SP { 3 1 roll M 3 div cvi { curveto } repeat } bind def /rectpath { M dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto C } def /N { dorectstroke } bind def /NQ { checkpat 4 2 roll rectstroke } bind def /drawip { pop pop pop } bind def /eraseip { pop pop pop } bind def /highip { pop pop pop pop } def /insideedgebox { pop pop pop pop pop } def /replbox { pop pop pop pop pop pop } def /pop4 { pop pop pop pop } def /graybox { pop4 } def /darkgraybox { pop4 } def /arcpath { newpath TR /h exch def /w exch def /dth exch def /th exch def 90 th dth add sub 90 th sub dth 0 lt { exch } if 1 h w div neg scale 0 0 w 2 div 5 -2 roll arc } def /AS { smat arcpath rmat S } bind def /AP { checkpat smat arcpath rmat A fill } bind def /AF { smat arcpath 0 0 lineto rmat F } bind def /AQ { checkpat smat arcpath 0 0 lineto rmat fill } bind def /mymakefont { /size exch def /name exch def /i exch def /myfontdict name cvn findfont def myfontdict /Encoding get dup StandardEncoding eq exch /NextStepEncoding where { pop NextStepEncoding eq or }{ pop } ifelse { myfontdict DiacriticEncode /gfontdict exch def /gfontdict (F ) dup 1 i ( ) cvs putinterval cvn gfontdict definefont def } { /gfontdict myfontdict def } ifelse /myfonts [ myfonts aload pop null ] def myfonts i gfontdict [size 0 0 size neg 0 0 ] makefont put } def /FF { myfonts exch get setfont } bind def /CR { initclip newpath 4 2 roll M dup 0 exch rlineto exch 0 rlineto 0 exch neg rlineto C clip newpath } bind def /cliptowindow { initclip } def /beginprintcode { GS newpath 1 setlinewidth 0 SL 0 setlinejoin [] 0 setdash 0 setgray 10 setmiterlimit /FMdicttop countdictstack 1 add def /FMoptop count 7 sub def 200 dict begin TR dup neg scale 0.0 0.0 M } def /endprintcode { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for GR } def /beginPSInsetprintcode { /pinsetsave save def newpath 1 setlinewidth 0 setlinecap 0 setlinejoin [] 0 setdash 0 setgray 10 setmiterlimit /showpage {} def /FMdicttop countdictstack 1 add def /FMoptop count def 200 dict begin /showimage {} def } def /endPSInsetprintcode { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for pinsetsave restore } def /cacheimage { /flip exch def /theta exch def /bps exch def /h exch def /w exch def /destHeight exch def /destWidth exch def /destY exch def /destX exch def /rowbytes w bps mul 7 add 8 idiv def /buffer rowbytes string def GS destX destY TR theta rotate flip {destWidth neg destHeight scale} {destWidth destHeight scale} ifelse w h bps [w 0 0 h 0 h ] { currentfile buffer readhexstring pop } bind image GR } def <0f1e3c78f0e1c387> (I14a1f0) 8 makecontextpattern <0f87c3e1f0783c1e> (I14a20c) 9 makecontextpattern (I14a228) 10 makecontextpattern (I14a244) 11 makecontextpattern <8142241818244281> (I14a260) 12 makecontextpattern <03060c183060c081> (I14a27c) 13 makecontextpattern <8040201008040201> (I14a298) 14 makecontextpattern gsave -1 -9 translate /__NXbasematrix matrix currentmatrix def grestore /__NXsheetsavetoken save def 0 0 translate gsave /__NXbasematrix matrix currentmatrix def grestore gsave 0 0 612 792 rectclip [1 0 0 -1 0 792] concat 0 0 translate gsave 0 0 612 792 rectclip /landscape false def 0 0 612 792 CR 1 G 108 36 432 15.192001 NF 0 G 0 (Times-Roman) 8 mymakefont 0 FF 108 41.33 M ( ) [0] xhow 1 G 108 744.047974 432 11.951996 NF 0 G 108 749.38 M ( ) [0] xhow 1 G 108 72 432 657 NF 0 G 1 (Times-Bold) 10 mymakefont 1 FF 108 80 M ( ) [0.0 0] xhow 2 (Times-Roman) 12 mymakefont 2 FF 108 374 M ( ) [0] xhow 126 83.999954 396 268.000031 CR 1 G 126 83.999954 396 268.000031 NF 299.5625 138.899689 45 26.999176 NF 0.5 SL 3.86 setmiterlimit 2 SC 0.666 G 299.5625 138.899689 45 26.999176 N 299.5625 174.89859 45 35.998901 N 0 G 3 (Times-Bold) 24 mymakefont 3 FF 307.91 193.14 M ( ) [0] xhow 0 SC 316.662476 278.395447 95.399994 37.516983 N 1 G 344.5625 233.900452 40.5 31.499039 NF 2 SC 0 G 344.5625 233.900452 40.5 31.499039 N 4 (Times-Bold) 20 mymakefont 4 FF 349.06 242.9 M ( ) [0] xhow 1 G 272.5625 233.396805 40.5 31.499039 NF 0 G 272.5625 233.396805 40.5 31.499039 N 1 G 416.5625 233.900452 40.5 31.499039 NF 0 G 416.5625 233.900452 40.5 31.499039 N 3 FF 192.86 247.19 M ( ) [0] xhow 376.0625 129.899963 63 94.497116 N 0.666 G 385.0625 174.89859 45 35.998901 N 1 G 385.0625 138.899689 45 26.999176 NF 0.666 G 385.0625 138.899689 45 26.999176 N 0 G 290.5625 129.899963 63 94.497116 N 3 FF 389.56 191.16 M ( ) [0] xhow 389.56 203.16 M ( ) [0] xhow 389.56 159.66 M ( ) [0] xhow 183.88 186.47 187.06 174.9 190.5 186.39 187.19 186.43 4 PP F 190.64 199.32 187.46 210.89 184.03 199.4 187.33 199.36 4 PP F 187.19 186.43 187.33 199.36 2 PP 0 SC S 183.64 222.4 187.06 210.89 190.26 222.46 186.95 222.43 4 PP F 189.88 262.39 186.46 273.89 183.26 262.32 186.57 262.36 4 PP F 186.95 222.43 186.57 262.36 2 PP S 183.75 285.43 187.06 273.9 190.37 285.43 187.06 285.43 4 PP F 190.37 302.86 187.06 314.39 183.75 302.86 187.06 302.86 4 PP F 187.06 285.43 187.06 302.86 2 PP S 2 FF 198.22 197.4 M (Emulation ) [7.328 9.331 5.997 3.334 5.325 3.334 3.334 5.997 5.997 0] xhow 1 G 284.962494 115.400406 69.5 14.499557 NF 0 G 289.88 123.4 M (User Task A ) [8.659 4.665 5.325 3.994 2.998 6.368 5.325 4.665 5.997 2.998 8.659 0] xhow 278.65 253.4 M (Server ) [6.668 5.325 3.994 5.817 5.325 3.994 0] xhow 1 G 189.462494 286.395203 69.5 19.99939 NF 0 G 208.05 294.4 M (Kernel ) [8.359 5.325 3.994 5.997 5.325 3.334 0] xhow 1 G 189.962494 240.396591 69.5 19.99939 NF 0 G 206.73 248.4 M (Service ) [6.668 5.325 3.994 5.997 3.334 5.325 5.325 0] xhow 350.56 301.39 M (Mach ) [10.662 5.325 5.325 5.997 0] xhow 420.65 253.4 M (Server ) [6.668 5.325 3.994 5.817 5.325 3.994 0] xhow 348.65 253.4 M (Server ) [6.668 5.325 3.994 5.817 5.325 3.994 0] xhow 1 G 371.462494 114.900421 69.5 14.499557 NF 0 G 376.71 122.9 M (User Task B ) [8.659 4.665 5.325 3.994 2.998 6.368 5.325 4.665 5.997 2.998 8.0 0] xhow 309.22 155.4 M (Appl ) [8.659 5.997 5.997 3.334 0] xhow 393.22 155.4 M (Appl ) [8.659 5.997 5.997 3.334 0] xhow 305.23 190.4 M (UNIX ) [8.659 8.659 3.994 8.659 0] xhow 389.23 190.4 M (UNIX ) [8.659 8.659 3.994 8.659 0] xhow 308.22 202.4 M (Emul ) [7.328 9.331 5.997 3.334 0] xhow 392.22 202.4 M (Emul ) [7.328 9.331 5.997 3.334 0] xhow 273.81 211.39 178.04 211.39 2 PP 2 SC S 272.81 172.39 177.04 172.39 2 PP S 274.81 273.39 179.04 273.39 2 PP S grestore grestore showpage __NXsheetsavetoken restore %%EndDocument @endspecial 91 x Fe(Figure)16 b(1:)26 b(Architectural)15 b(layering)h(of)g (the)g(Mach)g(3.0)h(multi-)-57 850 y(server)11 b(emulation)e(system.)-57 978 y(er)e(tasks,)i(that)d(provide)g(access)j(to)e(the)g(generic)g(services)h (exported)-57 1028 y(by)g(the)g(servers,)i(and)e(themselves)h(export)e(the)i (speci\256c)g(program-)-57 1078 y(ming)i(interface)g(of)g(a)h(given)f (operating)f(system)h(\(e.g)h(BSD)f(4.3\).)-57 1128 y(When)h(an)g (application)f(program)h(executes)h(a)f(system)g(call)g(\(e.g.)-57 1177 y(a)g(UNIX)g(system)g(call\),)g(it)f(traps)h(into)e(the)i(Mach)g (kernel,)h(which)-57 1227 y(redirects)c(execution)g(into)e(the)i(emulation)f (library)g(\(this)g(is)h(called)-57 1277 y(the)h(trampoline)e(ef)o(fect\).)16 b(The)10 b(system)h(call)e(is)h(then)f(executed)i(by)-57 1327 y(sending)f(one)g(or)g(more)g(requests)h(to)f(the)g(system)g(servers.)-7 1377 y(Communication)h(between)i(the)g(emulation)e(library)h(and)g(the)-57 1426 y(servers,)e(and)f(between)f(the)h(servers,)h(primarily)d(uses)i(Mach)g (IPC,)-57 1476 y(but)f(optimized)h(mechanisms)i(such)e(as)h(shared)g(memory)g (and)f(\256le)-57 1526 y(mapping)i(are)i(also)f(available.)21 b(Those)13 b(low-level)e(communica-)-57 1576 y(tion)j(facilities)g(are)i (accessed)i(through)c(special)h(proxy)g(objects)-57 1626 y([7])d(loaded)g (within)e(the)i(address)h(spaces)g(of)f(clients,)g(that)g(act)h(as)-57 1675 y(representatives)h(for)f(each)j(server)o(-side)e(object)f(with)g(each)i (par)o(-)-57 1725 y(ticular)c(client.)21 b(As)12 b(a)h(result,)g(the)f (actual)g(communication)g(code)-57 1775 y(is)e(well)g(separated)h(from)f(the) g(code)h(of)f(the)g(clients)g(themselves.)-7 1825 y(The)f(service)h(and)f (the)g(emulation)f(layers)h(were)g(initially)d(writ-)-57 1875 y(ten)11 b(in)f(an)h(object-oriented)f(environment)g(called)h(MachObjects)-57 1925 y([3],)j(consisting)d(of)i(a)g(package)i(of)d(C)h(macros)h(and)f (library)f(rou-)-57 1974 y(tines,)d(and)f(providing)e(dynamic)i(typed)g (objects,)h(delegation,)f(de-)-57 2024 y(fault)j(methods)g(and)g(a)h (generic,)g(transparent)f(RPC)g(mechanism.)-57 2074 y(A)i(partial)f (prototype)f(written)h(in)g(C++)h(is)g(under)f(development.)-57 2124 y(Some)d(of)f(the)g(issues)h(addressed)g(in)f(this)g(paper)h(relate)f (only)g(to)f(the)-57 2174 y(object)k(model,)h(being)e(lar)o(gely)h (independent)f(of)h(the)g(implemen-)-57 2223 y(tation)d(language.)15 b(Where)10 b(this)e(is)h(not)f(the)h(case,)j(we)d(will)f(refer)i(to)-57 2273 y(the)g(C++)h(implementation.)-57 2428 y Ff(3)50 b(Object-Oriented)10 b(Interfaces)-7 2525 y Fe(All)g(the)h(services)h(provided)d(by)i(the)g (various)f(servers)h(are)h(de-)-57 2575 y(\256ned)k(in)g(terms)h(of)f (operating)f(system)i(objects)f(such)h(as)g(\256les,)-57 2625 y(directories,)j(devices,)h(transport)c(endpoints,)i(etc.)39 b(T)m(o)19 b(avoid)1013 42 y(confusion)10 b(with)h(the)h(objects)f(used)h(as) h(part)e(of)h(the)g(internal)e(im-)1013 91 y(plementation)17 b(of)h(some)i(servers,)h(those)d(exported)g(operating)1013 141 y(system)f(objects)f(are)i(often)e(also)h(referred)g(to)f(as)h Fg(items)p Fe(.)35 b(Dif-)1013 191 y(ferent)14 b(items)g(export)g(dif)o (ferent)g(subsets)g(of)g(all)g(the)g(operations)1013 241 y(speci\256ed)c(in)f (the)h(complete)g(system)g(interface,)h(grouped)e(in)g(spe-)1013 291 y(cialized)15 b(interfaces)g(such)g(as)g(naming,)h(I/O,)e(network)g (control,)1013 340 y(device)f(control,)g(etc.)23 b(The)14 b(abstraction)e(of) h(a)g(server)g(is)g(not)f(ex-)1013 390 y(plicitly)7 b(exported)i(to)g (clients;)g(instead,)h(those)g(clients)f(only)g(have)1013 440 y(access)j(to)d(a)h(number)g(of)f(items,)h(and)g(cannot)f(directly)g (determine)1013 490 y(which)g(items)h(are)h(managed)g(by)e(which)h(servers.) 16 b(This)10 b(gives)f(the)1013 540 y(server)g(writer)f(maximum)h (\257exibility)d(in)i(the)h(implementation)e(of)1013 589 y(the)14 b(servers,)j(which)d(may)h(be)g(split,)f(combined,)i(or)e(in)g(general)1013 639 y(optimized,)c(without)e(af)o(fecting)i(the)g(clients.)1063 698 y(The)g(interfaces)h(provided)e(by)g(the)h(service)h(layer)f(are)h (de\256ned)1013 747 y(through)j(a)i(set)h(of)e(types,)j(each)f(de\256ning)e (the)h(operations)f(that)1013 797 y(may)j(be)g(invoked)f(on)g(the)h(items)g (of)f(that)g(type.)38 b(Parameters)1013 847 y(may)14 b(be)g(of)f(basic)h (types)f(\(integers,)h(strings,)f(etc.\))25 b(or)14 b(of)f(other)1013 897 y(complex)g(types;)g(item)g(references)i(may)e(be)h(sent)e(and)h (received)1013 947 y(as)e(parameters)g(in)f(operations.)1063 1005 y(An)d(interface)h(type)f(may)h(be)g(de\256ned)g(by)g(derivation)e(from) h(one)1013 1055 y(or)g(more)i(base)g(types,)f(using)f(single)g(or)h (multiple-inherit)o(ance.)13 b(S-)1013 1105 y(ingle)f(inheritance)g(is)h (used)g(to)f(re\257ect)h(a)h(common)f(relationship)1013 1155 y(between)i(items)h(in)e(an)i(operating)e(system)i(where)f(all)g(of)g(them) 1013 1204 y(share)h(a)h(basic,)h(common)e(interface)h(that)e(is)h(extended)g (in)f(dif-)1013 1254 y(ferent)c(ways)h(by)g(dif)o(ferent)f(items.)19 b(For)11 b(example,)i(all)f(the)f(items)1013 1304 y(managed)d(by)f(the)g (Unix)f(\256lesystem)i(share)g(a)g(basic)g(interface)f(with)1013 1354 y(operations)i(to)g(read)i(and)e(set)i(attributes,)e(change)h (protection,)f(re-)1013 1404 y(trieve)f(the)h(time)g(of)g(last)f(access)j (and)e(modi\256cations,)g(etc.)15 b(This)9 b(is)1013 1453 y(modeled)i(by)f (de\256ning)g(a)i(basic)f(interface)g(type)g(with)e(the)i(opera-)1013 1503 y(tions)g(available)i(to)f(all)g(items,)h(and)g(deriving)e(\256les,)i (directories,)1013 1553 y(symbolic)i(links,)h(mount)e(points,)i(etc.)31 b(from)16 b(this)e(basic)i(type.)1013 1603 y(Some)d(cases)i(are)e(more)g (complicated:)20 b(network)11 b(endpoints,)i(in)1013 1653 y(some)e (combinations)f(of)g(domain)g(and)h(protocol,)e(require)i(inher)o(-)1013 1703 y(iting)j(interfaces)i(from)g(more)g(than)g(one)g(base)g(type.)32 b(In)16 b(these)1013 1752 y(cases)10 b(multiple-inherit)o(ance)d(is)h(used)h (to)f(inherit)e(interfaces)j(from)1013 1802 y(all)h(the)g(relevant)g(base)h (types.)1063 1861 y(In)j(the)g(C++)g(prototype,)g(interfaces)h(are)g (speci\256ed)g(by)e(C++)1013 1910 y(abstract)f(classes.)21 b(Static)12 b(type-checking)f(ensures)h(consistency)1013 1960 y(between)d(clients)g(and)g(servers)h(and)f(provides)f(early)h(detection)f (of)1013 2010 y(programming)h(errors.)1063 2068 y(An)15 b(important)f(goal)h (of)g(the)h(object)f(model)g(is)h(to)f(facilitate)1013 2118 y(the)d(introduction)d(of)i(new)h(interfaces,)i(or)d(the)h(extension)f(of)h (ex-)1013 2168 y(isting)c(ones,)i(without)e(modifying)f(existing)h(emulation) h(libraries)1013 2218 y(and)h(servers.)15 b(T)m(wo)10 b(basic)g (object-oriented)e(programming)h(tech-)1013 2268 y(niques)16 b(are)h(fundamental)g(to)f(achieve)h(this:)27 b(inheritance)16 b(and)1013 2318 y(polymorphism.)1063 2376 y(Extending)10 b(an)h(existing)f (interface)h(is)g(achieved)h(by)f(deriving)1013 2426 y(a)h(new)h(interface)f (class)h(from)f(the)g(existing)e(one.)21 b(At)12 b(the)g(server)1013 2476 y(side,)i(the)g(new)f(class)i(may)f(completely)f(re-implement)g(the)g (old)1013 2525 y(methods)c(or)g(simply)f(rely)h(on)g(the)g(implementation)f (provided)g(by)1013 2575 y(the)f(base)i(class.)15 b(At)7 b(the)h(client)f (side,)h(the)f(old)g(interface)h(class)h(may)1013 2625 y(still)j(be)j(used.) 27 b(Clients)12 b(are)j(not)e(af)o(fected)j(and)e(therefore)g(need)p eop %%Page: 3 3 bop -57 42 a Fe(not)17 b(be)h(changed,)j(although)16 b(they)i(cannot)f(use)i (the)e(extended)-57 91 y(functionality)8 b(of)h(the)i(new)f(interface.)-7 145 y(One)d(of)g(the)g(limitations)e(of)h(this)h(scheme)h(is)f(that)f(new)i (versions)-57 194 y(of)k(the)g(servers)h(must)f(maintain)g(the)g (communication)g(interface)-57 244 y(to)j(old)g(clients.)31 b(A)16 b(new)g(version)f(of)g(a)h(server)h(that)e(improves)-57 294 y(the)g(communication)f(with)g(the)g(client,)i(or)e(simply)g(\256xes)i (some)-57 344 y(bugs)e(but)g(requires)h(a)g(new)g(proxy)m(,)g(cannot)g(be)g (installed)f(with-)-57 394 y(out)d(changing)h(the)g(existing)f(clients.)21 b(This)12 b(can)h(be)g(avoided)f(by)-57 443 y(dynamically)d(linking)f (proxies)h(with)f(the)i(client')n(s)f(code,)h(thus)f(al-)-57 493 y(lowing)14 b(a)i(new)g(version)f(of)g(a)h(proxy)e(to)h(be)h(installed)e (without)-57 543 y(modifying)7 b(the)j(client.)k(This)9 b(is)g(made)i (possible)d(by)h(the)g(fact)h(that)-57 593 y(the)k(new)g(proxy)f(still)f (conforms)i(to)f(the)h(type)f(expected)i(by)e(the)-57 643 y(client.)-7 696 y(Clients)d(using)h(an)g(extended)h(interface)g(must)f(sometimes)h(be)-57 746 y(able)g(to)f(communicate)i(with)e(old)g(servers)h(that)g(export)f(only)f (the)-57 796 y(old,)i(base)h(interface.)22 b(In)12 b(such)g(a)h(case)h(the)e (client)f(must)h(be)h(able)-57 845 y(to)h(check)i(at)f(run-time)f(the)h (dynamic)g(type)g(of)f(the)h(server)g(it)f(is)-57 895 y(communicating)c (with.)-7 949 y(There)g(are)f(other)f(situations)g(where)h(run-time)f(type)g (checking)-57 998 y(is)e(also)g(needed.)15 b(The)6 b(Unix)g Fa(open\(\))g Fe(system)g(call,)i(for)e(example,)-57 1048 y(must)i(return)f (an)h(object)g(of)g(a)g(base)h(type)f(because)h(when)f(the)g(name)-57 1098 y(of)i(the)h(object)f(is)g(looked-up)f(its)h(type)g(is)g(not)g(known.)15 b(However)n(,)-57 1148 y(some)10 b(operations)e(are)i(performed)f(dif)o (ferently)f(according)h(to)f(the)-57 1198 y(actual)16 b(type)f(of)h(object)f (returned.)31 b(The)16 b(system)g(must)g(have)g(a)-57 1247 y(mechanism)6 b(for)g(detecting)g(the)g(run-time)g(type)g(of)g(objects,)h (which)-57 1297 y(is)k(used)h(by)f(clients)g(when)g(they)g(need)h(to)f(dif)o (ferentiate)g(between)-57 1347 y(disjoint)d(derived)i(interfaces.)-57 1515 y Ff(4)50 b(Implementation)-7 1625 y Fe(A)13 b(key)g(component)g(of)g (the)g(system)h(is)f(a)h(C++)f(class)i(library)-57 1675 y(containing)e(a)i (collection)e(of)i(basic)f(classes)i(used)f(to)f(construct)-57 1725 y(clients)h(and)g(servers.)31 b(Figure)15 b(2.)30 b(shows)15 b(a)h(small)f(portion)f(of)-57 1775 y(the)i(class)h(hierarchy)f(for)g(this)f (library)m(,)i(focusing)f(on)g(how)f(the)-57 1825 y(interfaces)h(are)g (speci\256ed)g(and)f(implemented.)30 b(The)16 b(complete)-57 1874 y(system)8 b(contains)g(several)g(additional)f(interface)h (de\256nitions,)f(but)-57 1924 y(they)16 b(all)f(follow)g(the)g(same)j (structure)d(and)h(are)h(not)e(discussed)-57 1974 y(here)10 b(to)f(simplify)g(the)g(presentation.)14 b(The)d(library)d(also)i(contains) -57 2024 y(many)g(other)g(classes)i(used)e(for)g(naming,)g(authentication,)f (buf)o(fer)-57 2074 y(management,)16 b(etc.)27 b(and)14 b(covers)g(several)h (other)e(aspects,)j(such)-57 2123 y(as)c(a)h(C++)f(remote)g(invocation)e (package)j(on)e(top)g(of)g(Mach)h(IPC,)-57 2173 y(garbage-collection)h(of)h (objects)g(between)g(clients)g(and)g(servers)-57 2223 y(and)e(a)g(mechanism)h (for)e(dynamic)h(type)f(conversion,)h(which)g(are)-57 2273 y(outside)d(the)h(scope)h(of)f(this)g(paper)g([2].)-7 2326 y(The)j(basic)g(structure)f(of)h(the)f(library)g(is)g(as)i(follows:)j(a)d (hier)o(-)-57 2376 y(archy)f(of)f(abstract)g(C++)h(classes)h(de\256nes)f(the) f(interfaces)h(to)e(the)-57 2426 y(various)c(items;)f(this)h(hierarchy)g(is)g (shadowed)g(in)g(t)o(he)g(client)f(and)h(i)o(n)-57 2476 y(the)12 b(server)h(side)f(by)f(similar)h(hierarchies)g(with)f(the)h(classes)i(that) -57 2525 y(implement)i(those)f(interfaces.)33 b(For)16 b(a)g(given)g (interface)g(class,)-57 2575 y(there)h(is)g(at)h(least)f(a)h(pair)f(of)g (derived)g(implementation)f(class-)-57 2625 y(es,)g(one)d(with)g(the)g (client-side)g(implementation)g(and)g(the)h(other)1013 709 y @beginspecial -300 @voffset -80 @hoffset 60 @hscale 64 @vscale @setspecial %%BeginDocument: fig2.ps /__NXdef{1 index where{pop pop pop}{def}ifelse}bind def /__NXbdef{1 index where{pop pop pop}{bind def}ifelse}bind def /UserObjects 10 array __NXdef /defineuserobject{ exch dup 1 add dup UserObjects length gt{ array dup 0 UserObjects putinterval /UserObjects exch def }{pop}ifelse UserObjects exch 3 -1 roll put }__NXbdef /undefineuserobject{UserObjects exch null put}__NXbdef /execuserobject{UserObjects exch get exec}__NXbdef /__NXRectPath{4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath}__NXbdef /__NXProcessRectArgs{ 1 index type /arraytype eq{ exch 0 4 2 index length 1 sub{ dup 3 add 1 exch{1 index exch get exch}for 5 1 roll 5 index exec }for pop pop }{exec}ifelse }__NXbdef /rectfill{gsave newpath {__NXRectPath fill} __NXProcessRectArgs grestore}__NXbdef /rectclip{newpath {__NXRectPath} __NXProcessRectArgs clip newpath}__NXbdef /rectstroke{ gsave newpath dup type /arraytype eq{dup length 6 eq}{false}ifelse{ {gsave __NXRectPath null concat stroke grestore} dup length array cvx copy dup 2 4 -1 roll put __NXProcessRectArgs }{{__NXRectPath stroke} __NXProcessRectArgs}ifelse grestore }__NXbdef /xyshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show 3 index 3 index 2 mul 1 add get add exch 3 index 3 index 2 mul get add exch moveto pop }for pop pop }__NXbdef /xshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show exch 3 index 3 index get add exch moveto pop }for pop pop }__NXbdef /yshow{ 0 1 3 index length 1 sub{ currentpoint 4 index 3 index 1 getinterval show 3 index 3 index get add moveto pop }for pop pop }__NXbdef /arct{arcto pop pop pop pop}__NXbdef /setbbox{pop pop pop pop}__NXbdef /ucache{}__NXbdef /ucachestatus{mark 0 0 0 0 0}__NXbdef /setucacheparams{cleartomark}__NXbdef /uappend{systemdict begin cvx exec end}__NXbdef /ueofill{gsave newpath uappend eofill grestore}__NXbdef /ufill{gsave newpath uappend fill grestore}__NXbdef /ustroke{ gsave newpath dup length 6 eq {exch uappend concat}{uappend}ifelse stroke grestore }__NXbdef /__NXustrokepathMatrix dup where {pop pop}{matrix def}ifelse /ustrokepath{ newpath dup length 6 eq{ exch uappend __NXustrokepathMatrix currentmatrix exch concat strokepath setmatrix }{uappend strokepath}ifelse } __NXbdef /upath{ [exch {/ucache cvx}if pathbbox /setbbox cvx {/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx}pathforall]cvx } __NXbdef /setstrokeadjust{pop}__NXbdef /currentstrokeadjust{false}__NXbdef /selectfont{exch findfont exch dup type /arraytype eq {makefont}{scalefont}ifelse setfont}__NXbdef /_NXCombineArrays{ counttomark dup 2 add index dup length 3 -1 roll { 2 index length sub dup 4 1 roll 1 index exch 4 -1 roll putinterval exch }repeat pop pop pop }__NXbdef /setcmykcolor{ 1.0 exch sub dup dup 6 -1 roll sub dup 0 lt{pop 0}if 5 1 roll 4 -1 roll sub dup 0 lt{pop 0}if 3 1 roll exch sub dup 0 lt{pop 0}if setrgbcolor }__NXbdef /currentcmykcolor{currentrgbcolor 3{1.0 exch sub 3 1 roll}repeat 0}__NXbdef /flushgraphics{}def /setwindowtype{pop pop}def /currentwindowtype{pop 0}def /setalpha{pop}def /currentalpha{1.0}def /hidecursor{}def /obscurecursor{}def /revealcursor{}def /setcursor{4 {pop}repeat}bind def /showcursor{}def /NextStepEncoding where not{ /NextStepEncoding StandardEncoding 256 array copy def 0 [129/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/Ccedilla/Egrave /Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/Ugrave/Uacute /Ucircumflex/Udieresis/Yacute/Thorn/mu/multiply/divide/copyright 176/registered 181/brokenbar 190/logicalnot 192/onesuperior 201/twosuperior 204/threesuperior 209/plusminus/onequarter/onehalf/threequarters/agrave /aacute/acircumflex/atilde/adieresis/aring/ccedilla/egrave/eacute /ecircumflex/edieresis/igrave 226/iacute 228/icircumflex/idieresis/eth /ntilde 236/ograve/oacute/ocircumflex/otilde/odieresis 242/ugrave/uacute /ucircumflex 246/udieresis/yacute 252/thorn/ydieresis] {dup type /nametype eq {NextStepEncoding 2 index 2 index put pop 1 add}{exch pop}ifelse }forall pop /NextStepEncoding NextStepEncoding readonly def /_NXfstr 128 string dup 0 (_NX) putinterval def /findfont{ % Because we can never let NextStepEncoding get into % SharedFontDirectory, we cannot reencode a font to NextStepEncoding % if we are in shared mode. So if currentshared is true, % we call the normal findfont and return that /currentshared where {pop currentshared} {false} ifelse {//findfont exec} {dup _NXfstr 3 125 getinterval cvs length 3 add _NXfstr 0 3 -1 roll getinterval cvn exch FontDirectory 2 index known {pop FontDirectory exch get} {//findfont exec dup /Encoding get StandardEncoding eq { dup length dict exch {1 index /FID ne {2 index 3 1 roll put}{pop pop}ifelse}forall dup /Encoding NextStepEncoding put definefont }{exch pop} ifelse }ifelse }ifelse }bind def }{pop}ifelse /_NXProcArray 5 array __NXdef /_NXChannels 0 __NXdef /_NXTotalBytes 0 __NXdef /_NXDoImageOp{ 1 index{dup}{1}ifelse /_NXChannels exch store _NXChannels 2 add 2 roll _NXProcArray 0 _NXChannels getinterval astore pop 5 index 4 index mul 2 index{1 sub 8 idiv 1 add mul}{mul 1 sub 8 idiv 1 add}ifelse 4 index mul /_NXTotalBytes exch store pop exch pop gsave matrix invertmatrix concat 0.5 setgray 0 0 4 2 roll rectfill grestore { 0 1 _NXChannels 1 sub{ _NXProcArray exch get exec length _NXTotalBytes exch sub /_NXTotalBytes exch store}for _NXTotalBytes 0 le{exit}if }loop /_NXProcArray 5 array def }__NXbdef /colorimage{_NXDoImageOp}__NXbdef /alphaimage{1 add _NXDoImageOp}def /landscape false def /t300 [0.000 0.006 0.011 0.017 0.022 0.028 0.033 0.039 0.045 0.050 0.056 0.061 0.067 0.073 0.078 0.084 0.089 0.095 0.101 0.117 0.133 0.148 0.164 0.179 0.195 0.210 0.225 0.240 0.255 0.270 0.285 0.299 0.314 0.329 0.344 0.359 0.374 0.389 0.404 0.419 0.435 0.451 0.466 0.482 0.498 0.513 0.529 0.544 0.560 0.576 0.591 0.610 0.632 0.654 0.677 0.699 0.721 0.744 0.766 0.788 0.821 0.866 0.911 0.955 1.000 ] def /t400 [0.000 0.003 0.006 0.009 0.012 0.014 0.017 0.020 0.023 0.026 0.029 0.032 0.035 0.038 0.041 0.043 0.046 0.049 0.056 0.063 0.071 0.079 0.087 0.095 0.104 0.117 0.130 0.143 0.157 0.173 0.189 0.205 0.225 0.245 0.259 0.272 0.285 0.298 0.314 0.329 0.345 0.361 0.376 0.392 0.407 0.423 0.439 0.454 0.470 0.486 0.502 0.528 0.554 0.580 0.605 0.628 0.650 0.672 0.695 0.727 0.762 0.796 0.857 0.922 1.000 ] def /tlinear [0.000 0.016 0.031 0.047 0.062 0.078 0.094 0.109 0.125 0.141 0.156 0.172 0.188 0.203 0.219 0.234 0.250 0.266 0.281 0.297 0.312 0.328 0.344 0.359 0.375 0.391 0.406 0.422 0.438 0.453 0.469 0.484 0.500 0.516 0.531 0.547 0.562 0.578 0.594 0.609 0.625 0.641 0.656 0.672 0.688 0.703 0.719 0.734 0.750 0.766 0.781 0.797 0.812 0.828 0.844 0.859 0.875 0.891 0.906 0.922 0.938 0.953 0.969 0.984 1.000 ] def /dmatrix matrix def /desiredpat 0 def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul exch dup mul add sqrt round def /freq dpi 18.75 div 8 div round dup 0 eq { pop 1 } if 8 mul dpi exch div def /sangle 1 0 dmatrix defaultmatrix dtransform exch atan def /graymode true def /pats 16 array def /mymatrix matrix def /savedgray 0 def /F /fill load def /rc /rectclip load def /GS /gsave load def /GR /grestore load def /SL /setlinewidth load def /SC /setlinecap load def /CS { closepath S } bind def /A /strokepath load def /TR /translate load def /M /moveto load def /C /closepath load def /smat { mymatrix currentmatrix pop } bind def /rmat { mymatrix setmatrix } bind def /sp { P exch get exec } bind def systemdict /setshared known { 300 dpi eq { /tran t300 def } { /tran t400 def } ifelse } { /tran tlinear def } ifelse systemdict /xshow known not { /xhow { /pts exch def /str exch def 0 1 str length 1 sub { currentpoint 3 -1 roll str 1 index 1 getinterval show 3 1 roll moveto pts exch get 0 rmoveto } for } bind def } { /xhow { checkink xshow } bind def } ifelse systemdict /xyshow known not { /xyhow { /pts exch def /str exch def 0 1 str length 1 sub { currentpoint 3 -1 roll str 1 index 1 getinterval show 3 1 roll moveto 2 mul pts 1 index get pts 3 -1 roll 1 add get rmoveto } for } bind def } { /xyhow { checkink xyshow } bind def } ifelse /PrintInColor systemdict /colorimage known def PrintInColor { /HUE 0 def /SAT 0 def /BRIGHT 0 def /Colors [[0 0 ] [0 0 ] [0.00 1.0] [0.37 1.0] [0.60 1.0] [0.50 1.0] [0.83 1.0] [0.16 1.0] ] def /K { Colors exch get dup 0 get /HUE exch store 1 get /BRIGHT exch store HUE 0 eq BRIGHT 0 eq and {1.0 SAT sub setgray } {HUE SAT BRIGHT sethsbcolor } ifelse } def /mysetgray { /SAT exch 1.0 exch sub store HUE 0 eq BRIGHT 0 eq and {1.0 SAT sub setgray } {HUE SAT BRIGHT sethsbcolor } ifelse } bind def } { /mysetgray /setgray load def /K /pop load def } ifelse /setpattern { /bwidth exch def /bpside exch def /bstring exch def /onbits 0 def /offbits 0 def freq sangle landscape {90 add} if {/y exch def /x exch def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen tran offbits 64 mul offbits onbits add div cvi get mysetgray } bind def /myfonts [] def /procarray 30 array def 3.86 setmiterlimit currentscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def /currentpat -1 def /checkpat { graymode currentpat desiredpat ne or { pats desiredpat get exec /graymode false store /currentpat desiredpat store } if } bind def /Z { checkpat fill } bind def /checkink { graymode not { orgfreq organgle orgproc cvx setscreen /graymode true store savedgray mysetgray } if } bind def /F { checkink fill } bind def /dorectfill { checkink rectfill } bind def /dorectstroke { checkink rectstroke } bind def /S { checkink stroke } bind def /G { /savedgray exch def savedgray mysetgray } def /makecontextpattern { exch pop [null 8 1 /setpattern cvx] 4 array copy dup 0 5 -1 roll put cvx pats 3 1 roll put } def /P [ 0 1 15 { [ /desiredpat 3 -1 roll /store cvx ] cvx } for ] def /patoffsetx 0 def /patoffsety 0 def /currentpat null def /DiacriticEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve /ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex /udieresis /dagger /.notdef /cent /sterling /section /bullet /paragraph /germandbls /registered /copyright /trademark /acute /dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef /yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown /exclamdown /logicalnot /.notdef /florin /.notdef /.notdef /guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde /Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis /fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron ] def /DiacriticEncode { /basefontdict exch def /newfontdict basefontdict maxlength 2 add dict def basefontdict {exch dup /FID ne {dup /Encoding eq {exch pop DiacriticEncoding } {exch} ifelse newfontdict 3 1 roll put } {pop pop} ifelse } forall newfontdict } def /line { pop pop pop pop } def /rrectpath { smat 4 2 roll TR /h exch def /w exch def /r exch def mark r 0 M w 0 w h r arcto w h 0 h r arcto 0 h 0 0 r arcto 0 0 w 0 r arcto C cleartomark rmat } def /RF { rrectpath F } bind def /RP { checkpat rrectpath fill } bind def /RS { rrectpath S } bind def /RQ { checkpat rrectpath A fill } bind def /NF { dorectfill } bind def /NR { checkpat 4 2 roll rectfill } bind def /W { savedgray 5 1 roll 1.0 G dorectfill G } bind def /invertbox { pop pop pop pop } def /highbox { pop pop pop pop } def /PP { newpath 3 1 roll M 1 sub { lineto } repeat } bind def /SP { 3 1 roll M 3 div cvi { curveto } repeat } bind def /rectpath { M dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto C } def /N { dorectstroke } bind def /NQ { checkpat 4 2 roll rectstroke } bind def /drawip { pop pop pop } bind def /eraseip { pop pop pop } bind def /highip { pop pop pop pop } def /insideedgebox { pop pop pop pop pop } def /replbox { pop pop pop pop pop pop } def /pop4 { pop pop pop pop } def /graybox { pop4 } def /darkgraybox { pop4 } def /arcpath { newpath TR /h exch def /w exch def /dth exch def /th exch def 90 th dth add sub 90 th sub dth 0 lt { exch } if 1 h w div neg scale 0 0 w 2 div 5 -2 roll arc } def /AS { smat arcpath rmat S } bind def /AP { checkpat smat arcpath rmat A fill } bind def /AF { smat arcpath 0 0 lineto rmat F } bind def /AQ { checkpat smat arcpath 0 0 lineto rmat fill } bind def /mymakefont { /size exch def /name exch def /i exch def /myfontdict name cvn findfont def myfontdict /Encoding get dup StandardEncoding eq exch /NextStepEncoding where { pop NextStepEncoding eq or }{ pop } ifelse { myfontdict DiacriticEncode /gfontdict exch def /gfontdict (F ) dup 1 i ( ) cvs putinterval cvn gfontdict definefont def } { /gfontdict myfontdict def } ifelse /myfonts [ myfonts aload pop null ] def myfonts i gfontdict [size 0 0 size neg 0 0 ] makefont put } def /FF { myfonts exch get setfont } bind def /CR { initclip newpath 4 2 roll M dup 0 exch rlineto exch 0 rlineto 0 exch neg rlineto C clip newpath } bind def /cliptowindow { initclip } def /beginprintcode { GS newpath 1 setlinewidth 0 SL 0 setlinejoin [] 0 setdash 0 setgray 10 setmiterlimit /FMdicttop countdictstack 1 add def /FMoptop count 7 sub def 200 dict begin TR dup neg scale 0.0 0.0 M } def /endprintcode { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for GR } def /beginPSInsetprintcode { /pinsetsave save def newpath 1 setlinewidth 0 setlinecap 0 setlinejoin [] 0 setdash 0 setgray 10 setmiterlimit /showpage {} def /FMdicttop countdictstack 1 add def /FMoptop count def 200 dict begin /showimage {} def } def /endPSInsetprintcode { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for pinsetsave restore } def /cacheimage { /flip exch def /theta exch def /bps exch def /h exch def /w exch def /destHeight exch def /destWidth exch def /destY exch def /destX exch def /rowbytes w bps mul 7 add 8 idiv def /buffer rowbytes string def GS destX destY TR theta rotate flip {destWidth neg destHeight scale} {destWidth destHeight scale} ifelse w h bps [w 0 0 h 0 h ] { currentfile buffer readhexstring pop } bind image GR } def <0f1e3c78f0e1c387> (I14a1f0) 8 makecontextpattern <0f87c3e1f0783c1e> (I14a20c) 9 makecontextpattern (I14a228) 10 makecontextpattern (I14a244) 11 makecontextpattern <8142241818244281> (I14a260) 12 makecontextpattern <03060c183060c081> (I14a27c) 13 makecontextpattern <8040201008040201> (I14a298) 14 makecontextpattern gsave -1 -9 translate /__NXbasematrix matrix currentmatrix def grestore /__NXsheetsavetoken save def 0 0 translate gsave /__NXbasematrix matrix currentmatrix def grestore gsave 0 0 612 792 rectclip [1 0 0 -1 0 792] concat 0 0 translate gsave 0 0 612 792 rectclip /landscape false def 0 0 612 792 CR 1 G 108 36 432 15.192001 NF 0 G 0 (Times-Roman) 8 mymakefont 0 FF 108 41.33 M ( ) [0] xhow 1 G 108 744.047974 432 11.951996 NF 0 G 108 749.38 M ( ) [0] xhow 1 G 108 72 432 657 NF 0 G 1 (Times-Roman) 11 mymakefont 1 FF 108 80 M ( ) [0] xhow 2 (Times-Roman) 12 mymakefont 2 FF 110.75 80 M ( ) [0] xhow 2 FF 110.75 80 M ( ) [0] xhow 108 83.999954 432 222 CR 1 G 104.615997 83.999954 438.768005 222 NF 0.5 SL 3.86 setmiterlimit 2 SC 0 G 18 239.615997 101.999954 198 99 RS 1 G 322.473114 106.999969 39.602966 10.799835 NF 0 G 2 FF 322.47 115 M (usItem ) [5.997 4.665 3.994 3.334 5.325 9.331 0] xhow 1 G 457.416656 146.999954 45 19.499344 NF 0 G 457.42 155 M (agency ) [5.325 5.997 5.325 5.997 5.145 5.997 0] xhow 1 G 261.21814 164.398636 41.397858 10.799835 NF 0 G 261.22 172.4 M (usName ) [5.997 4.665 8.659 5.325 9.331 5.325 0] xhow 1 G 369.216492 164.398636 50.399506 10.799835 NF 0 G 369.22 172.4 M (usByteIO ) [5.997 4.665 8.0 5.997 3.334 5.325 3.994 8.659 0] xhow 1 G 198.975067 234.164948 54.567368 22.168274 NF 0 G 198.98 242.16 M (file_proxy ) [3.334 3.334 3.334 5.325 5.997 5.997 3.994 5.997 5.997 5.997 0] xhow 1 G 135.68956 234.16507 49.926437 22.16803 NF 0 G 135.69 242.17 M (dir_proxy ) [5.997 3.334 3.994 5.997 5.997 3.994 5.997 5.997 5.997 0] xhow 1 G 441.216492 235.498215 14.399506 19.50174 NF 0 G 441.22 243.5 M (dir ) [5.997 3.334 3.994 0] xhow 1 G 491.615997 235.498215 17.999176 19.50174 NF 0 G 491.62 243.5 M (file ) [3.334 3.334 3.334 5.325 0] xhow 1 G 157.716492 146.999954 73.799011 22.16803 NF 0 G 157.72 155 M (usItem_Proxy ) [5.997 4.665 3.994 3.334 5.325 9.331 5.997 6.668 3.994 5.997 5.997 5.997 0] xhow 326.66 118.9 338.6 120 327.89 125.4 327.27 122.15 4 PP 0.5 G F 194.62 147 327.28 122.15 2 PP 1 SL S 349.26 125.53 338.61 120 350.57 119.05 349.92 122.29 4 PP F 473.62 147 349.92 122.29 2 PP S 327.31 124.06 338.6 120 331.18 129.43 329.25 126.74 4 PP F 275.62 165 329.26 126.75 2 PP S 345.33 129.94 338.61 120 349.58 124.87 347.45 127.4 4 PP F 392.62 165 347.46 127.41 2 PP S 186.59 167.96 185.61 156 192.78 165.62 189.69 166.79 4 PP 0 G F 212.62 228 189.69 166.79 2 PP S 401.42 182.15 392.61 174 404.4 176.24 402.91 179.19 4 PP 0.5 G F 500.62 228 402.91 179.19 2 PP S 285.6 180.64 275.61 174 287.6 174.33 286.6 177.48 4 PP F 446.62 228 286.61 177.49 2 PP S 263.76 175.86 275.61 174 266.55 181.86 265.15 178.86 4 PP F 158.62 228 265.16 178.87 2 PP S 380.61 174.25 392.6 174 382.56 180.56 381.59 177.41 4 PP F 212.62 228 381.6 177.41 2 PP S 1 G 163.115997 272.999939 54 9 NF 0 G 1 FF 163.12 280.33 M (Client-side ) [7.328 3.054 3.054 4.878 5.493 3.054 3.658 4.274 3.054 5.493 4.878 0] xhow 1 G 149.615997 281.999939 81 9 NF 0 G 149.62 289.33 M (Implementations ) [3.658 8.547 5.493 3.054 4.878 8.547 4.878 5.493 3.054 4.878 3.054 3.054 5.493 5.493 4.274 0] xhow 1 G 451.115997 272.999939 58.5 9 NF 0 G 451.12 280.33 M (Server-side ) [6.108 4.878 3.658 5.328 4.878 3.439 3.658 4.274 3.054 5.493 4.878 0] xhow 1 G 437.615997 281.999939 81 9 NF 0 G 2 FF 437.62 290 M (I) [0] xhow 1 FF 441.61 290 M (mplementations ) [8.547 5.493 3.054 4.878 8.547 4.878 5.493 3.054 4.878 3.054 3.054 5.493 5.493 4.274 0] xhow 1 G 316.115997 272.999939 49.5 9 NF 0 G 316.12 280.33 M (Interfaces ) [3.658 5.493 3.054 4.878 3.658 3.549 4.878 4.878 4.878 4.274 0] xhow 178.45 165.62 185.61 156 184.64 167.96 181.54 166.79 4 PP F 158.62 228 181.54 166.79 2 PP S 474.58 167.96 473.61 156 480.77 165.62 477.68 166.79 4 PP F 500.62 228 477.69 166.79 2 PP S 466.44 165.62 473.61 156 472.63 167.96 469.54 166.79 4 PP F 446.62 228 469.54 166.79 2 PP S grestore grestore showpage __NXsheetsavetoken restore %%EndDocument @endspecial 91 x(Figure)36 b(2:)69 b(Class)37 b(hierarchy)m(.)96 b(Classes)38 b Fa(usItem,)1013 850 y(usName)15 b Fe(and)i Fa(usByteIO)e Fe(de\256ne)i(the)e(interfaces.)33 b(Classes)1013 900 y Fa(agency,)24 b(dir)10 b Fe(and)f Fa(file)h Fe(provide)e(server)o(-side)i(implemen-)1013 949 y(tations.)45 b(Classes)21 b Fa(usItem)p 1477 949 13 2 v 14 w(proxy,)j(file)p 1765 949 V 15 w(proxy)c Fe(and)1013 999 y Fa(dir)p 1090 999 V 14 w(proxy)10 b Fe(provide)g(client-side)f (implementations.)1013 1157 y(with)k(the)h(server)o(-side)h(implementation.) 27 b(There)15 b(may)g(be,)h(and)1013 1206 y(in)c(general)h(are,)h(several)f (implementation)f(classes)i(for)e(a)h(given)1013 1256 y(interface)f(class)g (at)g(dif)o(ferent)f(servers)h(\(e.g.)20 b(\256les)12 b(and)g(pipes)f(are) 1013 1306 y(dif)o(ferent)16 b(implementations)f(of)h(the)h(byte-oriented)e (I/O)h(inter)o(-)1013 1356 y(face\).)h(Clients)10 b(use)h(only)e(the)i (interface)g(classes.)18 b(However)n(,)11 b(the)1013 1406 y(objects)k (created)i(by)e(the)g(remote)h(invocation)e(mechanism)j(are)1013 1455 y(instances)c(of)g(the)g(implementation)f(classes)j(at)e(the)g(client)g (side,)1013 1505 y(called)d(the)h(proxy)e(classes.)17 b(These)11 b(objects)f(may)h(perform)f(some)1013 1555 y(local)e(processing)f(and/or)g (communicate)i(with)e(their)g(peers)h(at)g(the)1013 1605 y(server)j(side.) 1063 1667 y(The)j(consistency)g(between)g(the)f(interfaces)i(as)f(seen)h(by)e (the)1013 1716 y(clients)j(and)g(as)h(implemented)f(by)g(the)g(servers)h(is)f (guaranteed)1013 1766 y(by)f(the)g(fact)g(that)g(both)f(these)i(classes)h (inherit)c(from)j(the)f(same)1013 1816 y(interface)f(class.)28 b(The)15 b(static)f(type)g(checking)g(of)g(C++)h(ensures)1013 1866 y(that)e(inconsistencies)f(are)i(detected)g(at)g(compile)f(time.)24 b(On)13 b(the)1013 1916 y(other)e(hand,)i(the)f(separation)g(of)g(the)g (implementations)f(ensures)1013 1966 y(that)f(servers)h(may)h(be)f (modi\256ed)f(without)f(requiring)g(changes)j(in)1013 2015 y(the)g(clients,)g(as)h(long)d(as)j(the)f(interfaces)g(between)h(them)f (remain)1013 2065 y(unchanged.)24 b(This)13 b(allows)f(dif)o(ferent)h (people,)h(possibly)e(in)g(dif-)1013 2115 y(ferent)e(or)o(ganizations,)f(to)h (independently)e(develop)i(servers)h(that)1013 2165 y(can)k(be)f(plugged-in)e (and)i(work)g(together)f(with)g(the)h(rest)g(of)g(the)1013 2215 y(system.)1063 2276 y(Implementation)f(classes)j(use)e (multiple-inheritance)e(to)i(in-)1013 2326 y(herit)9 b(both)f(from)h(the)h (interface)g(hierarchy)f(and)h(from)f(the)h(imple-)1013 2376 y(mentation)k(hierarchy)m(.)30 b(Each)16 b(class)g(inherits)e(the)h (interface)g(of)1013 2426 y(its)f(level)g(and)h(the)f(implementation)g(of)g (the)g(level)h(above.)28 b(For)1013 2476 y(example,)21 b(class)d Fa(dir)p 1359 2476 V 15 w(proxy)f Fe(in)h(Figure)f(2.)38 b(inherits)16 b(from)1013 2525 y Fa(usName)p Fe(,)21 b(which)e(is)g(the)h(interface)f(of)g (its)g(level,)j(and)d(from)1013 2575 y Fa(usItem)p 1165 2575 V 14 w(proxy)10 b Fe(which)h(is)f(the)g(implementation)g(of)g(the)g(level) 1013 2625 y(above,)e Fa(usItem)e Fe(\([5])h(presents)g(a)g(similar)f(model)h (for)f(separating)p eop %%Page: 4 4 bop -57 42 a Fe(interface)11 b(and)f(implementation)f(in)h(C++\).)-7 93 y(The)16 b(C++)h(library)e(contains)g(most)h(of)g(the)g(generic)g(classes) -57 143 y(used)7 b(to)g(construct)f(servers,)j(including)c(naming,)j (authentication,)-57 192 y(access)k(control,)e(etc.)16 b(Each)11 b(server)g(uses)g(and)f(extends)h(the)f(basic)-57 242 y(functionality)m(,)15 b(adapting)g(it)g(to)g(its)h(particular)f(needs.)32 b(A)16 b(high)-57 292 y(degree)j(of)f(code)h(sharing)f(between)h(the)f(dif)o(ferent) f(servers)i(is)-57 342 y(thus)14 b(achieved,)i(thereby)e(facilitating)f (their)g(development)h(and)-57 392 y(maintenance.)-57 554 y Ff(5)50 b(Curr)o(ent)12 b(Status)f(and)h(Conclusions)-7 658 y Fe(The)k(current)g(C++)g(prototype)f(contains)g(a)h(name)h(server)n(,)i(a) -57 707 y(pipe)c(and)h(socket)g(server)h(and)f(a)g(BSD)g(4.3)g(emulation)f (library)-57 757 y(written)8 b(in)h(C++.)16 b(Some)10 b(existing)e(servers)j (written)d(in)h(MachOb-)-57 807 y(jects,)16 b(like)e(the)g(\256le)h(server)n (,)i(the)d(process)h(management)h(server)-57 857 y(and)g(the)f(terminal)h (server)g(were)g(reused)g(with)f(minimal)g(or)h(no)-57 907 y(changes.)25 b(The)14 b(BSD)f(4.3)g(emulation,)h(although)d(not)i(yet)g (com-)-57 956 y(plete,)h(supports)e(a)i(number)f(of)g(utilities)d(like)j (login,)g(bash,)h(gcc,)-57 1006 y(vi,)c(make,)i(etc.)-7 1058 y(An)f(important)f(step)i(to)e(make)j(operating)d(systems)i(more)g(ex-)-57 1107 y(tensible)f(and)g(easy)h(to)f(con\256gure)g(is)g(to)g(re-architect)h (the)f(system)-57 1157 y(in)d(separate)j(components)d(that)h(can)h(be)f (executed)h(as)g(servers)f(and)-57 1207 y(interact)16 b(with)g(other)g (servers,)j(possibly)c(written)h(by)g(dif)o(ferent)-57 1257 y(or)o(ganizations.)h(Another)10 b(step)h(is)g(to)f(use)i(object-oriented)d (tech-)-57 1307 y(nology)h(to)h(specify)h(and)g(implement)f(the)g (interactions)g(between)-57 1356 y(the)g(several)h(components.)19 b(The)12 b(use)g(of)f(both)g(these)h(techniques)-57 1406 y(in)17 b(the)g(Mach)h(3.0)f(multi-server)f(results)h(in)f(a)i(system)g(that)e(is)-57 1456 y(extensible,)10 b(\257exible)g(and)g(made)i(of)e(replaceable)h(parts.) -57 1618 y Ff(Refer)o(ences)-57 1722 y Fe([1])20 b(F)m(.)k(Herrmann,)j(F)m(.) c(Armand,)k(M.Rozier)n(,)g(M.)d(Gien,)i(V)-5 b(.)12 1772 y(Abrossimov)m(,)14 b(I.)g(Boule,)g(M.)g(Guillemont,)f(P)-5 b(.)15 b(Leonard,)g(S.)12 1822 y(Langlois)i(and)g(W)l(.)h(Neuhauser)n(,)i(\252Chorus,)f(a)f(New)f(T)m (ech-)12 1871 y(nology)12 b(for)g(Building)f(UNIX)i(Systems,\272)i Fg(Proceedings)g(of)12 1921 y(EUUG)c(Autumn)p Fe(,)f(Cascais)h(\(Portugal\))e (October)h(1988.)-57 2010 y([2])20 b(P)-5 b(.)11 b(Guedes,)g(D.)f(Julin,)f (\252W)n(riting)g(the)h(Mach)g(3)g(Multi-Server)12 2060 y(System)h(in)g (C++,\272)h Fg(Design)f(review)h(of)f(the)g(Research)i(Insti-)12 2110 y(tute)p Fe(,)d(Open)g(Software)h(Foundation,)e(Feb)h(1991.)-57 2198 y([3])20 b(D.)9 b(Julin)e(and)h(R.)h(Rashid,)f(\252MachObjects,\272)j Fg(Internal)c(docu-)12 2248 y(ment)p Fe(,)h(Mach)f(project,)h(Carnegie)e (Mellon)g(University)m(,)h(1989.)-57 2337 y([4])20 b(Keith)12 b(Loepere,)k(Ed.)d(\252Mach)h(3)f(Kernel)g(Interface,\272)i Fg(Open)12 2387 y(Software)7 b(Foundation)f(and)i(Carnegie)g(Mellon)f (University)p Fe(,)12 2437 y(1990.)-57 2525 y([5])20 b(Bruce)d(Martin,)g (\252The)g(Separation)f(of)g(Interface)h(and)f(Im-)12 2575 y(plementation)f(in)h(C++\272,)k Fg(Proceedings)g(of)f(Usenix)g(C++)12 2625 y(Conference)p Fe(,)11 b(W)m(ashington,)e(D.C.,)j(April)d(22-25,)g (1991.)1013 42 y([6])20 b(R.)10 b(Rashid,)g(R.)g(Baron,)g(A.)h(Forin,)e(D.)i (Golub,)e(M.)i(Jones,)g(D.)1082 91 y(Julin,)h(D.)h(Orr)n(,)g(and)g(R.)f (Sanzi.)h(\252Mach:)20 b(A)12 b(foundation)f(for)1082 141 y(open)h (systems,\272)j Fg(Proceedings)f(of)f(the)h(Second)g(Workshop)1082 191 y(on)21 b(Workstation)e(Operating)h(Systems)p Fe(,)g(pages)e(109-113.) 1082 241 y(IEEE)11 b(Computer)f(Society)m(,)g(September)h(1989.)1013 324 y([7])20 b(M.)9 b(Shapiro,)g(\252Structure)g(and)g(Encapsulation)f(in)h (Distribut-)1082 374 y(ed)i(Systems:)k(The)c(Proxy)f(Principle,\272)g Fg(Proceedings)h(of)f(the)1082 423 y(6th)d(International)e(Conference)k(on)f (Distributed)e(Computer)1082 473 y(Systems)p Fe(,)k(pages)g(198-204,)f (Cambridge,)g(MA)g(\(USA\),)h(May)1082 523 y(1986.)1013 606 y([8])20 b(D.)12 b(Julin,)f(J.)g(Chew)m(,)i(P)-5 b(.)12 b(Guedes,)g(P)-5 b(.)13 b(Neves,)f(P)-5 b(.)13 b(Roy)d(and)i(M.)1082 656 y(Stevenson,)d (\252Generalized)h(Emulation)e(Services)h(for)f(Mach)1082 706 y(3.0)j(-)h(Overview)m(,)g(Experiences)h(and)e(Current)g(Status\272\272,)h Fg(To)1082 756 y(appear)17 b(in)f(Proceedings)h(of)g(Usenix)g(Mach)g (Symposium)p Fe(,)1082 805 y(Monterey)m(,)10 b(CA.,)h(Nov)f(20-22,)g(1991.)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF