Work on projects.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 12 Sep 2004 00:00:42 +0000 (00:00 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 12 Sep 2004 00:00:42 +0000 (00:00 +0000)
doc/Makefile [new file with mode: 0644]
doc/mlfqs.pdf [new file with mode: 0644]
doc/mlfqs.ps [new file with mode: 0644]
doc/threads.texi
doc/userprog.texi
doc/vm.texi

diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644 (file)
index 0000000..138cf35
--- /dev/null
@@ -0,0 +1,7 @@
+TEXIS = projects.texi threads.texi userprog.texi filesys.texi vm.texi
+
+projects.info: $(TEXIS)
+       makeinfo $<
+
+projects.html: $(TEXIS)
+       texi2html -toc_file=$@ -split=chapter -no-sec_nav -no-menu $<
diff --git a/doc/mlfqs.pdf b/doc/mlfqs.pdf
new file mode 100644 (file)
index 0000000..8895088
Binary files /dev/null and b/doc/mlfqs.pdf differ
diff --git a/doc/mlfqs.ps b/doc/mlfqs.ps
new file mode 100644 (file)
index 0000000..0b1f527
--- /dev/null
@@ -0,0 +1,3313 @@
+%!PS-Adobe-3.0
+%%Title: (Solaris)
+%%Version: 1 2
+%%CreationDate: (D:19981004210632)
+%%For: (Administrator)
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 612 792
+%%Pages: 7
+%%DocumentProcessColors: (atend)
+%%DocumentSuppliedResources:
+%%+ font TimesNewRoman,Italic$2X1
+%%+ font CourierNew
+%%+ font TimesNewRoman,Bold$2X1
+%%+ font TimesNewRoman$2X1
+%%+ procset (Adobe Acrobat - PDF operators) 1.2 0
+%%+ procset (Adobe Acrobat - type operators) 1.2 0
+%%+ procset (Adobe Acrobat - general image support) 1.2 0
+%%+ procset (Adobe Acrobat - monochrome image support) 1.2 0
+%%EndComments
+%%BeginDefaults
+%%EndDefaults
+%%BeginProlog
+%%EndProlog
+%%BeginSetup
+%%BeginFile: l2check
+%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved.
+systemdict /languagelevel known
+{ systemdict /languagelevel get 1 eq }
+{ true }
+ifelse
+{
+initgraphics /Helvetica findfont 18 scalefont setfont
+72 600 moveto (Error: Your printer driver needs to be configured) dup show
+72 580 moveto (for printing to a PostScript Level 1 printer.) dup show
+exch = =
+/Helvetica-Bold findfont 16 scalefont setfont
+72 520 moveto (Windows and Unix) show
+/Times-Roman findfont 16 scalefont setfont
+72 500 moveto (Select ªLevel 1º in the PostScript options section) show
+72 480 moveto (of the Acrobat Exchange or Reader print dialog.) show
+/Helvetica-Bold findfont 16 scalefont setfont
+72 440 moveto (Macintosh) show
+/Times-Roman findfont 16 scalefont setfont
+72 420 moveto (In the Chooser, select your printer driver.) show
+72 400 moveto (Then select your printer and click the Setup button.) show
+72 380 moveto (Follow any on-screen dialogs that may appear.) show
+showpage
+quit
+}
+if
+%%EndFile
+/currentpacking where{pop currentpacking true setpacking}if
+userdict /PDF 85 dict put
+%%BeginFile: pdfvars.prc
+%%Copyright: Copyright 1987-1996 Adobe Systems Incorporated. All Rights Reserved.
+userdict /PDFVars 75 dict dup begin put
+/_save 0 def
+/_cshow 0 def
+/InitAll 0 def
+/TermAll 0 def
+/_lp /none def
+/_doClip 0 def
+/sfc 0 def
+/_sfcs 0 def
+/_sfc 0 def
+/ssc 0 def
+/_sscs 0 def
+/_ssc 0 def
+/_fcs 0 def
+/_scs 0 def
+/_fp 0 def
+/_sp 0 def
+/_f0 0 array def
+/_f1 1 array def
+/_f3 3 array def
+/_f4 4 array def
+/_fc null def
+/_s0 0 array def
+/_s1 1 array def
+/_s3 3 array def
+/_s4 4 array def
+/_sc null def
+/_cpcf null def
+/_cpcs null def
+/_inT false def
+/_tr -1 def
+/_rise 0 def
+/_ax 0 def
+/_cx 0 def
+/_ld 0 def
+/_tm matrix def
+/_ctm matrix def
+/_mtx matrix def
+/_hy (-) def
+/_fScl 0 def
+/_hs 1 def
+/_pdfEncodings 2 array def
+/_baselineadj 0 def
+/_Tj 0 def
+/_italMtx[1 0 .212557 1 0 0]def
+/_italMtx_WMode1 [1 -.212557 0 1 0 0]def
+/_basefont 0 def
+/_basefonto 0 def
+/_pdf_oldCIDInit null def
+/_categories 10 dict def
+/_sa? true def
+/_op? false def
+/_ColorSep5044? false def
+/_tmpcolr? [] def
+/_tmpop? {} def
+end
+%%EndFile
+PDFVars begin PDF begin
+%%BeginFile: pdfutil.prc
+%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd {bind def} bind def
+/ld {load def} bd
+/dd { PDFVars 3 1 roll put } bd
+/xdd { exch dd } bd
+/Level2?
+systemdict /languagelevel known
+{ systemdict /languagelevel get 2 ge } { false } ifelse
+def
+/here {
+dup currentdict exch known
+{ currentdict exch get true }
+{ pop false }
+ifelse
+} bd
+/isdefined? { where { pop true } { false } ifelse } bd
+/StartLoad { dup dup not { /_save save dd } if } bd
+/EndLoad { if not { _save restore } if } bd
+/npop { { pop } repeat } bd
+%%EndFile
+%%BeginFile: pdf.prc
+%%Copyright: Copyright 1987-1996 Adobe Systems Incorporated. All Rights Reserved.
+/initialize {
+_ColorSep5044? {sep_ops begin 50 dict begin} if
+newpath
+} bd
+/terminate {
+_ColorSep5044? {end end} if
+} bd
+Level2? StartLoad
+{ /m/moveto ld
+/l/lineto ld
+/c/curveto ld
+/setSA/setstrokeadjust ld
+} EndLoad
+Level2? not StartLoad
+{
+/pl {
+transform
+0.25 sub round 0.25 add exch
+0.25 sub round 0.25 add exch
+itransform
+} bd
+/m { _sa? { pl } if moveto } bd
+/l { _sa? { pl } if lineto } bd
+/c { _sa? { pl } if curveto } bd
+/setSA { /_sa? xdd } bd
+} EndLoad
+/v { currentpoint 6 2 roll c } bd
+/y { 2 copy c } bd
+/h/closepath ld
+/d/setdash ld
+/j/setlinejoin ld
+/J/setlinecap ld
+/M/setmiterlimit ld
+/w/setlinewidth ld
+/cf currentflat def
+/i {
+dup 0 eq { pop cf } if
+setflat
+} bd
+/ilp { /_lp /none dd } bd
+/sfc {
+_lp /fill ne {
+_sfcs
+_sfc
+/_lp /fill dd
+} if
+} dd
+/ssc {
+_lp /stroke ne {
+_sscs
+_ssc
+/_lp /stroke dd
+} if
+} dd
+/n {
+_doClip 1 ge {
+_doClip 1 eq { clip } { eoclip } ifelse
+/_doClip 0 dd
+} if
+newpath
+} bd
+/f {
+_doClip 1 ge
+{
+gsave sfc fill grestore
+_doClip 1 eq { clip } { eoclip } ifelse
+newpath
+ilp
+/_doClip 0 dd
+}
+{ sfc fill }
+ifelse
+} bd
+/f* {
+_doClip 1 ge
+{
+gsave sfc eofill grestore
+_doClip 1 eq { clip } { eoclip } ifelse
+newpath
+ilp
+/_doClip 0 dd
+}
+{ sfc eofill }
+ifelse
+} bd
+/S {
+_doClip 1 ge
+{
+gsave ssc stroke grestore
+_doClip 1 eq { clip } { eoclip } ifelse
+newpath
+ilp
+/_doClip 0 dd
+}
+{ ssc stroke }
+ifelse
+} bd
+/s { h S } bd
+/B {
+_doClip dup 1 ge
+gsave f grestore
+{
+gsave S grestore
+1 eq { clip } { eoclip } ifelse
+newpath
+ilp
+/_doClip 0 dd
+}
+{ pop S }
+ifelse
+} bd
+/b { h B } bd
+/B* {
+_doClip dup 1 ge
+gsave f* grestore
+{
+gsave S grestore
+1 eq { clip } { eoclip } ifelse
+newpath
+ilp
+/_doClip 0 dd
+}
+{ pop S }
+ifelse
+} bd
+/b* { h B* } bd
+/W { /_doClip 1 dd } bd
+/W* { /_doClip 2 dd } bd
+/q/save ld
+/Q { restore ilp } bd
+Level2? StartLoad
+{ /defineRes/defineresource ld
+/findRes/findresource ld
+currentglobal
+true systemdict /setglobal get exec
+[/Function /ExtGState /Form]
+{ /Generic /Category findresource dup length dict copy /Category defineresource pop }
+forall
+systemdict /setglobal get exec
+} EndLoad
+Level2? not StartLoad
+{ /AlmostFull?
+{ dup maxlength exch length sub 2 le
+} bind def
+/Expand
+{ 1 index maxlength mul cvi dict
+dup begin exch { def } forall end
+} bind def
+/xput
+{ 3 2 roll
+dup 3 index known not
+{ dup AlmostFull? { 1.5 Expand } if
+} if
+dup 4 2 roll put
+} bind def
+/defineRes
+{ _categories 1 index known not
+{ /_categories _categories 2 index 10 dict xput store
+} if
+_categories exch 2 copy get 5 -1 roll 4 index xput put
+} bind def
+/findRes
+{ _categories exch get exch get
+} bind def
+} EndLoad
+/cs
+{
+dup where { pop load } if
+dup /_fcs xdd
+ucs
+_cpcf exch get
+/_fc xdd
+/_fp null dd
+} bd
+/CS
+{
+dup where { pop load } if
+dup /_scs xdd ucs _cpcs exch get /_sc xdd /_sp null dd
+} bd
+/ucs {
+dup type /arraytype eq
+{ dup 0 get
+dup /Indexed eq
+{ pop 0 get }
+{ /Pattern eq
+{ dup length 2 eq
+{ 1 get ucs }
+{ 0 get }
+ifelse }
+{ 0 get }
+ifelse }
+ifelse }
+if }
+bd
+/_cpcf
+15 dict dup begin
+/DefaultGray _f1 def
+/DeviceGray _f1 def
+/DefaultRGB _f3 def
+/DeviceRGB _f3 def
+/DeviceCMYK _f4 def
+/CalGray _f1 def
+/CalRGB _f3 def
+/CalCMYK _f4 def
+/Lab _f3 def
+/Pattern _f0 def
+/Indexed _f1 def
+/Separation _f1 def
+/CIEBasedA _f1 def
+/CIEBasedABC _f3 def
+end
+dd
+/_cpcs
+15 dict dup begin
+/DefaultGray _s1 def
+/DeviceGray _s1 def
+/DefaultRGB _s3 def
+/DeviceRGB _s3 def
+/DeviceCMYK _s4 def
+/CalGray _s1 def
+/CalRGB _s3 def
+/CalCMYK _s4 def
+/Lab _s3 def
+/Pattern _s0 def
+/Indexed _s1 def
+/Separation _s1 def
+/CIEBasedA _s1 def
+/CIEBasedABC _s3 def
+end
+dd
+Level2? not StartLoad {
+/ri/pop ld
+/makePat/pop ld
+} EndLoad
+Level2? StartLoad {
+/ri
+{
+/findcolorrendering isdefined?
+{
+mark exch
+findcolorrendering
+counttomark 2 eq
+{ type /booleantype eq
+{ dup type /nametype eq
+{ dup /ColorRendering resourcestatus
+{ pop pop
+dup /DefaultColorRendering ne
+{
+/ColorRendering findresource
+setcolorrendering
+} if
+} if
+} if
+} if
+} if
+cleartomark
+}
+{ pop
+} ifelse
+} bd
+/makePat /makepattern ld
+} EndLoad
+Level2? not _ColorSep5044? or StartLoad
+{
+/L1setcolor {
+aload length
+dup 0 eq
+{ pop .5 setgray }
+{ dup 1 eq
+{ pop setgray }
+{ 3 eq
+{ setrgbcolor }
+{ setcmykcolor }
+ifelse }
+ifelse }
+ifelse
+} bind dd
+/_sfcs { } dd
+/_sscs { } dd
+} EndLoad
+Level2? not _ColorSep5044? not and StartLoad
+{
+/_sfc { _fc L1setcolor } dd
+/_ssc { _sc L1setcolor } dd
+} EndLoad
+Level2? _ColorSep5044? not and StartLoad
+{
+/_sfcs
+{
+_fcs setcolorspace
+} bind dd
+/_sscs
+{
+_scs setcolorspace
+} bind dd
+/_sfc
+{
+_fc aload pop
+_fp null eq
+{ setcolor }
+{ _fp setpattern }
+ifelse
+} bind dd
+/_ssc
+{
+_sc aload pop
+_sp null eq { setcolor } { _sp setpattern } ifelse
+} bind dd
+} EndLoad
+/sc
+{
+_fc astore pop
+ilp
+} bd
+/SC
+{
+_sc astore pop
+ilp
+} bd
+/scn {
+dup type /dicttype eq
+{ dup /_fp xdd
+/PaintType get 1 eq
+{ /_fc _f0 dd ilp }
+{ /_fc _cpcf _fcs ucs get dd
+sc }
+ifelse }
+{ sc }
+ifelse
+} bd
+/SCN {
+dup type /dicttype eq
+{ dup /_sp xdd
+/PaintType get 1 eq
+{ /_sc _s0 dd ilp }
+{ /_sc _cpcs _scs ucs get dd
+SC }
+ifelse }
+{ SC }
+ifelse
+} bd
+/g { /DefaultGray cs sc } bd
+/rg { /DefaultRGB cs sc } bd
+/k { /DeviceCMYK cs sc } bd
+/G { /DefaultGray CS SC } bd
+/RG { /DefaultRGB CS SC } bd
+/K { /DeviceCMYK CS SC } bd
+/cm { _mtx astore concat } bd
+/re {
+4 2 roll m
+1 index 0 rlineto
+0 exch rlineto
+neg 0 rlineto
+h
+} bd
+/RC/rectclip ld
+/EF/execform ld
+/PS { cvx exec } bd
+/initgs {
+/DefaultGray where
+{ pop }
+{ /DefaultGray /DeviceGray dd }
+ifelse
+/DefaultRGB where
+{ pop }
+{ /DefaultRGB /DeviceRGB dd }
+ifelse
+0 g 0 G
+[] 0 d 0 j 0 J 10 M 1 w
+true setSA
+} bd
+21 dict dup begin
+/CosineDot
+{ 180 mul cos exch 180 mul cos add 2 div } bd
+/Cross
+{ abs exch abs 2 copy gt { exch } if pop neg } bd
+/Diamond
+{ abs exch abs 2 copy add .75 le
+{ dup mul exch dup mul add 1 exch sub }
+{ 2 copy add 1.23 le
+{ .85 mul add 1 exch sub }
+{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
+ifelse }
+ifelse } bd
+/Double
+{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } bd
+/DoubleDot
+{ 2 { 360 mul sin 2 div exch } repeat add } bd
+/Ellipse
+{ abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt
+{ pop dup mul exch .75 div dup mul add 4 div
+1 exch sub }
+{ dup 1 gt
+{pop 1 exch sub dup mul exch 1 exch sub
+.75 div dup mul add 4 div 1 sub }
+{ .5 exch sub exch pop exch pop }
+ifelse }
+ifelse } bd
+/EllipseA
+{ dup mul .9 mul exch dup mul add 1 exch sub } bd
+/EllipseB
+{ dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } bd
+/EllipseC
+{ dup .5 gt { 1 exch sub } if
+dup .25 ge
+{ .5 exch sub 4 mul dup mul 1 sub }
+{ 4 mul dup mul 1 exch sub }
+ifelse
+exch
+dup .5 gt { 1 exch sub } if
+dup .25 ge
+{ .5 exch sub 4 mul dup mul 1 sub }
+{ 4 mul dup mul 1 exch sub }
+ifelse
+add -2 div } bd
+/InvertedDouble
+{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg } bd
+/InvertedDoubleDot
+{ 2 { 360 mul sin 2 div exch } repeat add neg } bd
+/InvertedEllipseA
+{ dup mul .9 mul exch dup mul add 1 sub } bd
+/InvertedSimpleDot
+{ dup mul exch dup mul add 1 sub } bd
+/Line
+{ exch pop abs neg } bd
+/LineX
+{ pop } bd
+/LineY
+{ exch pop } bd
+/Rhomboid
+{ abs exch abs 0.9 mul add 2 div } bd
+/Round
+{ abs exch abs 2 copy add 1 le
+{ dup mul exch dup mul add 1 exch sub }
+{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
+ifelse } bd
+/SimpleDot
+{ dup mul exch dup mul add 1 exch sub } bd
+/Square
+{ abs exch abs 2 copy lt { exch } if pop neg } bd
+end
+{ /Function defineRes pop } forall
+/Identity {} /Function defineRes pop
+_ColorSep5044? StartLoad {
+/_defaulttransferfunc currenttransfer def
+/currentcolortransfer where
+{ pop /_defaultcolortransferfuncs [ currentcolortransfer ] def }
+if
+/concattransferfuncs {
+[ 3 1 roll /exec load exch /exec load ] cvx
+} bd
+/concatandsettransfer {
+/_defaulttransferfunc load concattransferfuncs settransfer
+} bd
+/concatandsetcolortransfer {
+colorplate 0 eq
+{
+_defaultcolortransferfuncs aload pop
+8 -1 roll 5 -1 roll concattransferfuncs 7 1 roll
+6 -1 roll 4 -1 roll concattransferfuncs 5 1 roll
+4 -1 roll 3 -1 roll concattransferfuncs 3 1 roll
+concattransferfuncs
+setcolortransfer
+} if
+colorplate 1 ge colorplate 4 le and
+{
+4 colorplate sub index 4 { exch pop } repeat
+concatandsettransfer
+} if
+colorplate 5 ge
+{
+0 index 4 { exch pop } repeat
+concatandsettransfer
+} if
+} bd
+/tn5044sethalftone
+{
+begin
+HalftoneType 5 eq
+{ [/Default /Cyan /Magenta /Yellow /Black /Default /Default /Default]
+colorplate get
+here not {
+/Default here not { currentdict } if
+} if
+}
+{ currentdict }
+ifelse
+end
+begin
+/TransferFunction here
+{
+concatandsettransfer
+currentdict dup length dict
+begin
+{
+1 index /TransferFunction ne { def } { pop pop } ifelse
+} forall
+currentdict
+end
+}
+{
+currentdict
+} ifelse
+end
+sethalftone
+} bd
+} EndLoad
+Level2? StartLoad {
+/gs
+{
+begin
+/SA here { setstrokeadjust } if
+/OP here { setoverprint } if
+/BG here { setblackgeneration } if
+/UCR here { setundercolorremoval } if
+/TR here
+{
+_ColorSep5044?
+{
+dup xcheck
+{ concatandsettransfer }
+{ aload pop concatandsetcolortransfer }
+ifelse
+}
+{
+dup xcheck
+{ settransfer }
+{ aload pop setcolortransfer }
+ifelse
+} ifelse
+} if
+/sethalftonephase isdefined? { /HTP here { sethalftonephase } if } if
+/HT here
+{ _ColorSep5044?
+{ tn5044sethalftone }
+{ sethalftone }
+ifelse
+} if
+end
+} bd
+/_defaulthalftone currenthalftone def
+} EndLoad
+Level2? not StartLoad {
+/gs
+{
+begin
+/SA here { /_sa? xdd } if
+/OP here { dup /_op? xdd
+/setoverprint where {pop setoverprint}
+{pop} ifelse
+} if
+/TR here
+{
+_ColorSep5044?
+{ dup xcheck
+{ concatandsettransfer }
+{ aload pop concatandsetcolortransfer }
+ifelse
+}
+{ dup xcheck
+{ settransfer }
+{ aload pop setcolortransfer }
+ifelse
+} ifelse
+} if
+/HT here
+{ _ColorSep5044?
+{ tn5044sethalftone }
+{ sethalftone }
+ifelse
+} if
+end
+} bd
+5 dict dup
+begin
+currentscreen 1 [/HalftoneType /SpotFunction /Angle /Frequency ]
+{ exch def } forall
+end
+/_defaulthalftone exch def
+} EndLoad
+/int {
+dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul
+exch pop add exch pop
+} bd
+/limit {
+dup 2 index le { exch } if pop
+dup 2 index ge { exch } if pop
+} bd
+_ColorSep5044? StartLoad {
+/_sfc
+{
+_fp null eq
+{ _fcs type /arraytype eq
+{_fcs 0 get /Separation eq
+{
+_fcs 1 get /All eq
+{
+_fc aload pop 1 exch sub
+/setseparationgray where pop begin setseparationgray end
+}
+{
+1 _fcs 3 get exec _fcs 1 get
+/findcmykcustomcolor where pop begin findcmykcustomcolor end
+_fc aload pop
+/setcustomcolor where pop begin setcustomcolor end
+}
+ifelse
+}
+{ _fc L1setcolor }
+ifelse
+}
+{ _fc L1setcolor }
+ifelse
+}
+{ _fc L1setcolor }
+ifelse
+} bind dd
+/_ssc
+{
+_sp null eq
+{ _scs type /arraytype eq
+{_scs 0 get /Separation eq
+{
+_scs 1 get /All eq
+{
+_sc aload pop 1 exch sub
+/setseparationgray where pop begin setseparationgray end
+}
+{
+1 _scs 3 get exec _scs 1 get
+/findcmykcustomcolor where pop begin findcmykcustomcolor end
+_sc aload pop
+/setcustomcolor where pop begin setcustomcolor end
+}
+ifelse
+}
+{ _sc L1setcolor }
+ifelse
+}
+{ _sc L1setcolor }
+ifelse
+}
+{ _sc L1setcolor }
+ifelse
+} bind dd
+} EndLoad
+%%EndFile
+%%BeginFile: pdftext.prc
+%%Copyright: Copyright 1987-1997 Adobe Systems Incorporated. All Rights Reserved.
+PDF /PDFText 65 dict dup begin put
+/initialize { PDFText begin } bd
+/terminate { end } bd
+/pdf_has_composefont? systemdict /composefont known def
+/CopyFont {
+{
+1 index /FID ne 2 index /UniqueID ne and
+{ def } { pop pop } ifelse
+} forall
+} bd
+/Type0CopyFont
+{
+exch
+dup length dict
+begin
+CopyFont
+[
+exch
+FDepVector
+{
+dup /FontType get 0 eq
+{
+1 index Type0CopyFont
+/_pdfType0 exch definefont
+}
+{
+/_pdfBaseFont exch
+2 index exec
+}
+ifelse
+exch
+}
+forall
+pop
+]
+/FDepVector exch def
+currentdict
+end
+} bd
+/cHexEncoding
+[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
+/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
+/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
+/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
+/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
+/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
+/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
+/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
+/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
+/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
+/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
+/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
+/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
+/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def
+/modEnc {
+/_enc xdd
+/_icode 0 dd
+counttomark 1 sub -1 0
+{
+index
+dup type /nametype eq
+{
+_enc _icode 3 -1 roll put
+_icode 1 add
+}
+if
+/_icode xdd
+} for
+cleartomark
+_enc
+} bd
+/trEnc {
+/_enc xdd
+255 -1 0 {
+exch dup -1 eq
+{ pop /.notdef }
+{ Encoding exch get }
+ifelse
+_enc 3 1 roll put
+} for
+pop
+_enc
+} bd
+/TE {
+/_i xdd
+StandardEncoding 256 array copy modEnc
+_pdfEncodings exch _i exch put
+} bd
+/TZ
+{
+/_usePDFEncoding xdd
+findfont
+dup length 2 add dict
+begin
+{
+1 index /FID ne { def } { pop pop } ifelse
+} forall
+/FontName exch def
+_usePDFEncoding 0 ge
+{
+/Encoding _pdfEncodings _usePDFEncoding get def
+pop
+}
+{
+_usePDFEncoding -1 eq
+{
+counttomark 0 eq
+{ pop }
+{
+Encoding 256 array copy
+modEnc /Encoding exch def
+}
+ifelse
+}
+{
+256 array
+trEnc /Encoding exch def
+}
+ifelse
+}
+ifelse
+FontName currentdict
+end
+definefont pop
+}
+bd
+/Level2?
+systemdict /languagelevel known
+{systemdict /languagelevel get 2 ge}
+{false}
+ifelse
+def
+Level2?
+{
+/_pdfFontStatus
+{
+currentglobal exch
+/Font resourcestatus
+{pop pop true}
+{false}
+ifelse
+exch setglobal
+} bd
+}
+{
+/_pdfFontStatusString 50 string def
+_pdfFontStatusString 0 (fonts/) putinterval
+/_pdfFontStatus
+{
+_pdfFontStatusString 6 42 getinterval
+cvs length 6 add
+_pdfFontStatusString exch 0 exch getinterval
+status
+{ pop pop pop pop true}
+{ false }
+ifelse
+} bd
+}
+ifelse
+Level2?
+{
+/_pdfCIDFontStatus
+{
+/CIDFont /Category resourcestatus
+{
+pop pop
+/CIDFont resourcestatus
+{pop pop true}
+{false}
+ifelse
+}
+{ pop false }
+ifelse
+} bd
+}
+if
+/_pdfString100 100 string def
+/_pdfComposeFontName
+{
+dup length 1 eq
+{
+0 get
+1 index
+type /nametype eq
+{
+_pdfString100 cvs
+length dup dup _pdfString100 exch (-) putinterval
+_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
+2 index exch cvs length
+add 1 add _pdfString100 exch 0 exch getinterval
+exch pop
+true
+}
+{
+pop pop
+false
+}
+ifelse
+}
+{
+false
+}
+ifelse
+} bd
+pdf_has_composefont?
+{
+/_pdfComposeFont
+{
+1 index /CMap resourcestatus
+{pop pop true}
+{false}
+ifelse
+1 index true exch
+{
+_pdfCIDFontStatus not
+{pop false exit}
+if
+}
+forall
+and
+{ 3 -1 roll pop composefont true}
+{
+4 -1 roll pop
+_pdfComposeFontName
+{
+dup _pdfFontStatus
+{ findfont definefont true }
+{
+pop
+dup _pdfFontStatus
+{ findfont true }
+{ pop false }
+ifelse
+}
+ifelse
+}
+{
+dup _pdfFontStatus
+{ findfont true }
+{ pop false }
+ifelse
+}
+ifelse
+}
+ifelse
+} bd
+}
+{
+/_pdfComposeFont
+{
+4 -1 roll pop
+_pdfComposeFontName not
+{
+dup
+}
+if
+2 copy _pdfFontStatus
+{pop findfont exch pop true}
+{
+eq
+{pop false}
+{
+dup _pdfFontStatus
+{findfont true}
+{pop false}
+ifelse
+}
+ifelse
+}
+ifelse
+} bd
+}
+ifelse
+/_pdfFaceByStyleDict 4 dict dup begin
+Level2?
+{
+/Serif
+/HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiMin-W3}
+{/Ryumin-Light}
+ifelse
+def
+/SansSerif
+/HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiKakuGo-W5}
+{/GothicBBB-Medium}
+ifelse
+def
+/HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus
+{/HeiseiMaruGo-W4}
+{
+/Jun101-Light-RKSJ-H _pdfFontStatus
+{ /Jun101-Light }
+{ SansSerif }
+ifelse
+}
+ifelse
+/RoundSansSerif exch def
+/Default Serif def
+}
+{
+/Serif /Ryumin-Light def
+/SansSerif /GothicBBB-Medium def
+{
+(fonts/Jun101-Light-83pv-RKSJ-H) status
+}stopped
+{pop}{
+{ pop pop pop pop /Jun101-Light }
+{ SansSerif }
+ifelse
+/RoundSansSerif exch def
+}ifelse
+/Default Serif def
+}
+ifelse
+end
+def
+/_pdf_Adobe-Japan1-2 (Adobe-Japan1-2) def
+/_pdfConcatNames
+{
+exch
+_pdfString100 cvs
+length dup dup _pdfString100 exch (-) putinterval
+_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
+3 -1 roll exch cvs length
+add 1 add _pdfString100 exch 0 exch getinterval
+} bind def
+/_pdfSubSetFontByStyleDict 4 dict dup begin
+_pdfFaceByStyleDict
+{
+_pdf_Adobe-Japan1-2 _pdfConcatNames
+dup _pdfFontStatus
+{ def }
+{
+{
+pop
+dup /SansSerif eq
+{
+/HeiseiKakuGo-W5-Adobe-Japan1-2 dup _pdfFontStatus
+{ def exit }
+{ pop }
+ifelse
+}
+if
+dup /Serif eq
+{
+/HeiseiMin-W3-Adobe-Japan1-2 dup _pdfFontStatus
+{ def exit }
+{ pop }
+ifelse
+}
+if
+pop exit
+}
+loop
+}
+ifelse
+}
+forall
+end def
+/TZzero
+{
+/_fyAdj xdd
+/_wmode xdd
+/_styleArr xdd
+4 copy
+_pdfComposeFont
+{exch pop exch pop exch pop}
+{
+[
+0 1 _styleArr length 1 sub
+{
+_styleArr exch get
+_pdfFaceByStyleDict exch 2 copy known not
+{ pop /Default }
+if
+get
+}
+for
+]
+exch pop
+3 index 3 index 4 2 roll
+_pdfComposeFont
+{exch pop}
+{
+findfont
+}
+ifelse
+}
+ifelse
+dup /FontType get 3 eq _wmode 1 eq and
+{
+_pdfVerticalRomanT3Font dup length dict copy
+begin
+/_basefont exch def
+/Encoding _basefont /Encoding get def
+}
+{
+dup length 2 add dict
+begin
+{1 index /FID ne {def}{pop pop} ifelse }
+forall
+} ifelse
+/WMode _wmode def
+/BaseLineAdj _fyAdj def
+FontType 0 ne
+{
+/Encoding Encoding dup length array copy dup 16#5c /yen put def
+/_fauxfont true def
+} if
+currentdict
+end
+definefont pop
+}
+bd
+/swj {
+dup 4 1 roll
+dup length exch stringwidth
+exch 5 -1 roll 3 index mul add
+4 1 roll 3 1 roll mul add
+6 2 roll /_cnt 0 dd
+{1 index eq {/_cnt _cnt 1 add dd} if} forall pop
+exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
+} bd
+/jss {
+4 1 roll
+{
+2 npop
+(0) exch 2 copy 0 exch put
+gsave
+32 eq
+{
+exch 6 index 6 index 6 index 5 -1 roll widthshow
+currentpoint
+}
+{
+false charpath currentpoint
+4 index setmatrix stroke
+}
+ifelse
+grestore
+moveto
+2 copy rmoveto
+} exch cshow
+6 npop
+} def
+/jsfTzero {
+{
+2 npop
+(0) exch 2 copy 0 exch put
+exch show
+32 eq
+{
+4 index 4 index rmoveto
+}
+if
+2 copy rmoveto
+} exch cshow
+5 npop
+} def
+/jsp
+{
+{
+2 npop
+(0) exch 2 copy 0 exch put
+32 eq
+{ exch 5 index 5 index 5 index 5 -1 roll widthshow }
+{ false charpath }
+ifelse
+2 copy rmoveto
+} exch cshow
+5 npop
+} bd
+/trj { _cx 0 fWModeProc 32 _ax 0 fWModeProc 6 5 roll } bd
+/pjsf { trj sfc fawidthshowProc } bd
+/pjss { trj _ctm ssc jss } bd
+/pjsc { trj jsp } bd
+/_Tjdef [
+/pjsf load
+/pjss load
+{
+dup
+currentpoint 3 2 roll
+pjsf
+newpath moveto
+pjss
+} bind
+{
+trj swj rmoveto
+} bind
+{
+dup currentpoint 4 2 roll gsave
+pjsf
+grestore 3 1 roll moveto
+pjsc
+} bind
+{
+dup currentpoint 4 2 roll
+currentpoint gsave newpath moveto
+pjss
+grestore 3 1 roll moveto
+pjsc
+} bind
+{
+dup currentpoint 4 2 roll gsave
+dup currentpoint 3 2 roll
+pjsf
+newpath moveto
+pjss
+grestore 3 1 roll moveto
+pjsc
+} bind
+/pjsc load
+] def
+/BT
+{
+/_inT true dd
+_ctm currentmatrix pop matrix _tm copy pop
+0 _rise _baselineadj add translate _hs 1 scale
+0 0 moveto
+} bd
+/ET
+{
+/_inT false dd
+_tr 3 gt {clip} if
+_ctm setmatrix newpath
+} bd
+/Tr {
+_inT { _tr 3 le {currentpoint newpath moveto} if } if
+dup /_tr xdd
+_Tjdef exch get /_Tj xdd
+} bd
+/Tj {
+userdict /$$copystring 2 index put
+_Tj
+} bd
+/iTm { _ctm setmatrix _tm concat 0 _rise _baselineadj add translate _hs 1 scale } bd
+/Tm { _tm astore pop iTm 0 0 moveto } bd
+/Td { _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto } bd
+/TD { dup /_ld xdd Td } bd
+/_nullProc {} bd
+/Tf {
+dup 1000 div /_fScl xdd
+exch findfont dup
+/_nullProc exch
+/WMode known
+{
+1 index /WMode get 1 eq
+{pop /exch}
+if
+}
+if
+load /fWModeProc xdd
+dup
+/FontType get 0 eq dup _cx 0 ne and
+{ /jsfTzero }
+{ /awidthshow }
+ifelse
+load /fawidthshowProc xdd
+/_fTzero xdd
+dup /BaseLineAdj known
+{ dup /BaseLineAdj get _fScl mul }
+{ 0 }
+ifelse
+/_baselineadj xdd
+currentpoint iTm moveto
+exch scalefont setfont
+} bd
+/TL { neg /_ld xdd } bd
+/Tw {
+/_cx xdd
+_cx 0 ne _fTzero and
+{ /jsfTzero }
+{ /awidthshow }
+ifelse
+load /fawidthshowProc xdd
+} bd
+/Tc { /_ax xdd } bd
+/Ts { /_rise xdd currentpoint iTm moveto } bd
+/Tz { 100 div /_hs xdd iTm } bd
+/Tk { exch pop _fScl mul neg 0 fWModeProc rmoveto } bd
+/T* { 0 _ld Td } bd
+/' { T* Tj } bd
+/" { exch Tc exch Tw ' } bd
+/TJ {
+{
+dup type /stringtype eq
+{ Tj }
+{ 0 exch Tk }
+ifelse
+} forall
+} bd
+/T- { _hy Tj } bd
+/d0/setcharwidth ld
+/d1 { setcachedevice /sfc{}dd /ssc{}dd } bd
+/nND {{/.notdef} repeat} bd
+/T3Defs {
+/BuildChar
+{
+1 index /Encoding get exch get
+1 index /BuildGlyph get exec
+}
+def
+/BuildGlyph {
+exch begin
+GlyphProcs exch get exec
+end
+} def
+} bd
+/_pdfBoldRomanWidthProc
+{
+stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth
+} bd
+/_pdfType0WidthProc
+{
+dup stringwidth 0 0 moveto
+2 index true charpath pathbbox
+0 -1
+7 index 2 div .88
+setcachedevice2
+pop
+} bd
+/_pdfBoldBaseFont
+10 dict begin
+/FontType 3 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox[0 0 1 1]def
+/Encoding cHexEncoding def
+/_setwidthProc /_pdfBoldRomanWidthProc load def
+/_bcstr1 1 string def
+/BuildChar
+{
+exch begin
+_basefont setfont
+_bcstr1 dup 0 4 -1 roll put
+dup
+_setwidthProc
+0 0 moveto
+dup show
+_basefonto setfont
+0 0 moveto
+show
+end
+}bd
+currentdict
+end
+def
+/_pdfVerticalRomanT3Font
+10 dict begin
+/FontType 3 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox[0 0 1 1]def
+/_bcstr1 1 string def
+/BuildChar
+{
+exch begin
+_basefont setfont
+_bcstr1 dup 0 4 -1 roll put
+dup
+_pdfType0WidthProc
+0 0 moveto
+show
+end
+}bd
+currentdict
+end
+def
+/MakeBoldFont
+{
+dup dup length 2 add dict
+begin
+CopyFont
+/PaintType 2 def
+/StrokeWidth .03 0 FontMatrix idtransform pop def
+/dummybold currentdict
+end
+definefont
+_pdfBoldBaseFont 8 dict copy begin
+/_basefont exch def
+/_basefonto exch def
+currentdict
+end
+definefont
+} bd
+/MakeBold {
+findfont dup
+/FontType get 0 eq
+{
+_pdfBoldBaseFont /_setwidthProc /_pdfType0WidthProc load put
+{MakeBoldFont} Type0CopyFont definefont
+}
+{
+dup /_fauxfont known not
+{
+_pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put
+MakeBoldFont
+}
+{ definefont }
+ifelse
+}
+ifelse
+pop
+}bd
+/MakeItalic {
+findfont
+dup /WMode 2 copy known
+{
+get 1 eq
+{ _italMtx_WMode1 }
+{ _italMtx }
+ifelse
+}
+{ pop pop _italMtx }
+ifelse
+makefont
+definefont pop
+}bd
+/MakeBoldItalic {
+/dummybold exch
+MakeBold
+/dummybold
+MakeItalic
+}bd
+currentdict readonly pop end
+%%EndFile
+PDFText begin
+[39/quotesingle 96/grave 128/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/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.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/divide
+/.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
+0 TE
+[1/dotlessi/caron 39/quotesingle 96/grave 
+127/bullet/bullet/bullet/quotesinglbase/florin/quotedblbase/ellipsis
+/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE
+/bullet/bullet/bullet/bullet/quoteleft/quoteright/quotedblleft
+/quotedblright/bullet/endash/emdash/tilde/trademark/scaron
+/guilsinglright/oe/bullet/bullet/Ydieresis/space/exclamdown/cent/sterling
+/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine
+/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus
+/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla
+/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
+/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
+/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave
+/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde
+/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute
+/ucircumflex/udieresis/yacute/thorn/ydieresis
+1 TE
+end
+%%BeginFile: pdfimage.prc
+%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
+PDF /PDFImage 38 dict put
+PDF /PDFIVars 20 dict put
+PDF /PDFImage get begin
+/initialize { PDFImage begin } bd
+/terminate { end } bd
+/nulldict 0 dict def
+/gv { PDFIVars exch get } bd
+/pv { PDFIVars 3 1 roll put } bd
+/BI { save /savelevel exch pv mark } bd
+/EI { /savelevel gv restore } bd
+end
+%%EndFile
+%%BeginFile: pdfimg2.prc
+%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
+PDF /PDFImage get begin
+Level2? StartLoad {
+/ID {
+5 counttomark 2 idiv
+dup 3 1 roll add
+dict begin
+{ def } repeat
+cleartomark
+currentdict
+end
+begin
+/ImageType 1 def
+/ImageMatrix [ Width 0 0 Height neg 0 Height ] def
+/ImageMask here { not } { true } ifelse
+{ /ImageMask false def } if
+ImageMask not { ColorSpace setcolorspace } if
+/Intent here { ri } if
+/Decode here { pop } {
+/Decode [
+ImageMask {
+0 1
+} {
+currentcolorspace 0 get /Indexed eq {
+0 2 BitsPerComponent exp 1 sub
+} {
+mark currentcolor counttomark
+dup 2 add 1 roll cleartomark
+{ 0 1 } repeat
+} ifelse
+} ifelse
+] def
+} ifelse
+[
+/DataSource here { pop } {
+currentfile
+/Filter here {
+dup type /arraytype eq { length } { pop 1 } ifelse
+1 sub 0 1 3 -1 roll {
+/DecodeParms here {
+dup type /arraytype eq {
+1 index get
+} if
+dup null eq { pop } { exch } ifelse
+} if
+Filter dup type /arraytype eq
+{ exch get } { exch pop } ifelse
+filter
+dup
+} for
+} if
+/DataSource exch def
+} ifelse
+currentdict
+/ImageMask here not { false } if
+{ sfc imagemask } { image } ifelse
+counttomark
+{ dup status
+{ dup flushfile closefile }
+{ pop }
+ifelse
+}
+repeat
+pop
+end
+} bd
+currentdict readonly pop
+} EndLoad
+end
+%%EndFile
+currentdict readonly pop
+end end
+/currentpacking where {pop setpacking}if
+PDFVars/InitAll{[PDF PDFText PDFImage]{/initialize get exec}forall initgs 0 Tr}put
+PDFVars/TermAll{[PDFImage PDFText PDF]{/terminate get exec}forall}put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+userdict begin
+%%BeginResource: font TimesNewRoman,Bold
+%%EndResource
+end
+% Begin encoding-delta
+[/N8/Times-Bold 1 TZ
+% End encoding-delta
+userdict begin
+%%BeginResource: font TimesNewRoman
+%%EndResource
+end
+% Begin encoding-delta
+[/N6/Times-Roman 1 TZ
+% End encoding-delta
+userdict begin
+%%BeginResource: font TimesNewRoman,Italic
+%%EndResource
+end
+% Begin encoding-delta
+[/N10/Times-Italic 1 TZ
+% End encoding-delta
+userdict begin
+%%BeginResource: font CourierNew
+%%EndResource
+end
+% Begin encoding-delta
+[/N17/Courier 1 TZ
+% End encoding-delta
+PDFVars/TermAll get exec end end
+
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(1)Tj
+ET
+1 1 1 rg
+180 657.12 252 62.88 re
+f 
+BT
+180 712.08 TD
+0 0 0 rg
+/N6 12 Tf
+0.0933 Tc
+-0.1293 Tw
+(Stanford University)Tj
+0 -14.16 TD
+0.0768 Tc
+-0.1128 Tw
+(Computer Science Department)Tj
+0 -27.84 TD
+0.0447 Tc
+0.0393 Tw
+(CS140: Operating Systems)Tj
+ET
+1 1 1 rg
+432 684 108 36 re
+f 
+BT
+448.08 712.08 TD
+0 0 0 rg
+0.03 Tc
+0.174 Tw
+(A. Arpaci-Dusseau)Tj
+25.68 -14.16 TD
+0.024 Tc
+0.18 Tw
+(Autumn 1998)Tj
+-401.76 -77.28 TD
+/N8 13.92 Tf
+0.076 Tc
+0 Tw
+(Purpose)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.0743 Tc
+1.0447 Tw
+(In this handout, we give a brief overview of the behavior of the Solaris\
+ 2.6 Time-Sharing \(TS\))Tj
+0 -13.92 TD
+0.096 Tc
+0.3 Tw
+(scheduler, an example of a )Tj
+132.96 0 TD
+/N10 12 Tf
+0.0104 Tc
+0.1496 Tw
+(Multilevel Feedback Queue )Tj
+136.8 0 TD
+/N6 12 Tf
+0.1083 Tc
+0.3357 Tw
+(scheduler.  The information in this hand-)Tj
+-269.76 -13.92 TD
+0.1074 Tc
+1.0849 Tw
+(out, in conjunction with that given in Lecture, should be used to answer\
+ Problem 4 of the first)Tj
+0 -14.16 TD
+0.0991 Tc
+-0.2251 Tw
+(assignment.  The end of this document specifies in more detail which asp\
+ects of the Solaris sched-)Tj
+0 -13.92 TD
+0.1191 Tc
+0.0369 Tw
+(uler that you should implement. )Tj
+0 -29.28 TD
+/N8 13.92 Tf
+0.0723 Tc
+-0.1437 Tw
+(Multilevel Feedback Queue Schedulers)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.1389 Tc
+0.7251 Tw
+(The goal of a multilevel feedback queue scheduler is to fairly and effic\
+iently schedule a mix of)Tj
+0 -13.92 TD
+0.0972 Tc
+2.6544 Tw
+(processes with a variety of execution characteristics.  By controlling h\
+ow a process moves)Tj
+0 -14.16 TD
+0.063 Tc
+0.7301 Tw
+(between priority levels, processes with different characteristics can be\
+ scheduled as appropriate.)Tj
+0 -13.92 TD
+0.0613 Tc
+2.0627 Tw
+(Priority-based schedulers attempt to provide a compromise between severa\
+l desirable metrics)Tj
+T*
+0.0834 Tc
+0.6929 Tw
+(\(e.g., response time for interactive jobs,  throughput for compute-inte\
+nsive jobs, and fair alloca-)Tj
+0 -14.16 TD
+0.0875 Tc
+0.0205 Tw
+(tions for all jobs\).  )Tj
+0 -24 TD
+0.0825 Tc
+1.1158 Tw
+(The queues in the system are ranked according to priority. Processes wai\
+ting in higher priority)Tj
+0 -13.92 TD
+0.0821 Tc
+0.4899 Tw
+(queues are always scheduled over those in lower priority queues.  Proces\
+ses at the same priority)Tj
+T*
+0.1077 Tc
+-0.0237 Tw
+(are usually scheduled in a round-robin fashion.)Tj
+0 -24 TD
+0.072 Tc
+-0.204 Tw
+(Such schedulers tend to be )Tj
+129.6 0 TD
+/N10 12 Tf
+0.0218 Tc
+-0.2618 Tw
+( preemptible )Tj
+62.64 0 TD
+/N6 12 Tf
+0.0642 Tc
+-0.2922 Tw
+(in order to support interactive processes.  That is, a higher)Tj
+-192.24 -14.16 TD
+0.0929 Tc
+-0.0009 Tw
+(priority process is immediately scheduled if a lower priority process is\
+ running on the CPU. )Tj
+0 -29.28 TD
+/N8 13.92 Tf
+0.1088 Tc
+-0.1001 Tw
+(Scheduling in Solaris)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.0748 Tc
+2.3577 Tw
+(The Solaris operating system is based on Unix System V Release 4 \(SVR4\)\
+. Scheduling in)Tj
+0 -13.92 TD
+0.0614 Tc
+0.8226 Tw
+(Solaris, as in all SVR4-based schedulers, is performed at two levels: cl\
+ass-independent routines)Tj
+T*
+0.068 Tc
+0.836 Tw
+(and class-dependent routines.  Class-independent routines are those that\
+ are responsible for dis-)Tj
+0 -14.16 TD
+0.0641 Tc
+1.6279 Tw
+(patching and preempting processes \(the low-level mechanisms\).  Class-d\
+ependent routines are)Tj
+0 -13.92 TD
+0.0854 Tc
+0.0198 Tw
+(those that are responsible for setting the priority of each of its proce\
+sses \(the high-level policy\).  )Tj
+0 -24 TD
+0.0772 Tc
+0.2668 Tw
+(By default, Solaris supports three scheduling classes: time-sharing \(TS\
+\), real-time \(RT\), and sys-)Tj
+0 -13.92 TD
+0.0817 Tc
+0.3623 Tw
+(tem \(SYS\).  Users with root privileges can easily implement and add ne\
+w scheduling classes  by)Tj
+0 -14.16 TD
+0.0944 Tc
+0.7656 Tw
+(adhering to a predefined interface.  Each scheduling class gives each of\
+ its processes a priority,)Tj
+0 -13.92 TD
+0.1174 Tc
+-0.0334 Tw
+(the range of which is shown below.)Tj
+0 562.08 TD
+0.072 Tc
+-0.108 Tw
+(Handout #9)Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 2 2
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(2)Tj
+-231.6 553.92 TD
+/N6 12 Tf
+0.0772 Tc
+1.0334 Tw
+(As long as a user has the correct privileges, he or she can submit jobs \
+to any scheduling class.)Tj
+0 -13.92 TD
+0.0647 Tc
+0.2993 Tw
+(\(See the man pages for  )Tj
+117.6 0 TD
+/N8 12 Tf
+0.03 Tc
+0 Tw
+(priocntl)Tj
+40.56 0 TD
+/N6 12 Tf
+0.1242 Tc
+0.2325 Tw
+( on any machine running Solaris for information on how to sub-)Tj
+-158.16 -13.92 TD
+0.1112 Tc
+0.7168 Tw
+(mit jobs to different scheduling classes; however, since you probably do\
+n)Tj
+-2.892 Tc
+0 Tw
+(\222)Tj
+0.0493 Tc
+0.8747 Tw
+(t have root privileges)Tj
+0 -14.16 TD
+0.18 Tc
+1.464 Tw
+(on your machine, you won)Tj
+-2.652 Tc
+0 Tw
+(\222)Tj
+0.1005 Tc
+1.5435 Tw
+(t be able to do much.\)  By default, jobs are executed in the same)Tj
+0 -13.92 TD
+0.0876 Tc
+-0.0036 Tw
+(scheduling class as the parent process that forked the job.  Since your \
+shell is running in the time-)Tj
+T*
+0.1086 Tc
+-0.0246 Tw
+(sharing class, all of your jobs run by default in the time-sharing class\
+.)Tj
+0 -24 TD
+0.0816 Tc
+1.2824 Tw
+(To see the scheduling class of each process in the system, run )Tj
+-1.692 Tc
+0 Tw
+(\223)Tj
+318.72 0 TD
+/N8 12 Tf
+-0.0267 Tc
+1.2507 Tw
+(ps -edaflc)Tj
+50.16 0 TD
+/N6 12 Tf
+-1.452 Tc
+2.856 Tw
+(\224 )Tj
+-0.012 Tc
+0 Tw
+(\()Tj
+13.68 0 TD
+/N8 12 Tf
+-0.09 Tc
+0.114 Tw
+(-c )Tj
+13.44 0 TD
+/N6 12 Tf
+0.1292 Tc
+1.2748 Tw
+(is the flag that)Tj
+-396 -14.16 TD
+0.1028 Tc
+0.6452 Tw
+(shows the scheduling class\).  The fourth column shows the scheduling cl\
+ass of the running pro-)Tj
+0 -13.92 TD
+0.091 Tc
+0.461 Tw
+(cess.  Most jobs will be running in the TS class, with a few \(owned by \
+root\) running in the SYS)Tj
+T*
+0.062 Tc
+0 Tw
+(class.)Tj
+0 -14.16 TD
+/N17 12 Tf
+-0.0133 Tc
+0.0133 Tw
+(elaine1:~> ps -edafc)Tj
+0 -13.92 TD
+-0.0077 Tc
+0.0077 Tw
+(     UID   PID  PPID  CLS PRI    STIME TTY   TIME CMD)Tj
+T*
+0 Tc
+-0.0083 Tw
+(    root     0     0  SYS  96   Aug 01 ?     0:00 sched)Tj
+0 -14.16 TD
+-0.0077 Tw
+(    root     1     0   TS  58   Aug 01 ?     1:06 /etc/init -)Tj
+0 -13.92 TD
+-0.0083 Tw
+(    root     2     0  SYS  98   Aug 01 ?     0:02 pageout)Tj
+T*
+-0.0086 Tw
+(    root     3     0  SYS  60   Aug 01 ?    15:22 fsflush)Tj
+0 -14.16 TD
+-0.008 Tc
+0.008 Tw
+(    root   245   239   TS  59   Aug 01 ?     0:00 ttymon)Tj
+0 -13.92 TD
+0 Tc
+-0.0083 Tw
+(    root   181     1   TS  48   Aug 01 ?     0:00 sendmail -q15m)Tj
+T*
+-0.008 Tw
+(    root   239     1   TS  59   Aug 01 ?     0:00 sac -t 300)Tj
+0 -14.16 TD
+-0.0083 Tw
+(    root    96     1   TS  58   Aug 01 ?     0:00 rpcbind)Tj
+0 -13.92 TD
+-0.0092 Tw
+(    root   125    1   TS  59   Aug 01 ?    0:32 syslogd)Tj
+0 -37.92 TD
+/N6 12 Tf
+0.0821 Tc
+0.1519 Tw
+(In this document, we only discuss the Solaris time-sharing \(TS\) class.\
+  Note the priorities of each)Tj
+0 -14.16 TD
+0.1155 Tc
+-0.0315 Tw
+(of the processes, as listed in the fifth column.)Tj
+0 -29.28 TD
+/N8 13.92 Tf
+0.1063 Tc
+-0.2177 Tw
+(Class Independent Functionality)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.0693 Tc
+0.4855 Tw
+(The class independent routines arbitrate across the scheduling classes. \
+ This involves three basic)Tj
+0 -13.92 TD
+0.0438 Tc
+0 Tw
+(responsibilities.)Tj
+0 -24 TD
+-2.652 Tc
+(\225)Tj
+18 0 TD
+0.0745 Tc
+0.4015 Tw
+(The process with the highest priority must be dispatched, and the state \
+of the preempted pro-)Tj
+0 -13.92 TD
+0.0444 Tc
+0.0796 Tw
+(cess saved.  )Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+0.1096 Tc
+-0.1256 Tw
+(The class independent functions must notifying the class-dependent routi\
+nes when the state of)Tj
+0 -14.16 TD
+0.0722 Tc
+0.1318 Tw
+(its processes changes \(for example, at creation and termination, when a\
+ process changes from)Tj
+0 -13.92 TD
+0.057 Tc
+0.067 Tw
+(blocked to runnable, or runnable to blocked, and when a 10ms timer expir\
+es\).   )Tj
+111.6 613.92 TD
+0.084 Tc
+0.12 Tw
+(Scheduling Class)Tj
+136.32 0 TD
+0.0348 Tc
+0 Tw
+(Priorities)Tj
+-143.04 -24 TD
+0.084 Tc
+(Real-Time)Tj
+108 0 TD
+-0.1251 Tc
+(100-159)Tj
+-108 -21.84 TD
+0.134 Tc
+(System)Tj
+108 0 TD
+-0.1176 Tc
+(60-99)Tj
+-108 -22.08 TD
+0.077 Tc
+(Time-Sharing)Tj
+108 0 TD
+-0.111 Tc
+(0-59)Tj
+-152.64 -22.08 TD
+/N8 12 Tf
+0.012 Tc
+-0.108 Tw
+(Table 1: )Tj
+45.36 0 TD
+0.0258 Tc
+-0.139 Tw
+(Range of Priorities for Scheduling Classes in Solaris)Tj
+ET
+188.64 628.32 0.48 91.44 re
+f 
+296.64 627.84 0.48 92.4 re
+f 
+422.88 628.32 0.48 91.44 re
+f 
+188.64 720.24 m
+188.64 719.76 l
+423.36 719.76 l
+423.36 720.24 l
+h
+f 
+189.36 695.52 m
+189.36 695.04 l
+422.64 695.04 l
+422.64 695.52 l
+h
+f 
+189.36 693.12 m
+189.36 692.64 l
+422.64 692.64 l
+422.64 693.12 l
+h
+f 
+188.64 672.24 m
+188.64 671.76 l
+423.36 671.76 l
+423.36 672.24 l
+h
+f 
+188.64 650.16 m
+188.64 649.68 l
+423.36 649.68 l
+423.36 650.16 l
+h
+f 
+188.64 628.32 m
+188.64 627.84 l
+423.36 627.84 l
+423.36 628.32 l
+h
+f 
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 3 3
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(3)Tj
+-231.6 676.08 TD
+/N6 12 Tf
+-2.652 Tc
+(\225)Tj
+18 0 TD
+0.0755 Tc
+0.147 Tw
+(Processes must be moved between priority queues in the class independent\
+ data structures, as)Tj
+0 -14.16 TD
+0.0968 Tc
+-0.0048 Tw
+(directed by its scheduling class, and must be moved between blocked and \
+ready queues.  )Tj
+-18 -29.28 TD
+/N8 13.92 Tf
+0.0866 Tc
+-0.078 Tw
+(Time-Sharing Scheduling Class)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.0848 Tc
+1.8361 Tw
+(The Time-Sharing scheduler in Solaris is an example of a multi-level fee\
+dback queue sched-)Tj
+0 -13.92 TD
+0.0841 Tc
+0.4104 Tw
+(uler.   A job begins at priority 29.   Compute-bound jobs then filter do\
+wn to the lower priorities,)Tj
+T*
+0.0777 Tc
+0.5377 Tw
+(where they are scheduled less frequently \(but for longer time-slices\) \
+and  interactive jobs propa-)Tj
+0 -14.16 TD
+0.0919 Tc
+0.7521 Tw
+(gate to the higher priorities \(where they are scheduled whenever they h\
+ave work to perform, on)Tj
+0 -13.92 TD
+0.0831 Tc
+-0.0441 Tw
+(the assumption that they will soon relinquish the processor again\).  In\
+ the TS scheduler, the prior-)Tj
+T*
+0.1006 Tc
+0.2297 Tw
+(ity of a process is lowered after it consumes its allocated time-slice. \
+ Its priority is raised if it has)Tj
+0 -14.16 TD
+0.091 Tc
+0.033 Tw
+(not consumed its time-slice before a )Tj
+176.64 0 TD
+/N10 12 Tf
+0.0133 Tc
+-0.0133 Tw
+(starvation interval  )Tj
+94.8 0 TD
+/N6 12 Tf
+0.0315 Tc
+0 Tw
+(expires.)Tj
+-271.44 -25.92 TD
+/N8 12 Tf
+0.0175 Tc
+-0.2335 Tw
+(Dispatch Table)Tj
+0 -24 TD
+/N6 12 Tf
+0.084 Tc
+0.0343 Tw
+(The durations of the time-slices, the changes in priorities, and the sta\
+rvation interval are specified)Tj
+0 -13.92 TD
+0.0961 Tc
+0.1593 Tw
+(in a user-tunable dispatch table.  The system administrator \(or anyone \
+with root privileges again\))Tj
+0 -14.16 TD
+0.089 Tc
+0.4579 Tw
+(can change the values in this table, thus configuring how the time-shari\
+ng scheduler manages its)Tj
+0 -13.92 TD
+0.12 Tc
+-0.3693 Tw
+(jobs.  While this has the noble intention of allowing different systems \
+ to tune the scheduler to bet-)Tj
+T*
+0.1129 Tc
+1.5151 Tw
+(ter handle their workloads, in reality no one really knows how to config\
+ure these tables well.)Tj
+0 -14.16 TD
+0.0878 Tc
+0.1162 Tw
+(Therefore, we will focus on the default dispatch table. )Tj
+0 -24 TD
+0.116 Tc
+-0.032 Tw
+(To see how this table is configured in your system, run)Tj
+185.52 -24 TD
+/N8 12 Tf
+0.044 Tc
+-0.18 Tw
+(dispadmin -c TS -g)Tj
+-185.52 -24 TD
+/N6 12 Tf
+0.1011 Tc
+1.2888 Tw
+(You should see something like that in Table 2.  \(Looking at the man pag\
+es on dispadmin and)Tj
+0 -13.92 TD
+0.0963 Tc
+0.9689 Tw
+(ts_dptbl may also be helpful\).  You will see one row for every priority\
+ in the scheduling class:)Tj
+T*
+0.0871 Tc
+0.0369 Tw
+(from 0 to 59.  For each priority, there are five columns: )Tj
+0 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.0905 Tc
+(ts_quantum:)Tj
+65.28 0 TD
+/N6 12 Tf
+0.1021 Tc
+1.6619 Tw
+( Length of the time-slice \(in the actual table, this value is specified\
+ in 10ms)Tj
+-65.28 -14.16 TD
+0.111 Tc
+-0.051 Tw
+(clock ticks; in the output from running dispadmin, the value is specifie\
+d in units of 1ms\).)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.0413 Tc
+(ts_tqexp:)Tj
+47.28 0 TD
+/N6 12 Tf
+0.1113 Tc
+0.4969 Tw
+(  Priority level of the new queue on which to place a process  if it exc\
+eeds its time)Tj
+-47.28 -13.92 TD
+0.1106 Tc
+-0.0196 Tw
+(quantum.  Normally this field  links  to  a lower  priority time-sharing\
+ level.  )Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.006 Tc
+(ts_slpret:)Tj
+48 0 TD
+/N6 12 Tf
+0.0994 Tc
+1.3732 Tw
+( the priority to change to \(generally a higher priority\) when the job \
+returns from)Tj
+-48 -13.92 TD
+0.0863 Tc
+-0.0115 Tw
+(sleeping \(i.e., from the blocked queue\)  if ts_dispwait exceeds ts_max\
+wait \(see next entry\).)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.048 Tc
+(ts_maxwait)Tj
+58.56 0 TD
+/N6 12 Tf
+0.0504 Tc
+-0.0864 Tw
+(:   A per process counter,)Tj
+119.52 0 TD
+/N8 12 Tf
+0.018 Tc
+-0.154 Tw
+( ts_dispwait,  )Tj
+69.6 0 TD
+/N6 12 Tf
+0.072 Tc
+-0.108 Tw
+(is initialized  to  zero  each  time a process)Tj
+-247.68 -14.16 TD
+0.0602 Tc
+1.081 Tw
+(is placed back on the  dispatcher  queue  after  its  time quantum has e\
+xpired or when it is)Tj
+0 -13.92 TD
+0.0602 Tc
+0.0347 Tw
+(awakened  \(ts_dispwait is not reset  to zero when a process  is preempt\
+ed  by  a  higher  prior-)Tj
+T*
+0.0862 Tc
+-0.1889 Tw
+(ity  process\).   This counter is incremented once per second.   If  a  \
+process)Tj
+-2.652 Tc
+0 Tw
+(\222)Tj
+0.0572 Tc
+-0.0932 Tw
+(s ts_dispwait value)Tj
+0 -14.16 TD
+0.0843 Tc
+0.1197 Tw
+(exceeds the ts_maxwait  value  for its level, the process)Tj
+-2.652 Tc
+0 Tw
+(\222)Tj
+0.1033 Tc
+0.1007 Tw
+(s priority is changed to that indicated)Tj
+0 -13.92 TD
+0.092 Tc
+-0.0189 Tw
+(by ts_lwait.  The purpose of this field is to prevent starvation.)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.036 Tc
+(ts_lwait:)Tj
+43.92 0 TD
+/N6 12 Tf
+0.0936 Tc
+0.5047 Tw
+( the priority to change to \(generally a higher priority\) if the starva\
+tion timer expires)Tj
+-43.92 -13.92 TD
+0.0825 Tc
+-0.0225 Tw
+(before the job consumes its time-slice \(i.e., if ts_dispwait exceeds ts\
+_maxwait\).)Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 4 4
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(4)Tj
+ET
+1 1 1 rg
+103.44 80.88 405.12 630.24 re
+f 
+BT
+103.44 704.4 TD
+0 0 0 rg
+0.1271 Tc
+-0.0582 Tw
+(# ts_quantum  ts_tqexp  ts_slpret  ts_maxwait ts_lwait  #PRIORITY LEVEL \
+    )Tj
+0 -10.08 TD
+-0.0635 Tc
+0.1735 Tw
+(200         0        50           0        50        #     0        )Tj
+T*
+0.1753 Tw
+(200         0        50           0        50        #     1       )Tj
+0 -9.84 TD
+0.1735 Tw
+(200         0        50           0        50        #     2        )Tj
+0 -10.08 TD
+(200         0        50           0        50        #     3        )Tj
+T*
+(200         0        50           0        50        #     4        )Tj
+0 -9.84 TD
+(200         0        50           0        50        #     5        )Tj
+0 -10.08 TD
+(200         0        50           0        50        #     6        )Tj
+T*
+(200         0        50           0        50        #     7        )Tj
+0 -9.84 TD
+(200         0        50           0        50        #     8        )Tj
+0 -10.08 TD
+(200         0        50           0        50        #     9        )Tj
+T*
+-0.0581 Tc
+0.1698 Tw
+(160         0        51           0        51        #    10        )Tj
+0 -9.84 TD
+(160         1        51           0        51        #    11        )Tj
+0 -10.08 TD
+(160         2        51           0        51        #    12        )Tj
+T*
+(160         3        51           0        51        #    13        )Tj
+0 -9.84 TD
+(160         4        51           0        51        #    14        )Tj
+0 -10.08 TD
+(160         5        51           0        51        #    15        )Tj
+T*
+(160         6        51           0        51        #    16        )Tj
+0 -9.84 TD
+(160         7        51           0        51        #    17        )Tj
+0 -10.08 TD
+(160         8        51           0        51        #    18        )Tj
+T*
+(160         9        51           0        51        #    19        )Tj
+0 -9.84 TD
+-0.0535 Tc
+0.1627 Tw
+(120        10        52           0        52        #    20        )Tj
+0 -10.08 TD
+(120        11        52           0        52        #    21        )Tj
+T*
+(120        12        52           0        52        #    22        )Tj
+0 -9.84 TD
+(120        13        52           0        52        #    23        )Tj
+0 -10.08 TD
+(120        14        52           0        52        #    24        )Tj
+T*
+(120        15        52           0        52        #    25        )Tj
+0 -9.84 TD
+(120        16        52           0        52        #    26        )Tj
+0 -10.08 TD
+(120        17        52           0        52        #    27        )Tj
+T*
+(120        18        52           0        52        #    28        )Tj
+0 -9.84 TD
+0.1609 Tw
+(120        19        52           0        52        #    29         )Tj
+0 -10.08 TD
+-0.0181 Tc
+0.1212 Tw
+(80        20        53           0        53        #    30         )Tj
+T*
+(80        21        53           0        53        #    31         )Tj
+0 -9.84 TD
+(80        22        53           0        53        #    32         )Tj
+0 -10.08 TD
+(80        23        53           0        53        #    33         )Tj
+T*
+0.1186 Tw
+(80        24        53           0        53        #    34        )Tj
+0 -9.84 TD
+0.1212 Tw
+(80        25        54           0        54        #    35         )Tj
+0 -10.08 TD
+(80        26        54           0        54        #    36         )Tj
+T*
+(80        27        54           0        54        #    37         )Tj
+0 -9.84 TD
+0.1186 Tw
+(80        28        54           0        54        #    38        )Tj
+0 -10.08 TD
+0.1212 Tw
+(80        29        54           0        54        #    39         )Tj
+T*
+(40        30        55           0        55        #    40         )Tj
+0 -9.84 TD
+0.1186 Tw
+(40        31        55           0        55        #    41        )Tj
+0 -10.08 TD
+0.1212 Tw
+(40        32        55           0        55        #    42         )Tj
+T*
+0.1186 Tw
+(40        33        55           0        55        #    43        )Tj
+0 -9.84 TD
+0.1212 Tw
+(40        34        55           0        55        #    44         )Tj
+0 -10.08 TD
+(40        35        56           0        56        #    45         )Tj
+T*
+(40        36        57           0        57        #    46         )Tj
+0 -9.84 TD
+(40        37        58           0        58        #    47         )Tj
+0 -10.08 TD
+(40        38        58           0        58        #    48         )Tj
+T*
+0.1186 Tw
+(40        39        58           0        59        #    49        )Tj
+0 -9.84 TD
+(40        40        58           0        59        #    50        )Tj
+0 -10.08 TD
+0.1212 Tw
+(40        41        58           0        59        #    51         )Tj
+T*
+(40        42        58           0        59        #    52         )Tj
+0 -9.84 TD
+(40        43        58           0        59        #    53         )Tj
+0 -10.08 TD
+(40        44        58           0        59        #    54         )Tj
+T*
+(40        45        58           0        59        #    55         )Tj
+0 -9.84 TD
+(40        46        58           0        59        #    56         )Tj
+0 -10.08 TD
+(40        47        58           0        59        #    57         )Tj
+T*
+0.1186 Tw
+(40        48        58           0        59        #    58        )Tj
+0 -9.84 TD
+-0.0281 Tc
+0.133 Tw
+(20        49        59       32000     59        #    59)Tj
+0 -18 TD
+0.1233 Tc
+-0.0801 Tw
+(Table 2: Default Solaris Time-Sharing Dispatch Table )Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 5 5
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(5)Tj
+-231.6 676.08 TD
+/N6 12 Tf
+0.0731 Tc
+0.3138 Tw
+(In this table,  the priority of jobs ranges from a high of 59 down to 0.\
+  Time-slices begin at 20ms)Tj
+0 -14.16 TD
+0.0887 Tc
+1.5553 Tw
+(at the highest priority and gradually increase in duration up to 200ms a\
+t the lowest priorities.)Tj
+0 -13.92 TD
+0.0769 Tc
+0.0521 Tw
+(Generally, the priority of a process decreases by 10 levels after it con\
+sumes its time-slice; the pri-)Tj
+T*
+0.0616 Tc
+0.091 Tw
+(ority of a process is increased to 50 or above when the starvation timer\
+ expires.)Tj
+0 -26.16 TD
+/N8 12 Tf
+0.0591 Tc
+0 Tw
+(Implementation)Tj
+0 -24 TD
+/N6 12 Tf
+0.0869 Tc
+0.3571 Tw
+(For each job in the TS class, the following data structure is maintained\
+ \(we)Tj
+-2.652 Tc
+0 Tw
+(\222)Tj
+0.1296 Tc
+0.2544 Tw
+(ve removed a few of)Tj
+0 -13.92 TD
+0.1285 Tc
+-0.0045 Tw
+(the fields for simplicity\):)Tj
+0 -12.72 TD
+/N17 9.84 Tf
+0.096 Tc
+0 Tw
+(/*)Tj
+0 -12 TD
+0.0901 Tc
+0.0059 Tw
+( * time-sharing class specific thread structure)Tj
+T*
+0.096 Tc
+0 Tw
+( */)Tj
+T*
+0.084 Tc
+0.012 Tw
+(typedef struct tsproc {)Tj
+T*
+0.096 Tc
+0 Tw
+(     long)Tj
+54 0 TD
+0.076 Tc
+0.02 Tw
+(          ts_timeleft;)Tj
+132 0 TD
+0.096 Tc
+0 Tw
+(  /* time remaining in quantum */)Tj
+-186 -12 TD
+0.09 Tc
+0.006 Tw
+(     long          ts_dispwait;  /* number of seconds since */)Tj
+0 -12 TD
+0.096 Tc
+-0.0062 Tw
+(                                 /* start of quantum \(not reset */)Tj
+T*
+-0.0067 Tw
+(                                 /* upon preemption\) */)Tj
+T*
+0.088 Tc
+0.008 Tw
+(     pri_t         ts_pri;       /* priority \(0-59\) */)Tj
+T*
+0.0891 Tc
+0.0069 Tw
+(     kthread_t     *ts_tp;       /* pointer to thread */)Tj
+T*
+0.0909 Tc
+0.0051 Tw
+(     struct tsproc *ts_next;     /* link to next tsproc on list */)Tj
+T*
+0.0907 Tc
+0.0053 Tw
+(     struct tsproc *ts_prev;     /* link to previous tsproc */)Tj
+T*
+0.096 Tc
+0 Tw
+(} tsproc_t;)Tj
+0 -23.28 TD
+/N6 12 Tf
+0.0908 Tc
+0.7224 Tw
+(The kthread_t structure tracks the necessary information to context-swit\
+ch to and from this pro-)Tj
+0 -13.92 TD
+0.0673 Tc
+0.6617 Tw
+(cess.  This structure is kept separate from the time-sharing class in or\
+der to separate the mecha-)Tj
+0 -14.16 TD
+0.0989 Tc
+0.0178 Tw
+(nisms of the dispatcher from the policies of the scheduler.  )Tj
+0 -24 TD
+0.0592 Tc
+0.0548 Tw
+(There are seven interesting routines in the TS class:)Tj
+T*
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.018 Tc
+-0.234 Tw
+(ts_enterclass\(thread *T\):)Tj
+128.16 0 TD
+/N6 12 Tf
+0.0846 Tc
+0.0321 Tw
+( called when a new thread is added to the TS class.)Tj
+-128.16 -13.92 TD
+0.0675 Tc
+0.0405 Tw
+(It initializes a tsproc structure for this process and adds it to the li\
+st of processes)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.0256 Tc
+-0.2416 Tw
+(ts_exitclass\(thread *T\):)Tj
+120.24 0 TD
+/N6 12 Tf
+0.0819 Tc
+0.0155 Tw
+( called when the thread terminates or exits the class.)Tj
+-120.24 -13.92 TD
+0.0722 Tc
+0.0518 Tw
+(The tsproc structure is removed from the list of processes.)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.048 Tc
+-0.264 Tw
+(ts_tick\(thread *T\):)Tj
+96.96 0 TD
+/N6 12 Tf
+0.1131 Tc
+-0.0891 Tw
+( called once every 10ms with a pointer to the currently running thread.)Tj
+-96.96 -14.16 TD
+0.1146 Tc
+0.7934 Tw
+(The ts_timeleft variable of the running thread is decremented by one.  I\
+f ts_timeleft goes to)Tj
+0 -13.92 TD
+0.094 Tc
+-0.2712 Tw
+(zero, then its new priority is calculated according to the value of ts_t\
+qexp in the table, its time-)Tj
+T*
+0.0714 Tc
+-0.1356 Tw
+(slice is reset, and ts_dispwait is cleared; the thread is then added to \
+the back of the appropriate)Tj
+0 -14.16 TD
+0.1083 Tc
+-0.1101 Tw
+(priority queue and a new job is scheduled.)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.045 Tc
+(ts_update\(\):)Tj
+61.92 0 TD
+/N6 12 Tf
+0.1059 Tc
+-0.0619 Tw
+( called once a second to check the starvation qualities of each job.)Tj
+-61.92 -13.92 TD
+0.082 Tc
+0.5848 Tw
+(The routine increments the ts_dispwait counter of every process in the c\
+lass \(even those that)Tj
+0 -13.92 TD
+0.0962 Tc
+1.3318 Tw
+(are blocked\)  by one.  If the job is on the ready queue \(i.e., the job\
+ is neither running nor)Tj
+0 -14.16 TD
+0.0806 Tc
+0.0034 Tw
+(blocked\), then if  its ts_dispwait exceeds ts_maxwait, the priority and\
+ the ts_dispwait value of)Tj
+0 -13.92 TD
+0.0752 Tc
+0.0488 Tw
+(this process are reset \(but not ts_timeleft\).  Note that this may invo\
+lve rearranging the priority)Tj
+T*
+0.0394 Tc
+0.1646 Tw
+(queues. )Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.024 Tc
+-0.24 Tw
+(ts_sleep\(thread *T\):)Tj
+102.96 0 TD
+/N6 12 Tf
+0.0904 Tc
+0.0136 Tw
+( called when the thread blocks \(e.g., due to I/O or synchronization\). \
+)Tj
+-102.96 -14.16 TD
+0.0935 Tc
+0.0785 Tw
+(The TS routine does not need to do anything in these circumstance.  Howe\
+ver, the dispatcher,)Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 6 6
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(6)Tj
+-213.6 676.08 TD
+/N6 12 Tf
+0.081 Tc
+0.7401 Tw
+(or class-independent routines, must add the thread to the blocked queue \
+and schedule a new)Tj
+0 -14.16 TD
+0.096 Tc
+0 Tw
+(thread.)Tj
+-18 -24 TD
+-2.652 Tc
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.0618 Tc
+-0.1578 Tw
+(ts_wakeup\(thread *T\): )Tj
+120.48 0 TD
+/N6 12 Tf
+0.1034 Tc
+-0.0194 Tw
+(called when the blocked thread becomes ready.  )Tj
+-120.48 -13.92 TD
+0.0809 Tc
+0.0751 Tw
+(If the ts_dispwait value associated with this process is greater than th\
+e value of ts_maxwait in)Tj
+0 -13.92 TD
+0.0816 Tc
+0.1224 Tw
+(the dispatch table, then the priority of the process is set to that spec\
+ified by ts_slpret, its time-)Tj
+0 -14.16 TD
+0.0892 Tc
+-0.1385 Tw
+(slice \(ts_timeleft\) is reset, and ts_dispwait is cleared.  If the prio\
+rity of this job is less than that)Tj
+0 -13.92 TD
+0.1074 Tc
+-0.1567 Tw
+(of the running job, then the newly awoken job is added to the back of it\
+s priority queue; other-)Tj
+T*
+0.0831 Tc
+0.0409 Tw
+(wise, it preempts the currently running job.)Tj
+-18 -24 TD
+-2.652 Tc
+0 Tw
+(\225)Tj
+18 0 TD
+/N8 12 Tf
+0.0206 Tc
+0.0034 Tw
+(ts_preempt\(thread *T\): )Tj
+123.84 0 TD
+/N6 12 Tf
+0.086 Tc
+0.022 Tw
+(called when the thread is preempted by a higher priority thread.)Tj
+-123.84 -14.16 TD
+0.1009 Tc
+-0.0278 Tw
+(The preempted thread is added to the front of its priority queue.)Tj
+-18 -25.92 TD
+/N8 12 Tf
+-0.0255 Tc
+0 Tw
+(Fairness)Tj
+0 -24 TD
+/N6 12 Tf
+0.086 Tc
+0.938 Tw
+(The Solaris time-sharing scheduler approximates fair allocations by decr\
+easing the priority of a)Tj
+0 -13.92 TD
+0.0971 Tc
+0.0469 Tw
+(job the more that it is scheduled.  Therefore, a job that is runnable re\
+latively infrequently remains)Tj
+0 -14.16 TD
+0.0963 Tc
+0.3477 Tw
+(at a higher priority and is scheduled over lower priority jobs.  However\
+, due to the configuration)Tj
+0 -13.92 TD
+0.0914 Tc
+-0.1674 Tw
+(of the default dispatch table \(i.e., the starvation interval is set to \
+zero\), you will note that the prior-)Tj
+T*
+0.1038 Tc
+0.8061 Tw
+(ity of every process is raised once a second, regardless of whether or n\
+ot it is actually starving.)Tj
+0 -14.16 TD
+0.0824 Tc
+0.1401 Tw
+(Thus, the allocation history of each process is erased every second and \
+compute-bound processes)Tj
+0 -13.92 TD
+0.0881 Tc
+-0.0241 Tw
+(tend to acquire more than their fair share of the resources.  )Tj
+0 -24 TD
+0.0766 Tc
+0.8794 Tw
+(This behavior is illustrated in Figure 1 for three competing jobs that r\
+elinquish the processor at)Tj
+0 -13.92 TD
+0.123 Tc
+0.1343 Tw
+(different rates while waiting for I/O to complete: a )Tj
+247.68 0 TD
+/N10 12 Tf
+0.04 Tc
+0 Tw
+(coarse)Tj
+31.92 0 TD
+/N6 12 Tf
+0.0662 Tc
+0.3092 Tw
+( job that rarely relinquishes the CPU, a)Tj
+-279.6 -14.16 TD
+/N10 12 Tf
+0 Tc
+0 Tw
+(medium)Tj
+37.92 0 TD
+/N6 12 Tf
+0.1129 Tc
+-0.0589 Tw
+( job that does so more frequently, and a)Tj
+189.36 0 TD
+/N10 12 Tf
+-0.06 Tc
+-0.18 Tw
+( fine)Tj
+21.12 0 TD
+/N6 12 Tf
+0.0796 Tc
+0.0444 Tw
+( job that often relinquishes the CPU.  The fig-)Tj
+-248.4 -13.92 TD
+0.091 Tc
+-0.157 Tw
+(ure shows a typical snapshot over a five second execution interval.  As \
+described, each second the)Tj
+0 -13.92 TD
+0.0788 Tc
+0.2452 Tw
+(priority of all three jobs is raised to level 50 or higher.  As a job ex\
+ecutes and consumes its time-)Tj
+0 -14.16 TD
+0.0872 Tc
+-0.1232 Tw
+(slice, its priority is lowered about ten levels  Since the coarse job ru\
+ns more frequently, it drops in)Tj
+0 -13.92 TD
+0.0922 Tc
+-0.0215 Tw
+(priority at a faster rate than the other two jobs.)Tj
+ET
+1 1 1 rg
+160.08 103.92 288 207.12 re
+f 
+q
+288 0 0 207.12 160.08 103.92 cm
+BI
+       /Width 341
+       /Height 252
+       /BitsPerComponent 1
+       /ColorSpace /DeviceGray 
+       /Decode [1 0 ]
+       /DecodeParms [null <</K -1 
+/Columns 341 >> ]
+       /Filter [/ASCII85Decode /CCITTFaxDecode ]
+ID
+-D5]FA8n>d7gp!_JX[(R5">e_j!0;@j@9Z7"XAU2d2e_p*"\,c3#Ka/8'jaH&a,4-
+#\85\,N&M_PW@[i'VW`2TgqY6%"m9(Eif#,+NhRZU!,MtGK`'RHRO<b[!s=YUU#(J
+HNcCf"dN_L%^ZKa<<t)XOou=D$_Tb@q&^j>Jclh`+B1kB";)XU5`d7B!_EFsYEA<>
+W";hc#V..7_C0RG,M4,<#UTrL":JHNs8VkBJ)gS/pdI^NJ,^T3$iUPcIQulmn,>E?
+503?pi.6CU&2*jd%t&=]^]+FVoEZ5KJ'@m'?SB1PJUdA8m4e5Q":.5H#_2:^%N/<b
+Boi;HarV[V%QOEHY@8%d`s<7SJ`,$<"]<3+71nbmJ5eCZ[^!jpnco9ss8W-!ON7WQ
+oLG;RVt>f'pf!H3=[S;G<M&b"d!50g,!"op!X^VP&1SpQ@lQadcp^1%$aAZ"a,&q9
+T4E62O)t[039UtX(GPb0LRT,'6-$fn)+25l)dPWs3<cX#2;S8L"<WH\1'!hbgk6[-
+ONNX!+JIa.s/G?!j-2RE5En.'jnW'W+B/Un$iH';$9ocnK#&$i.E[.5K)#BGs4Cd*
+rUTjcrr:=i&-&m?&GZ8RFs$4&6#7GKJ,'M:_M98.%3HgGEpuL[,+nF9Q"RCX'V-U&
+F,j:K*s;q%"X!br,,b2hj8\fis83JL^AgHW5QA!Q3t6rb+-9\2K4"ZX?4\B&LFLBO
+#DTV`LcmGDK?30F`ucDo)V.l/kdiC&iO(!r6!$TbK!GfV<cClmIReu%n:D]OLuo!'
+_AXhJ*>-:'6g-A!n+)8(a8a25&G'O>A*+jmo?7,0pqB3^I#glAa5hHbrunC*s'LhS
+I"*Poa'aH'p\@1:3QM0tU%'5.aUabgr."a]are\(."B;6r'rI@s7o%^J!;s'j8Y2?
+p%\?<s2lG`q]@5+a8c2>U*0G+I)H!Es8Dpnr]g3Gs8PIG3J[Y7s6PV-PW<76s,[3Q
+q"]^FargZ\+"2-L+92B)Ld.%E0_rchs8N$HIin^jreJP<5!T(.p-g(G+3-A@s-,b@
+q"]^Fs8VG5U&8p1r-tF`r]Xc^O8o#Ck9'0`L[kEErKmdb?]US%J,^KBrr4Br*97(u
+;#!<rJ$6o:5Q3nD"oXZG6\5H/6hstej,^MPNelZ%n\fm07Bagn&"%b)qa*N34SUH,
+s7-+5O8gQ;*&U:_JUHG+X8gC(6\H0$&^_RT\X[s3L][!`)R,*K,90r1rt,g`k9%Sd
+jD`h9*/#;b*edLAs8W,hs3<_L^23i4(]WL;+9.i8JK@9Fs!-Fkne&qB&7H:Qs8VmL
+s!WBs@K6Afs1%k"TL]%^-9mQj6hq!PTLL%$J,^i[j8]/TA,hViPWt5ps8S9)a78^3
+Ir"t3s!Btl&-$ADQ9Y0Eq"XJGs7nDIIjfdi#P4#U5Q?ohnc.bQ?hn43O8kG/O,s>?
+9Re/)a?fk(J,^i[jU_@rr`K3\s5W.V3<0$S1&ptrIj#'sr."bF8,rV4+92B3L]</p
+s8W,SJ)o)h5PY9YWC-^craGj,nc/Xhs8R+ps8W"Hs3uPiNcG*s_uKbu&-(l.5QCc`
+mQ^aOaC1DW-uad\,KJ<6s7lW8+Sgf6/ie^XA,\cFs8$*n6i[2`r]a@JWXg1!Eh"CR
+Pi['QnlaJ?.EZ\+k*^<rV%->`%T)6s:ur0`jU^Si3X?oj#cI5$NZo<../AYu+e3LW
+`'f!*NZjP$8,R6(+91mK+7^D$s,RQe6BC1,s8W*k+#\B>LQD!#^]006deAlbj=(%i
+cMs!Ar]n*qr"2;\3t)[MO8o7[s7hZ9.0'>Hs,Y*JM#[M@q&'+_j='(;s8W-!kTYf[
+J&hS=a6A`&?fWWqq1o"%nhL1E+J=5as8W,sKcg5Bs7,ft&cBQHs5[\br^)W3O8o7[
+rb24WEW?'Zcm'(s$97/i0`F<97R-q6'G(6)0L,U;YN.,23<0$=m=$:II)GaZq&'*^
+IR9&]O8n8p5QCaC$ND1fJ,fPhne?R-q1nM7s8U.>ne`J#s+C6'+34E]s+GCl+#*`T
+n,NFK.0'=/_#D+Kr]WRHs851^6BC7Nr-eV@2$8oF3[:@[,G7Vm3CB#k6^0PQ9?8-p
+@"23I7!(peF@S`@7mqGh7!(peF;OuPLkrE*"7eDg"EFJ>K0]J:s8W)W"lnZ$T^dU:
+ZV[HN'sIQ#N=g8<+G/+;$?DZ7.E@QgJd@Bg.IhEf,Da_HOD>h(>^$bl&;%u<%un@(
+s7l`VO6@dCc(E6i8,d69&7:+'N.8oaO.:^j%>0K:=9&<\j?^WjoF):\r]WSuru]1/
+r8[h:&7>J;j5`MHs8O/`5lZKRs8I$<nK7f2na[g]"onU`O<B%ns8P(Ypk0I`s7lC$
+EW?'Za:LSp"onUmJ,^Vjs7-"0^]4>T&3o4Ts8W'0?iU0+j8]/ZrX`H:s8V-Zs8W'0
+?iU0+j8]/ZrX`H:s8RoTs8W'd*$E#rnc/.Zs,[(Es8G<(na[g]s8VWm&-)\0r]cM!
+Lu^l$C12AniFcIa=lC(c3"u<7a>isM*)_:ds79mDnbu!BO,nejYlFWNs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r.a!Ha20:q*@LkCEA,BG%R?\-"Tsi7
+*.^BRs8Kq9nc/+k&b60Z9G8Cu,T=`S_4ZE+*saC5j$=Z-5lr:hO?eWs7i_^E*9\N$
+kTc.KUS,XnNfa:;#bf\";l'bt8Q(TU+^lO5PrMBf8<8'$W3Q35]);`X2NTg8#,i@b
+O>@?#^EJ[U_i@)4F)f5C5i`hR,lE[-(dbk4ni*(.f.:sTX/"WS<L!cm;R6,BNpo=H
+cm/lD@K&d5"<`^h"G$]m@#4S#Qrk`sEe=/u5Q3g$)um/BYd^8r`rGfYO.]%a:[^Q"
+!r:&Zi5#[aL]7Vkpb5$c!X'SN&E).PJfr4s295Ga`*`WH+9~>
+EI 
+Q
+BT
+286.08 85.92 TD
+0 0 0 rg
+/N8 12 Tf
+-0.0086 Tc
+0.0326 Tw
+(Figure 1)Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Page: 7 7
+%%BeginPageSetup
+userdict /pgsave save put
+PDFVars begin PDF begin PDFVars/InitAll get exec
+%%EndPageSetup
+0 0 612 792 RC
+BT
+303.6 36 TD
+0 0 0 rg
+/N6 9.84 Tf
+0.0019 Tc
+0 Tw
+(7)Tj
+-231.6 676.08 TD
+/N6 12 Tf
+0.1058 Tc
+-0.1418 Tw
+(The impact of this policy on the relative execution times of the three a\
+pplications is shown in Fig-)Tj
+0 -14.16 TD
+0.0714 Tc
+-0.2345 Tw
+(ure 2.  Because the coarse application acquires more CPU time, it finish\
+es its work earlier than the)Tj
+0 -13.92 TD
+0.0967 Tc
+-0.2527 Tw
+(other applications, even though all three jobs require the same amount o\
+f time in a dedicated envi-)Tj
+T*
+0.1286 Tc
+0 Tw
+(ronment)Tj
+0 -290.4 TD
+/N8 13.92 Tf
+0.0697 Tc
+-0.0611 Tw
+(Project Requirements)Tj
+0 -24.72 TD
+/N6 12 Tf
+0.1132 Tc
+1.2458 Tw
+(For your project, you need to implement code that is similar in function\
+ality to the Solaris TS)Tj
+0 -13.92 TD
+0.1128 Tc
+-0.0954 Tw
+(scheduler, but your code does not have to be structured in the same way.\
+  Implement your code in)Tj
+0 -14.16 TD
+0.1186 Tc
+-0.0253 Tw
+(whatever manner you find easiest when interfacing with the already exist\
+ing Nachos code. )Tj
+0 -24 TD
+0.0825 Tc
+0.2743 Tw
+(Specifically, you are not required to separate the class-independent and\
+ class-dependent schedul-)Tj
+0 -13.92 TD
+0.1074 Tc
+0.6886 Tw
+(ing functionality.  You do not need to support multiple scheduling class\
+es.  You can implement)Tj
+T*
+0.13 Tc
+0.419 Tw
+(any routines that you feel are necessary, not just the seven functions w\
+e specifically listed.  You)Tj
+0 -14.16 TD
+0.1262 Tc
+-0.0593 Tw
+(can pass any parameters that you find helpful.)Tj
+0 -24 TD
+0.068 Tc
+1.416 Tw
+(However, it is important that your approach be table-driven, with a user\
+-configurable dispatch)Tj
+0 -13.92 TD
+0.1033 Tc
+0.154 Tw
+(table.  Your table should be initialized to the default values in Solari\
+s 2.6, but you may also want)Tj
+T*
+0.1348 Tc
+0.3492 Tw
+(to experiment with different configurations.  To demonstrate the functio\
+nality of your scheduler,)Tj
+0 -14.16 TD
+0.1051 Tc
+0.3089 Tw
+(you may want to print out the change in priorities of several different \
+competing processes, as in)Tj
+0 -13.92 TD
+0.0405 Tc
+0.1635 Tw
+(Figure 1.  )Tj
+ET
+1 1 1 rg
+150.96 432 315.12 225.12 re
+f 
+q
+315.12 0 0 225.12 150.96 432 cm
+BI
+       /Width 341
+       /Height 252
+       /BitsPerComponent 1
+       /ColorSpace /DeviceGray 
+       /Decode [1 0 ]
+       /DecodeParms [null <</K -1 
+/Columns 341 >> ]
+       /Filter [/ASCII85Decode /CCITTFaxDecode ]
+ID
+-D5T@*#T_R#j@>3`c+g8+WV0Tfc1\<_$Ju0_BXXE`^^,YNXB)_TA[R+A:+?CLE*3A
+cXe*VS9']+%s"dE_M87$4L*'"XLs09$?CnbQ$-HLT#"/]6"dKqK-ifZ5c>5sGST*A
+('rsj";T%>n;8=KHk8UMj2""b-9Z<61Ch;jHNX\,"MoRQK%C,5ru2E%fMDO."onU]
++Gu3`s1ub9s,ZeB^[OLe&3u1=s6("HM"grK#S\sY"mD"so%s^+Qf%]P?fV/rK.?p#
++Ft&`5Q?BBE.8u%$H3'Q`#qF.A+CK[83)GJG\.lJa!%Pi]`\of!lcDINe/_LOL_]m
+&!;pG@$c]Ls8W-!s8W-!s8W-!q=Bu+i<ST,Jcn<6;#gM\C_RE#j;,QP/sd`E$c#&J
+*eL)L>`VE4_;c]*Bb0DMM!-%T7!Xl/FGMK.69hF'kn1c$V^i+[LEZ/f4es=0Jgc$"
+TKs19:e2-pJj=la*g7EP6jgsX?P&QdO0/kpj'fuadR0WVrK69;4jYG[j.JpS>f3A(
+,DM:660o.*j5@`^U#<`rTTYD?i].Et-ZFZ'+M#9hVNU`D77'>,BZOg+[iku9j>*GQ
+'KSVtLE-FMrV6U-#cAei.Re%_4@0#?4bB2ELH+JfLD68n.hFuP@0Al`J(NW\TKt8=
+jEqM9q&]_T#`:oC;kX@d-+2)cI"21rlnK)@c4U\SJgc,_?[r+5q?16r8KnS\TXnZQ
+=8p,\6f\*<fRL_j&1/P'5u#9?L\ull.ToN0A5UtW!X-Xd,REfq[=SP"+IYm1=Q(fO
+%<t_1'LAENW?_``;F+s07fqf1MKhQP&17o=Oj4M*_%\msq(^$ufgCWlPEn5L.gR13
+pCr2bVs,l6%tXsMJrfrJ&Q>?(Ud87/_(c7D8&9Zss00M:V1Kr9TuAUerWqQAJ"T7Q
+Jd<KN@9[<'&4<*\+9,h!FrLoN5>(:?ThEf^I"jmD^6;tZ6'aJr&,sQ[8VGVbYK,UT
+OouFHEMWG9CM]C&5nssK/dehE5ns!F&B#cJKNICb#V_E,Ml#I06'^AZ3Zs'P#X:r@
+&OV3`("E?lpdpA8&jZSBr<,ENGo[)#64uoWI4088q?\Z$oA5Zs";F0.7mR:#++bn]
+LXKT[$kC69s6(d9aUXM%`->K$#rf4Y<qI&uOAD`>V;S_6J!%WR4X(-KUd#-_2C,8C
+JZg:=+o**8aS.t34h*cg[A?H9J?K7\5qHu,'GZn#5nH/6k^!f*i?AMrTY2gIHkklK
+\Ju(C:dGVbJL%p*+I-@<Q$P]I'YPthdKC-Q^rZj)Jf-Ei3%ND`&>T5f#U"opJd;oT
+4:II*";!&H:cO-%";$WeJHR2&Uk0a[KQ6XI$%<FR$QqbDoR[3tLcllB5n'35`e"I-
+6^0Ug"HYnNW8#Zb!YBqqVp\*^qETWDK)HgD"@kaT6`$Ri+]6tA80C9[&4$FB"o:do
+*/<6^+@-8uVno1A&Po>k+JdU6d7NhZ#S;Y#s5q7N+IB9oNg(YPD-rre"<eB(=KqFr
+,WY41TRmjo"An1jKEr]P#_2Ju5qXD15lqF08.\.KOTKa!"aERmgRt@o,D)Hh&4$F]
+i%*4]&:t15*<]488e<KP_Ee;;+8ufo64dJu8s!/8O<B3!L3sa#!XL)!TQ*O+#V>eE
+O?jK*=X!Eg"??CG!XNl0&d/c!$F/"b+JYPc&4!2rjD\%nU(B]g5_026S-=./,Sq\W
+SKNM/*$C%/Jd<drJ?K7^#Z+Xe/0I=E!XM+qo10E9#V;)65p/R;(Z>LK;9t[s";8aG
++B/pn"eEdUL99\gUcgImC')fh+ID:T+Fse`X8#+DYU#<$G(n#X5ls<'cp\F3:k)"Y
+5nVIL1,s##"G-tFNYEUi!rmoZ+UB7F_FPf83'ef$=`L5C+[KLfdKgD;&B#1$dRYYi
+&G1Q>M!-BKKFf7m&f_c/(%jirNY2I+TY2T^5nAX3#U/t.O<@,>8HK5_P!K0AJHX'X
+00pnFWX'70JHX'X0*DhP"Wp#U&2-Qc82!73#U"oP&d`kTNa[0(63quB+YQBUJg6r%
+":-:q8HK//qPZ[jTRd4[HmTg)JdWa2)PFT/59lhQNg%Ckq4!4i7QCpOaDHr)CiUJ)
+OP:b0d/F"Elp(O?s8O3R)\%&o80Fl71uQ_J:(IIbLHH-tZClrB)E:/G%9J3]TRd^E
+MKBCtF:h9PMKgO<4<R%>,+hHG-QOQRF\0qo3XmJ:ddXml^Bc"PJNs1O?6;Kr?`3o#
+lLGC&GVG#&L62/eI`#TeCc3+Qp)=,?2B*/LAfD2.6Qe+=*/7;Pj,QBUa>AoKq&Hmu
+Km3@RD`E`Z=QOg08&D@..Lfd^Ab2<1i.<2H8.\J4r/ZF85ob=[!XXOr&b&(?YYW@%
+"nipcr-Jo4s'bq9Da9GEs6rN#5`q)!hLP_3o9eLQJe3JDrX^7B@"eXb#X/eC_6,!c
+6']N,O7&?j^]XX&~>
+EI 
+Q
+BT
+286.08 414 TD
+0 0 0 rg
+/N8 12 Tf
+-0.0086 Tc
+0.0326 Tw
+(Figure 2)Tj
+ET
+PDFVars/TermAll get exec end end
+userdict /pgsave get restore
+showpage
+%%PageTrailer
+%%EndPage
+%%Trailer
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%EOF
index c604b9635127543cb040df3905c2bca6e64f5160..4341cac9dcb4aa9213561d79e6dbbf6c2a565891 100644 (file)
@@ -32,8 +32,10 @@ primitives (semaphores, locks, and condition variables).
 @c FIXME: base system doesn't do anything. Debugger sucks.
 However, there's a lot of magic going on in some of this code, so you
 should compile and run the base system to see a simple test of the
 @c FIXME: base system doesn't do anything. Debugger sucks.
 However, there's a lot of magic going on in some of this code, so you
 should compile and run the base system to see a simple test of the
-code.  You should trace the execution using your favorite debugger to
-get a sense for what's going on.
+code.  You should read through the source code by hand to see what's
+going on.  If you like, you can add calls to @code{printf()} almost
+anywhere, then recompile and run to see what happens and in what
+order.
 
 When a thread is created, you are creating a new context to be
 scheduled. You provide a function to be run in this context as an
 
 When a thread is created, you are creating a new context to be
 scheduled. You provide a function to be run in this context as an
@@ -52,8 +54,8 @@ synchronization primitives are used to force context switches when one
 thread needs to wait for another thread to do something.
 
 The exact mechanics of a context switch are pretty gruesome and have
 thread needs to wait for another thread to do something.
 
 The exact mechanics of a context switch are pretty gruesome and have
-been provided for you in @file{switch.S} (this is 80@var{x}86
-assembly; don't worry about understanding it). It involves saving the
+been provided for you in @file{threads/switch.S} (this is 80@var{x}86
+assembly; don't worry about understanding it).  It involves saving the
 state of the currently running thread and restoring the state of the
 thread we're switching to.
 @c FIXME 
 state of the currently running thread and restoring the state of the
 thread we're switching to.
 @c FIXME 
@@ -263,9 +265,9 @@ However, you do need to implement priority scheduling in all cases.
 @section Problem 1-4 Advanced Scheduler
 
 Implement Solaris's multilevel feedback queue scheduler (MFQS), as
 @section Problem 1-4 Advanced Scheduler
 
 Implement Solaris's multilevel feedback queue scheduler (MFQS), as
-explained below, to reduce the average response time for running jobs
-on your system. 
-@c FIXME need link
+explained in this @uref{mlfqs.pdf, , PDF} or @uref{mlfqs.ps, ,
+PostScript} file, to reduce the average response time for running jobs
+on your system.
 
 Demonstrate that your scheduling algorithm reduces response time
 relative to the original Pintos scheduling algorithm (round robin) for
 
 Demonstrate that your scheduling algorithm reduces response time
 relative to the original Pintos scheduling algorithm (round robin) for
index 2b7edb46b36cf4984bf201c227b6391aa254c6c6..f80a80c28ad0ac6e705447fee78900b3380bb74c 100644 (file)
@@ -516,6 +516,10 @@ restore registers before and after a function call, you need to write
 the stack pointer, you have a couple of jumps which probably wrecks
 some of your caches.  This is why inlining code can be much faster.
 
 the stack pointer, you have a couple of jumps which probably wrecks
 some of your caches.  This is why inlining code can be much faster.
 
+@menu
+* Argument Passing to main::    
+@end menu
+
 @node Argument Passing to main
 @subsection Argument Passing to @code{main()}
 
 @node Argument Passing to main
 @subsection Argument Passing to @code{main()}
 
index 812915ee5db2fc927a36eb85da5e2b66c03c787f..84b07524d98791fb86cf6b44f3864e6a7969e413 100644 (file)
@@ -570,13 +570,13 @@ length, and then use Mmap:
 #include <syscall.h>
 
 int main (void)
 #include <syscall.h>
 
 int main (void)
-{
+@{
     void *addr = (void *) 0x10000000;
     int fd = open ("foo");
     int length = filesize (fd);
     if (mmap (fd, addr, length))
         printf ("success!\n");
     void *addr = (void *) 0x10000000;
     int fd = open ("foo");
     int length = filesize (fd);
     if (mmap (fd, addr, length))
         printf ("success!\n");
-}
+@}
 @end example
 
 Suppose @file{foo} is a text file and you want to print the first 64
 @end example
 
 Suppose @file{foo} is a text file and you want to print the first 64