Update docs.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 29 Sep 2004 04:07:15 +0000 (04:07 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 29 Sep 2004 04:07:15 +0000 (04:07 +0000)
13 files changed:
doc/Makefile
doc/debug.texi
doc/filesys.texi
doc/intro.texi
doc/mlfqs.pdf [deleted file]
doc/mlfqs.ps [deleted file]
doc/mlfqs.texi
doc/pintos.texi [new file with mode: 0644]
doc/projects.texi [deleted file]
doc/threads.texi
doc/tour.texi
doc/userprog.texi
doc/vm.texi

index 446b2b345cb921edad687ee4323f7bc4f81b26b8..9e918bb93842d827108f101c2acbed56f07382e1 100644 (file)
@@ -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
 
 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 $<
 
        ./texi2html -toc_file=$@ -split=chapter -nosec_nav -nomenu -init_file pintos-t2h.init -nonumber $<
 
-projects.info: $(TEXIS)
+pintos.info: $(TEXIS)
        makeinfo $<
 
        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 $< $@
 
 %.eps: %.jgr
        (jgraph $< > $@.tmp && mv $@.tmp $@) || touch $@
 
 %.png: %.eps
        convert $< $@
 
+%.pdf: %.eps
+       epstopdf $< --outfile=$@
+
 clean:
        rm -f *.info *.html *.png
 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)
index d48e6392e477f7da88f33363b59abba690056da4..82f001ffbe91ffbdb2dedc912c4c08f202ba6059 100644 (file)
@@ -16,7 +16,7 @@ introduces you to a few of them.
 @end menu
 
 @node printf
 @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
 
 Don't underestimate the value of @func{printf}.  The way
 @func{printf} is implemented in Pintos, you can call it from
index da5f1e2a7380c229daadac94801e5c5c70064cf0..345183c29ec37514cf4cd41e328304b0b17b6f09 100644 (file)
@@ -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
 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
 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
 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
 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.
 
 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
 
 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
 @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
 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.
 
 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
 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.
 
 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
 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.}
 
 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
 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
 buffer cache or from disk.
 
 If you look at @func{file_read_at}, it uses the inode directly
index 81b54fb5e11057721d5617675bf12168ad89896c..847eba403b011209b6d3599f927991426db4f712 100644 (file)
@@ -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
 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/, ,
 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 (file)
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 (file)
index 0b1f527..0000000
+++ /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 <</K -1 
-/Columns 341 >> ]
-       /Filter [/ASCII85Decode /CCITTFaxDecode ]
-ID
--D5]FA8n>d7gp!_JX[(R5">e_j!0;@j@9Z7"XAU2d2e_p*"\,c3#Ka/8'jaH&a,4-
-#\85\,N&M_PW@[i'VW`2TgqY6%"m9(Eif#,+NhRZU!,MtGK`'RHRO<b[!s=YUU#(J
-HNcCf"dN_L%^ZKa<<t)XOou=D$_Tb@q&^j>Jclh`+B1kB";)XU5`d7B!_EFsYEA<>
-W";hc#V..7_C0RG,M4,<#UTrL":JHNs8VkBJ)gS/pdI^NJ,^T3$iUPcIQulmn,>E?
-503?pi.6CU&2*jd%t&=]^]+FVoEZ5KJ'@m'?SB1PJUdA8m4e5Q":.5H#_2:^%N/<b
-Boi;HarV[V%QOEHY@8%d`s<7SJ`,$<"]<3+71nbmJ5eCZ[^!jpnco9ss8W-!ON7WQ
-oLG;RVt>f'pf!H3=[S;G<M&b"d!50g,!"op!X^VP&1SpQ@lQadcp^1%$aAZ"a,&q9
-T4E62O)t[039UtX(GPb0LRT,'6-$fn)+25l)dPWs3<cX#2;S8L"<WH\1'!hbgk6[-
-ONNX!+JIa.s/G?!j-2RE5En.'jnW'W+B/Un$iH';$9ocnK#&$i.E[.5K)#BGs4Cd*
-rUTjcrr:=i&-&m?&GZ8RFs$4&6#7GKJ,'M:_M98.%3HgGEpuL[,+nF9Q"RCX'V-U&
-F,j:K*s;q%"X!br,,b2hj8\fis83JL^AgHW5QA!Q3t6rb+-9\2K4"ZX?4\B&LFLBO
-#DTV`LcmGDK?30F`ucDo)V.l/kdiC&iO(!r6!$TbK!GfV<cClmIReu%n:D]OLuo!'
-_AXhJ*>-:'6g-A!n+)8(a8a25&G'O>A*+jmo?7,0pqB3^I#glAa5hHbrunC*s'LhS
-I"*Poa'aH'p\@1:3QM0tU%'5.aUabgr."a]are\(."B;6r'rI@s7o%^J!;s'j8Y2?
-p%\?<s2lG`q]@5+a8c2>U*0G+I)H!Es8Dpnr]g3Gs8PIG3J[Y7s6PV-PW<76s,[3Q
-q"]^FargZ\+"2-L+92B)Ld.%E0_rchs8N$HIin^jreJP<5!T(.p-g(G+3-A@s-,b@
-q"]^Fs8VG5U&8p1r-tF`r]Xc^O8o#Ck9'0`L[kEErKmdb?]US%J,^KBrr4Br*97(u
-;#!<rJ$6o:5Q3nD"oXZG6\5H/6hstej,^MPNelZ%n\fm07Bagn&"%b)qa*N34SUH,
-s7-+5O8gQ;*&U:_JUHG+X8gC(6\H0$&^_RT\X[s3L][!`)R,*K,90r1rt,g`k9%Sd
-jD`h9*/#;b*edLAs8W,hs3<_L^23i4(]WL;+9.i8JK@9Fs!-Fkne&qB&7H:Qs8VmL
-s!WBs@K6Afs1%k"TL]%^-9mQj6hq!PTLL%$J,^i[j8]/TA,hViPWt5ps8S9)a78^3
-Ir"t3s!Btl&-$ADQ9Y0Eq"XJGs7nDIIjfdi#P4#U5Q?ohnc.bQ?hn43O8kG/O,s>?
-9Re/)a?fk(J,^i[jU_@rr`K3\s5W.V3<0$S1&ptrIj#'sr."bF8,rV4+92B3L]</p
-s8W,SJ)o)h5PY9YWC-^craGj,nc/Xhs8R+ps8W"Hs3uPiNcG*s_uKbu&-(l.5QCc`
-mQ^aOaC1DW-uad\,KJ<6s7lW8+Sgf6/ie^XA,\cFs8$*n6i[2`r]a@JWXg1!Eh"CR
-Pi['QnlaJ?.EZ\+k*^<rV%->`%T)6s:ur0`jU^Si3X?oj#cI5$NZo<../AYu+e3LW
-`'f!*NZjP$8,R6(+91mK+7^D$s,RQe6BC1,s8W*k+#\B>LQD!#^]006deAlbj=(%i
-cMs!Ar]n*qr"2;\3t)[MO8o7[s7hZ9.0'>Hs,Y*JM#[M@q&'+_j='(;s8W-!kTYf[
-J&hS=a6A`&?fWWqq1o"%nhL1E+J=5as8W,sKcg5Bs7,ft&cBQHs5[\br^)W3O8o7[
-rb24WEW?'Zcm'(s$97/i0`F<97R-q6'G(6)0L,U;YN.,23<0$=m=$:II)GaZq&'*^
-IR9&]O8n8p5QCaC$ND1fJ,fPhne?R-q1nM7s8U.>ne`J#s+C6'+34E]s+GCl+#*`T
-n,NFK.0'=/_#D+Kr]WRHs851^6BC7Nr-eV@2$8oF3[:@[,G7Vm3CB#k6^0PQ9?8-p
-@"23I7!(peF@S`@7mqGh7!(peF;OuPLkrE*"7eDg"EFJ>K0]J:s8W)W"lnZ$T^dU:
-ZV[HN'sIQ#N=g8<+G/+;$?DZ7.E@QgJd@Bg.IhEf,Da_HOD>h(>^$bl&;%u<%un@(
-s7l`VO6@dCc(E6i8,d69&7:+'N.8oaO.:^j%>0K:=9&<\j?^WjoF):\r]WSuru]1/
-r8[h:&7>J;j5`MHs8O/`5lZKRs8I$<nK7f2na[g]"onU`O<B%ns8P(Ypk0I`s7lC$
-EW?'Za:LSp"onUmJ,^Vjs7-"0^]4>T&3o4Ts8W'0?iU0+j8]/ZrX`H:s8V-Zs8W'0
-?iU0+j8]/ZrX`H:s8RoTs8W'd*$E#rnc/.Zs,[(Es8G<(na[g]s8VWm&-)\0r]cM!
-Lu^l$C12AniFcIa=lC(c3"u<7a>isM*)_:ds79mDnbu!BO,nejYlFWNs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r.a!Ha20:q*@LkCEA,BG%R?\-"Tsi7
-*.^BRs8Kq9nc/+k&b60Z9G8Cu,T=`S_4ZE+*saC5j$=Z-5lr:hO?eWs7i_^E*9\N$
-kTc.KUS,XnNfa:;#bf\";l'bt8Q(TU+^lO5PrMBf8<8'$W3Q35]);`X2NTg8#,i@b
-O>@?#^EJ[U_i@)4F)f5C5i`hR,lE[-(dbk4ni*(.f.:sTX/"WS<L!cm;R6,BNpo=H
-cm/lD@K&d5"<`^h"G$]m@#4S#Qrk`sEe=/u5Q3g$)um/BYd^8r`rGfYO.]%a:[^Q"
-!r:&Zi5#[aL]7Vkpb5$c!X'SN&E).PJfr4s295Ga`*`WH+9~>
-EI 
-Q
-BT
-286.08 85.92 TD
-0 0 0 rg
-/N8 12 Tf
--0.0086 Tc
-0.0326 Tw
-(Figure 1)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 7 7
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(7)Tj
--231.6 676.08 TD
-/N6 12 Tf
-0.1058 Tc
--0.1418 Tw
-(The impact of this policy on the relative execution times of the three a\
-pplications is shown in Fig-)Tj
-0 -14.16 TD
-0.0714 Tc
--0.2345 Tw
-(ure 2.  Because the coarse application acquires more CPU time, it finish\
-es its work earlier than the)Tj
-0 -13.92 TD
-0.0967 Tc
--0.2527 Tw
-(other applications, even though all three jobs require the same amount o\
-f time in a dedicated envi-)Tj
-T*
-0.1286 Tc
-0 Tw
-(ronment)Tj
-0 -290.4 TD
-/N8 13.92 Tf
-0.0697 Tc
--0.0611 Tw
-(Project Requirements)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.1132 Tc
-1.2458 Tw
-(For your project, you need to implement code that is similar in function\
-ality to the Solaris TS)Tj
-0 -13.92 TD
-0.1128 Tc
--0.0954 Tw
-(scheduler, but your code does not have to be structured in the same way.\
-  Implement your code in)Tj
-0 -14.16 TD
-0.1186 Tc
--0.0253 Tw
-(whatever manner you find easiest when interfacing with the already exist\
-ing Nachos code. )Tj
-0 -24 TD
-0.0825 Tc
-0.2743 Tw
-(Specifically, you are not required to separate the class-independent and\
- class-dependent schedul-)Tj
-0 -13.92 TD
-0.1074 Tc
-0.6886 Tw
-(ing functionality.  You do not need to support multiple scheduling class\
-es.  You can implement)Tj
-T*
-0.13 Tc
-0.419 Tw
-(any routines that you feel are necessary, not just the seven functions w\
-e specifically listed.  You)Tj
-0 -14.16 TD
-0.1262 Tc
--0.0593 Tw
-(can pass any parameters that you find helpful.)Tj
-0 -24 TD
-0.068 Tc
-1.416 Tw
-(However, it is important that your approach be table-driven, with a user\
--configurable dispatch)Tj
-0 -13.92 TD
-0.1033 Tc
-0.154 Tw
-(table.  Your table should be initialized to the default values in Solari\
-s 2.6, but you may also want)Tj
-T*
-0.1348 Tc
-0.3492 Tw
-(to experiment with different configurations.  To demonstrate the functio\
-nality of your scheduler,)Tj
-0 -14.16 TD
-0.1051 Tc
-0.3089 Tw
-(you may want to print out the change in priorities of several different \
-competing processes, as in)Tj
-0 -13.92 TD
-0.0405 Tc
-0.1635 Tw
-(Figure 1.  )Tj
-ET
-1 1 1 rg
-150.96 432 315.12 225.12 re
-f 
-q
-315.12 0 0 225.12 150.96 432 cm
-BI
-       /Width 341
-       /Height 252
-       /BitsPerComponent 1
-       /ColorSpace /DeviceGray 
-       /Decode [1 0 ]
-       /DecodeParms [null <</K -1 
-/Columns 341 >> ]
-       /Filter [/ASCII85Decode /CCITTFaxDecode ]
-ID
--D5T@*#T_R#j@>3`c+g8+WV0Tfc1\<_$Ju0_BXXE`^^,YNXB)_TA[R+A:+?CLE*3A
-cXe*VS9']+%s"dE_M87$4L*'"XLs09$?CnbQ$-HLT#"/]6"dKqK-ifZ5c>5sGST*A
-('rsj";T%>n;8=KHk8UMj2""b-9Z<61Ch;jHNX\,"MoRQK%C,5ru2E%fMDO."onU]
-+Gu3`s1ub9s,ZeB^[OLe&3u1=s6("HM"grK#S\sY"mD"so%s^+Qf%]P?fV/rK.?p#
-+Ft&`5Q?BBE.8u%$H3'Q`#qF.A+CK[83)GJG\.lJa!%Pi]`\of!lcDINe/_LOL_]m
-&!;pG@$c]Ls8W-!s8W-!s8W-!q=Bu+i<ST,Jcn<6;#gM\C_RE#j;,QP/sd`E$c#&J
-*eL)L>`VE4_;c]*Bb0DMM!-%T7!Xl/FGMK.69hF'kn1c$V^i+[LEZ/f4es=0Jgc$"
-TKs19:e2-pJj=la*g7EP6jgsX?P&QdO0/kpj'fuadR0WVrK69;4jYG[j.JpS>f3A(
-,DM:660o.*j5@`^U#<`rTTYD?i].Et-ZFZ'+M#9hVNU`D77'>,BZOg+[iku9j>*GQ
-'KSVtLE-FMrV6U-#cAei.Re%_4@0#?4bB2ELH+JfLD68n.hFuP@0Al`J(NW\TKt8=
-jEqM9q&]_T#`:oC;kX@d-+2)cI"21rlnK)@c4U\SJgc,_?[r+5q?16r8KnS\TXnZQ
-=8p,\6f\*<fRL_j&1/P'5u#9?L\ull.ToN0A5UtW!X-Xd,REfq[=SP"+IYm1=Q(fO
-%<t_1'LAENW?_``;F+s07fqf1MKhQP&17o=Oj4M*_%\msq(^$ufgCWlPEn5L.gR13
-pCr2bVs,l6%tXsMJrfrJ&Q>?(Ud87/_(c7D8&9Zss00M:V1Kr9TuAUerWqQAJ"T7Q
-Jd<KN@9[<'&4<*\+9,h!FrLoN5>(:?ThEf^I"jmD^6;tZ6'aJr&,sQ[8VGVbYK,UT
-OouFHEMWG9CM]C&5nssK/dehE5ns!F&B#cJKNICb#V_E,Ml#I06'^AZ3Zs'P#X:r@
-&OV3`("E?lpdpA8&jZSBr<,ENGo[)#64uoWI4088q?\Z$oA5Zs";F0.7mR:#++bn]
-LXKT[$kC69s6(d9aUXM%`->K$#rf4Y<qI&uOAD`>V;S_6J!%WR4X(-KUd#-_2C,8C
-JZg:=+o**8aS.t34h*cg[A?H9J?K7\5qHu,'GZn#5nH/6k^!f*i?AMrTY2gIHkklK
-\Ju(C:dGVbJL%p*+I-@<Q$P]I'YPthdKC-Q^rZj)Jf-Ei3%ND`&>T5f#U"opJd;oT
-4:II*";!&H:cO-%";$WeJHR2&Uk0a[KQ6XI$%<FR$QqbDoR[3tLcllB5n'35`e"I-
-6^0Ug"HYnNW8#Zb!YBqqVp\*^qETWDK)HgD"@kaT6`$Ri+]6tA80C9[&4$FB"o:do
-*/<6^+@-8uVno1A&Po>k+JdU6d7NhZ#S;Y#s5q7N+IB9oNg(YPD-rre"<eB(=KqFr
-,WY41TRmjo"An1jKEr]P#_2Ju5qXD15lqF08.\.KOTKa!"aERmgRt@o,D)Hh&4$F]
-i%*4]&:t15*<]488e<KP_Ee;;+8ufo64dJu8s!/8O<B3!L3sa#!XL)!TQ*O+#V>eE
-O?jK*=X!Eg"??CG!XNl0&d/c!$F/"b+JYPc&4!2rjD\%nU(B]g5_026S-=./,Sq\W
-SKNM/*$C%/Jd<drJ?K7^#Z+Xe/0I=E!XM+qo10E9#V;)65p/R;(Z>LK;9t[s";8aG
-+B/pn"eEdUL99\gUcgImC')fh+ID:T+Fse`X8#+DYU#<$G(n#X5ls<'cp\F3:k)"Y
-5nVIL1,s##"G-tFNYEUi!rmoZ+UB7F_FPf83'ef$=`L5C+[KLfdKgD;&B#1$dRYYi
-&G1Q>M!-BKKFf7m&f_c/(%jirNY2I+TY2T^5nAX3#U/t.O<@,>8HK5_P!K0AJHX'X
-00pnFWX'70JHX'X0*DhP"Wp#U&2-Qc82!73#U"oP&d`kTNa[0(63quB+YQBUJg6r%
-":-:q8HK//qPZ[jTRd4[HmTg)JdWa2)PFT/59lhQNg%Ckq4!4i7QCpOaDHr)CiUJ)
-OP:b0d/F"Elp(O?s8O3R)\%&o80Fl71uQ_J:(IIbLHH-tZClrB)E:/G%9J3]TRd^E
-MKBCtF:h9PMKgO<4<R%>,+hHG-QOQRF\0qo3XmJ:ddXml^Bc"PJNs1O?6;Kr?`3o#
-lLGC&GVG#&L62/eI`#TeCc3+Qp)=,?2B*/LAfD2.6Qe+=*/7;Pj,QBUa>AoKq&Hmu
-Km3@RD`E`Z=QOg08&D@..Lfd^Ab2<1i.<2H8.\J4r/ZF85ob=[!XXOr&b&(?YYW@%
-"nipcr-Jo4s'bq9Da9GEs6rN#5`q)!hLP_3o9eLQJe3JDrX^7B@"eXb#X/eC_6,!c
-6']N,O7&?j^]XX&~>
-EI 
-Q
-BT
-286.08 414 TD
-0 0 0 rg
-/N8 12 Tf
--0.0086 Tc
-0.0326 Tw
-(Figure 2)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Trailer
-%%DocumentProcessColors: Cyan Magenta Yellow Black
-%%EOF
index 253f91b7226ccefd47241e6198548414c0198fae..2ac178042f8e50b7045e0624b0c21d374f961355 100644 (file)
@@ -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.
 
 the coarse job runs more frequently, it drops in priority at a faster
 rate than the other two jobs.
 
+@ifnottex
 @image{mlfqs1}
 @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
 
 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.
 
 the other applications, even though all three jobs require the same
 amount of time in a dedicated environment.
 
+@ifnottex
 @image{mlfqs2}
 @image{mlfqs2}
+@end ifnottex
+@iftex
+@image{mlfqs2, 3in}
+@end iftex
 
 @node Project Requirements
 @section Project Requirements
 
 @node Project Requirements
 @section Project Requirements
diff --git a/doc/pintos.texi b/doc/pintos.texi
new file mode 100644 (file)
index 0000000..1dd83fd
--- /dev/null
@@ -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 (file)
index b5b08f5..0000000
+++ /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
index 04d48d1c0eff50c96f56ecdeeb338382f970da5f..63aed6928bb287218bc9d7ce9a8458d924837e0e 100644 (file)
@@ -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
 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::       
 
 @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
 @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
 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
 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.
 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.
index ae9e74ebc177ee3c0cf28258a5d6d01e038d9faa..ee90cca0f55d22b0896bcc144a35416624655a8f 100644 (file)
@@ -204,7 +204,7 @@ threads to continue running.
 @end menu
 
 @node struct thread
 @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
 
 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
 grows downward from the end of the page.  It looks like this:
 
 @example
+@group
         4 kB +---------------------------------+
              |          kernel stack           |
              |                |                |
         4 kB +---------------------------------+
              |          kernel stack           |
              |                |                |
@@ -304,6 +305,7 @@ grows downward from the end of the page.  It looks like this:
              |               name              |
              |              status             |
         0 kB +---------------------------------+
              |               name              |
              |              status             |
         0 kB +---------------------------------+
+@end group
 @end example
 
 The upshot of this is twofold.  First, @struct{thread} must not be
 @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
 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})
 @end deftypefun
 
 @deftypefun void thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux})
index 72ab25615a4f05dad6f9d7eb0f93b72886372635..da9fe3d1774cc40d887f101149283f4d56fd6947 100644 (file)
@@ -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:
 
 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. */
 /* 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;
   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. */
 
 /* 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;
   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
 
 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
 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!}
 
 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
 @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,
 
 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}:
 
 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.|
 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
 
 @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
 
 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}.
index 4d495d4134eb7094946b75c88a9d85e28c325732..64619c8d4829430774d1aecfc5d8074b68851aa2 100644 (file)
@@ -131,6 +131,7 @@ address.
 @end enumerate
 
 @example
 @end enumerate
 
 @example
+@group
 32                    22                     12                      0
 +--------------------------------------------------------------------+
 | Page Directory Index |   Page Table Index   |    Page Offset       |
 32                    22                     12                      0
 +--------------------------------------------------------------------+
 | Page Directory Index |   Page Table Index   |    Page Offset       |
@@ -158,6 +159,7 @@ address.
        1|____________|  |   1|____________|  |     |____________|
        0|____________|  \__\0|____________|  \____\|____________|
                            /                      /
        1|____________|  |   1|____________|  |     |____________|
        0|____________|  \__\0|____________|  \____\|____________|
                            /                      /
+@end group
 @end example
 
 Header @file{threads/mmu.h} has useful functions for various
 @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}.
 
 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:
 
 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
 
 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
 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
 
 /* 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);
 @{
   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
 
 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
 then we can insert it into the hash table with:
 
 @example