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