From: Ben Pfaff
Date: Sun, 12 Sep 2004 00:00:42 +0000 (+0000)
Subject: Work on projects.
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28034190e6ffa80204e6ab29b2968d8c5ba178b9;p=pintos-anon
Work on projects.
---
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..138cf35
--- /dev/null
+++ b/doc/Makefile
@@ -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
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
index 0000000..0b1f527
--- /dev/null
+++ b/doc/mlfqs.ps
@@ -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 <> ]
+ /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`'RHROJclh`+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/f'pf!H3=[S;G-:'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%\?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
+;#!?
+9Re/)a?fk(J,^i[jU_@rr`K3\s5W.V3<0$S1&ptrIj#'sr."bF8,rV4+92B3L]
`%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$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
+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 <> ]
+ /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`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\*?(Ud87/_(c7D8&9Zss00M:V1Kr9TuAUerWqQAJ"T7Q
+Jd(:?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$#rf4YV;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-@T5f#U"opJd;oT
+4:II*";!&H:cO-%";$WeJHR2&Uk0a[KQ6XI$%k+JdU6d7NhZ#S;Y#s5q7N+IB9oNg(YPD-rre"eE
+O?jK*=X!Eg"??CG!XNl0&d/c!$F/"b+JYPc&4!2rjD\%nU(B]g5_026S-=./,Sq\W
+SKNM/*$C%/JdLK;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,+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
diff --git a/doc/threads.texi b/doc/threads.texi
index c604b96..4341cac 100644
--- a/doc/threads.texi
+++ b/doc/threads.texi
@@ -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
-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
@@ -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
-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
@@ -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
-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
diff --git a/doc/userprog.texi b/doc/userprog.texi
index 2b7edb4..f80a80c 100644
--- a/doc/userprog.texi
+++ b/doc/userprog.texi
@@ -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.
+@menu
+* Argument Passing to main::
+@end menu
+
@node Argument Passing to main
@subsection Argument Passing to @code{main()}
diff --git a/doc/vm.texi b/doc/vm.texi
index 812915e..84b0752 100644
--- a/doc/vm.texi
+++ b/doc/vm.texi
@@ -570,13 +570,13 @@ length, and then use Mmap:
#include
int main (void)
-{
+@{
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