From: Ben Pfaff Date: Wed, 29 Sep 2004 04:07:15 +0000 (+0000) Subject: Update docs. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=commitdiff_plain;h=1e70978fdf2e3dd9a3c2153dab259bc689fd7d31 Update docs. --- diff --git a/doc/Makefile b/doc/Makefile index 446b2b3..9e918bb 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,20 +1,40 @@ -TEXIS = projects.texi intro.texi tour.texi threads.texi mlfqs.texi \ +TEXIS = pintos.texi intro.texi tour.texi threads.texi mlfqs.texi \ userprog.texi vm.texi filesys.texi references.texi standards.texi \ doc.texi devel.texi debug.texi -all: projects.html projects.info +all: pintos.html pintos.info pintos.dvi pintos.ps pintos.pdf -projects.html: $(TEXIS) mlfqs1.png mlfqs2.png +pintos.html: $(TEXIS) mlfqs1.png mlfqs2.png ./texi2html -toc_file=$@ -split=chapter -nosec_nav -nomenu -init_file pintos-t2h.init -nonumber $< -projects.info: $(TEXIS) +pintos.info: $(TEXIS) makeinfo $< +pintos.dvi: $(TEXIS) mlfqs1.eps mlfqs2.eps + texi2dvi $< -o $@ + +pintos.ps: pintos.dvi + dvips $< -o $@ + +pintos.pdf: $(TEXIS) mlfqs1.pdf mlfqs2.pdf + texi2pdf $< -o $@ + %.eps: %.jgr (jgraph $< > $@.tmp && mv $@.tmp $@) || touch $@ %.png: %.eps convert $< $@ +%.pdf: %.eps + epstopdf $< --outfile=$@ + clean: rm -f *.info *.html *.png + rm -f *.dvi *.pdf *.ps *.log + rm -rf WWW + +dist: pintos.html pintos.pdf + rm -rf WWW + mkdir WWW WWW/specs + cp *.html *.png *.pdf *.css WWW + (cd ../specs && cp -r *.pdf freevga kbd sysv-abi-update.html ../doc/WWW/specs) diff --git a/doc/debug.texi b/doc/debug.texi index d48e639..82f001f 100644 --- a/doc/debug.texi +++ b/doc/debug.texi @@ -16,7 +16,7 @@ introduces you to a few of them. @end menu @node printf -@section @func{printf} +@section @code{@code{printf()}} Don't underestimate the value of @func{printf}. The way @func{printf} is implemented in Pintos, you can call it from diff --git a/doc/filesys.texi b/doc/filesys.texi index da5f1e2..345183c 100644 --- a/doc/filesys.texi +++ b/doc/filesys.texi @@ -91,7 +91,7 @@ Modify the file system to allow the maximum size of a file to be as large as the disk. You can assume that the disk will not be larger than 8 MB. In the basic file system, each file is limited to a file size of just under 64 kB. Each file has a header called an index node -or @dfn{inode} (represented by @code{struct inode}) that is a table of +or @dfn{inode} (represented by @struct{inode}) that is a table of direct pointers to the disk blocks for that file. Since the inode is stored in one disk sector, the maximum size of a file is limited by the number of pointers that will fit in one disk sector. Increasing @@ -293,9 +293,9 @@ No, @code{DISK_SECTOR_SIZE} is fixed at 512. This is a fixed property of IDE disk hardware. @item -@b{Will the @code{struct inode} take up space on the disk too?} +@b{Will the @struct{inode} take up space on the disk too?} -Yes. Anything stored in @code{struct inode} takes up space on disk, +Yes. Anything stored in @struct{inode} takes up space on disk, so you must include this in your calculation of how many entires will fit in a single disk sector. @end enumerate @@ -315,7 +315,7 @@ fit in a single disk sector. The disk we create will be 8 MB or smaller. However, individual files will have to be smaller than the disk to accommodate the metadata. -You'll need to consider this when deciding your @code{struct inode} +You'll need to consider this when deciding your @struct{inode} organization. @end enumerate @@ -385,22 +385,22 @@ only be deleted if they are empty, as in Unix. @enumerate 1 @item @b{We're limited to a 64-block cache, but can we also keep a copy of -each @code{struct inode} for an open file inside @code{struct file}, +each @struct{inode} for an open file inside @struct{file}, the way the stub code does?} No, you shouldn't keep any disk sectors stored anywhere outside the cache. That means you'll have to change the way the file implementation accesses its corresponding inode right now, since it -currently just creates a new @code{struct inode} in its constructor +currently just creates a new @struct{inode} in its constructor and reads the corresponding sector in from disk when it's created. -There are two reasons for not storing inodes in @code{struct file}. +There are two reasons for not storing inodes in @struct{file}. First, keeping extra copies of inodes would be cheating the 64-block limitation that we place on your cache. Second, if two processes have the same file open, you will create a huge synchronization headache -for yourself if each @code{struct file} has its own copy of the inode. +for yourself if each @struct{file} has its own copy of the inode. -Note that you can store pointers to inodes in @code{struct file} if +Note that you can store pointers to inodes in @struct{file} if you want, and you can store some other small amount of information to help you find the inode when you need it. @@ -408,13 +408,13 @@ Similarly, if you want to store one block of data plus some small amount of metadata for each of your 64 cache entries, that's fine. @item -@b{But why can't we store copies of inodes in @code{struct file}? We +@b{But why can't we store copies of inodes in @struct{file}? We don't understand the answer to the previous question.} -The issue regarding storing @code{struct inode}s has to do with +The issue regarding storing @struct{inode}s has to do with implementation of the buffer cache. Basically, you can't store a -@code{struct inode *} in @code{struct inode}. Each time you need -to read a @code{struct inode}, you'll have to get it either from the +@code{struct inode *} in @struct{inode}. Each time you need +to read a @struct{inode}, you'll have to get it either from the buffer cache or from disk. If you look at @func{file_read_at}, it uses the inode directly diff --git a/doc/intro.texi b/doc/intro.texi index 81b54fb..847eba4 100644 --- a/doc/intro.texi +++ b/doc/intro.texi @@ -9,10 +9,10 @@ project team will strengthen its support in all three of these areas. You will also add a virtual memory implementation. Pintos could, theoretically, run on a regular IBM-compatible PC. As -fun as it might be, it is impractical to supply every student in CS -140 with his or her own PC. Therefore, we will run Pintos projects in -a PC simulator, that is, a program that simulates an 80@var{x}86 CPU -and its peripheral devices well enough that unmodified operating +much fun as it might be, it is impractical to supply every student in +CS 140 with his or her own PC. Therefore, we will run Pintos projects +in a PC simulator, that is, a program that simulates an 80@var{x}86 +CPU and its peripheral devices well enough that unmodified operating systems and software can run under it. In class we will use the @uref{http://bochs.sourceforge.net, , Bochs} simulator. Pintos has also been tested within @uref{http://fabrice.bellard.free.fr/qemu/, , diff --git a/doc/mlfqs.pdf b/doc/mlfqs.pdf deleted file mode 100644 index 8895088..0000000 Binary files a/doc/mlfqs.pdf and /dev/null differ diff --git a/doc/mlfqs.ps b/doc/mlfqs.ps deleted file mode 100644 index 0b1f527..0000000 --- a/doc/mlfqs.ps +++ /dev/null @@ -1,3313 +0,0 @@ -%!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/mlfqs.texi b/doc/mlfqs.texi index 253f91b..2ac1780 100644 --- a/doc/mlfqs.texi +++ b/doc/mlfqs.texi @@ -356,7 +356,12 @@ consumes its timeslice, its priority is lowered about ten levels Since the coarse job runs more frequently, it drops in priority at a faster rate than the other two jobs. +@ifnottex @image{mlfqs1} +@end ifnottex +@iftex +@image{mlfqs1, 3in} +@end iftex The impact of this policy on the relative execution times of the three applications is shown in the next graph below. Because the coarse @@ -364,7 +369,12 @@ application acquires more CPU time, it finishes its work earlier than the other applications, even though all three jobs require the same amount of time in a dedicated environment. +@ifnottex @image{mlfqs2} +@end ifnottex +@iftex +@image{mlfqs2, 3in} +@end iftex @node Project Requirements @section Project Requirements diff --git a/doc/pintos.texi b/doc/pintos.texi new file mode 100644 index 0000000..1dd83fd --- /dev/null +++ b/doc/pintos.texi @@ -0,0 +1,80 @@ +\input texinfo @c -*- texinfo -*- +@c %**start of header +@setfilename projects.info +@settitle Pintos Projects +@c %**end of header + +@c @bibref{} macro +@iftex +@macro bibref{cite} +[\cite\] +@end macro +@end iftex +@ifinfo +@ifnotplaintext +@macro bibref{cite} +@ref{\cite\} +@end macro +@end ifnotplaintext +@ifplaintext +@macro bibref{cite} +[\cite\] +@end macro +@end ifplaintext +@end ifinfo +@ifhtml +@macro bibref{cite} +[@ref{\cite\}] +@end macro +@end ifhtml + +@macro func{name} +@code{\name\()} +@end macro + +@macro struct{name} +@code{struct \name\} +@end macro + +@titlepage +@title Pintos +@author by Ben Pfaff +@author based on past contributions of CS 140 TAs +@end titlepage + +@contents + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top Pintos Projects +@end ifnottex + +@menu +* Introduction:: +* Pintos Tour:: +* Project 1--Threads:: +* Project 2--User Programs:: +* Project 3--Virtual Memory:: +* Project 4--File Systems:: +* References:: +* Multilevel Feedback Scheduling:: +* Coding Standards:: +* Project Documentation:: +* Debugging Tools:: +* Development Tools:: +@end menu + +@include intro.texi +@include tour.texi +@include threads.texi +@include userprog.texi +@include vm.texi +@include filesys.texi +@include references.texi +@include mlfqs.texi +@include standards.texi +@include doc.texi +@include debug.texi +@include devel.texi + +@bye diff --git a/doc/projects.texi b/doc/projects.texi deleted file mode 100644 index b5b08f5..0000000 --- a/doc/projects.texi +++ /dev/null @@ -1,78 +0,0 @@ -\input texinfo @c -*- texinfo -*- -@c %**start of header -@setfilename projects.info -@settitle Pintos Projects -@c %**end of header - -@c @bibref{} macro -@iftex -@macro bibref{cite} -[\cite\] -@end macro -@end iftex -@ifinfo -@ifnotplaintext -@macro bibref{cite} -@ref{\cite\} -@end macro -@end ifnotplaintext -@ifplaintext -@macro bibref{cite} -[\cite\] -@end macro -@end ifplaintext -@end ifinfo -@ifhtml -@macro bibref{cite} -[@ref{\cite\}] -@end macro -@end ifhtml - -@macro func{name} -@code{\name\()} -@end macro - -@macro struct{name} -@code{struct \name\} -@end macro - -@titlepage -@title Pintos Projects -@end titlepage - -@contents - -@ifnottex -@node Top, Introduction, (dir), (dir) -@top Pintos Projects -@end ifnottex - -@menu -* Introduction:: -* Pintos Tour:: -* Project 1--Threads:: -* Project 2--User Programs:: -* Project 3--Virtual Memory:: -* Project 4--File Systems:: -* References:: -* Multilevel Feedback Scheduling:: -* Coding Standards:: -* Project Documentation:: -* Debugging Tools:: -* Development Tools:: -@end menu - -@include intro.texi -@include tour.texi -@include threads.texi -@include userprog.texi -@include vm.texi -@include filesys.texi -@include references.texi -@include mlfqs.texi -@include standards.texi -@include doc.texi -@include debug.texi -@include devel.texi - -@bye diff --git a/doc/threads.texi b/doc/threads.texi index 04d48d1..63aed69 100644 --- a/doc/threads.texi +++ b/doc/threads.texi @@ -15,9 +15,8 @@ Before you read the description of this project, you should read all of the following sections: @ref{Introduction}, @ref{Coding Standards}, @ref{Project Documentation}, @ref{Debugging Tools}, and @ref{Development Tools}. You should at least skim the material in -@ref{Threads Tour}, but there's no need to fret over the details. To -complete this project you will also need to read @ref{Multilevel -Feedback Scheduling}. +@ref{Threads Tour}. To complete this project you will also need to +read @ref{Multilevel Feedback Scheduling}. @menu * Understanding Threads:: @@ -131,7 +130,7 @@ gets initialized. @item thread.c @itemx thread.h Basic thread support. Much of your work will take place in these -files. @file{thread.h} defines @code{struct thread}, which you will +files. @file{thread.h} defines @struct{thread}, which you will modify in the first three projects. @item switch.S @@ -407,7 +406,7 @@ should implement @func{thread_join} to have the same restriction. That is, a thread may only join its immediate children. A thread need not ever be joined. Your solution should properly free -all of a thread's resources, including its @code{struct thread}, +all of a thread's resources, including its @struct{thread}, whether it is ever joined or not, and regardless of whether the child exits before or after its parent. That is, a thread should be freed exactly once in all cases. diff --git a/doc/tour.texi b/doc/tour.texi index ae9e74e..ee90cca 100644 --- a/doc/tour.texi +++ b/doc/tour.texi @@ -204,7 +204,7 @@ threads to continue running. @end menu @node struct thread -@subsection @struct{thread} +@subsection @code{struct thread} The main Pintos data structure for threads is @struct{thread}, declared in @file{threads/thread.h}. @struct{thread} has these @@ -283,6 +283,7 @@ memory. The rest of the page is used for the thread's stack, which grows downward from the end of the page. It looks like this: @example +@group 4 kB +---------------------------------+ | kernel stack | | | | @@ -304,6 +305,7 @@ grows downward from the end of the page. It looks like this: | name | | status | 0 kB +---------------------------------+ +@end group @end example The upshot of this is twofold. First, @struct{thread} must not be @@ -346,8 +348,8 @@ called early in Pintos initialization. Called by @func{main} to start the scheduler. Creates the idle thread, that is, the thread that is scheduled when no other thread is ready. Then enables interrupts, which enables the scheduler because -processes are rescheduled in the return path from the timer -interrupt. FIXME +processes are rescheduled on return from the timer interrupt, using +@func{intr_yield_on_return} (@pxref{External Interrupt Handling}). @end deftypefun @deftypefun void thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux}) diff --git a/doc/userprog.texi b/doc/userprog.texi index 72ab256..da9fe3d 100644 --- a/doc/userprog.texi +++ b/doc/userprog.texi @@ -478,25 +478,25 @@ because there's no way to return an error code from a memory access. Therefore, for those who want to try the latter technique, we'll provide a little bit of helpful code: -@example +@verbatim /* Tries to copy a byte from user address USRC to kernel address DST. Returns true if successful, false if USRC is invalid. */ -static inline bool get_user (uint8_t *dst, const uint8_t *usrc) @{ +static inline bool get_user (uint8_t *dst, const uint8_t *usrc) { int eax; asm ("movl $1f, %%eax; movb %2, %%al; movb %%al, %0; 1:" : "=m" (*dst), "=&a" (eax) : "m" (*usrc)); return eax != 0; -@} +} /* Tries write BYTE to user address UDST. Returns true if successful, false if UDST is invalid. */ -static inline bool put_user (uint8_t *udst, uint8_t byte) @{ +static inline bool put_user (uint8_t *udst, uint8_t byte) { int eax; asm ("movl $1f, %%eax; movb %b2, %0; 1:" : "=m" (*udst), "=&a" (eax) : "r" (byte)); return eax != 0; -@} -@end example +} +@end verbatim Each of these functions assumes that the user address has already been verified to be below @code{PHYS_BASE}. They also assume that you've @@ -592,7 +592,7 @@ This value, the exit status of the process, must be returned to the thread's parent when @func{join} is called. @item -@b{Can I just cast a pointer to a @code{struct file} object to get a +@b{Can I just cast a pointer to a @struct{file} object to get a unique file descriptor? Can I just cast a @code{struct thread *} to a @code{pid_t}? It's so much simpler that way!} @@ -688,7 +688,7 @@ some of your caches. This is why inlining code can be much faster. @end menu @node Argument Passing to main -@subsection Argument Passing to @func{main} +@subsection Argument Passing to @code{main()} In @func{main}'s case, there is no caller to prepare the stack before it runs. Therefore, the kernel needs to do it. Fortunately, @@ -807,12 +807,12 @@ You may find the non-standard @func{hex_dump} function, declared in Here's what it would show in the above example, given that @code{PHYS_BASE} is @t{0xc0000000}: -@example +@verbatim bfffffc0 00 00 00 00 | ....| bfffffd0 04 00 00 00 d8 ff ff bf-ed ff ff bf f5 ff ff bf |................| bfffffe0 f8 ff ff bf fc ff ff bf-00 00 00 00 00 2f 62 69 |............./bi| bffffff0 6e 2f 6c 73 00 2d 6c 00-2a 2e 68 00 2a 2e 63 00 |n/ls.-l.*.h.*.c.| -@end example +@end verbatim @node System Calls @section System Calls @@ -868,4 +868,4 @@ In this example, the caller's stack pointer would be at The 80@var{x}86 convention for function return values is to place them in the @samp{EAX} register. System calls that return a value can do -so by modifying the @samp{eax} member of @code{struct intr_frame}. +so by modifying the @samp{eax} member of @struct{intr_frame}. diff --git a/doc/vm.texi b/doc/vm.texi index 4d495d4..64619c8 100644 --- a/doc/vm.texi +++ b/doc/vm.texi @@ -131,6 +131,7 @@ address. @end enumerate @example +@group 32 22 12 0 +--------------------------------------------------------------------+ | Page Directory Index | Page Table Index | Page Offset | @@ -158,6 +159,7 @@ address. 1|____________| | 1|____________| | |____________| 0|____________| \__\0|____________| \____\|____________| / / +@end group @end example Header @file{threads/mmu.h} has useful functions for various @@ -471,7 +473,7 @@ true if the first is less than the second. These two functions have to be compatible with the prototypes for @code{hash_hash_func} and @code{hash_less_func} in @file{lib/kernel/hash.h}. -Here's a quick example. Suppose you want to put @code{struct thread}s +Here's a quick example. Suppose you want to put @struct{thread}s in a hash table. First, add a @code{hash_elem} to the thread structure by adding a line to its definition: @@ -479,7 +481,7 @@ structure by adding a line to its definition: hash_elem h_elem; /* Hash table element. */ @end example -We'll choose the @code{tid} member in @code{struct thread} as the key, +We'll choose the @code{tid} member in @struct{thread} as the key, and write a hash function and a comparison function: @example @@ -493,7 +495,8 @@ thread_hash (const hash_elem *e, void *aux UNUSED) /* Returns true if A's tid is less than B's tid. */ bool -thread_less (const hash_elem *a_, const hash_elem *b_, void *aux UNUSED) +thread_less (const hash_elem *a_, const hash_elem *b_, + void *aux UNUSED) @{ struct thread *a = hash_entry (a_, struct thread, h_elem); struct thread *b = hash_entry (b_, struct thread, h_elem); @@ -509,7 +512,7 @@ struct hash threads; hash_init (&threads, thread_hash, thread_less, NULL); @end example -Finally, if @code{@var{t}} is a pointer to a @code{struct thread}, +Finally, if @code{@var{t}} is a pointer to a @struct{thread}, then we can insert it into the hash table with: @example