From: Ben Pfaff
Date: Wed, 29 Sep 2004 04:07:15 +0000 (+0000)
Subject: Update docs.
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d7a2e337983d7a40b823ad181fda9f75f246d97;p=pintos-anon
Update docs.
---
diff --git a/doc/Makefile b/doc/Makefile
index 446b2b3..9e918bb 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -1,20 +1,40 @@
-TEXIS = projects.texi intro.texi tour.texi threads.texi mlfqs.texi \
+TEXIS = pintos.texi intro.texi tour.texi threads.texi mlfqs.texi \
userprog.texi vm.texi filesys.texi references.texi standards.texi \
doc.texi devel.texi debug.texi
-all: projects.html projects.info
+all: pintos.html pintos.info pintos.dvi pintos.ps pintos.pdf
-projects.html: $(TEXIS) mlfqs1.png mlfqs2.png
+pintos.html: $(TEXIS) mlfqs1.png mlfqs2.png
./texi2html -toc_file=$@ -split=chapter -nosec_nav -nomenu -init_file pintos-t2h.init -nonumber $<
-projects.info: $(TEXIS)
+pintos.info: $(TEXIS)
makeinfo $<
+pintos.dvi: $(TEXIS) mlfqs1.eps mlfqs2.eps
+ texi2dvi $< -o $@
+
+pintos.ps: pintos.dvi
+ dvips $< -o $@
+
+pintos.pdf: $(TEXIS) mlfqs1.pdf mlfqs2.pdf
+ texi2pdf $< -o $@
+
%.eps: %.jgr
(jgraph $< > $@.tmp && mv $@.tmp $@) || touch $@
%.png: %.eps
convert $< $@
+%.pdf: %.eps
+ epstopdf $< --outfile=$@
+
clean:
rm -f *.info *.html *.png
+ rm -f *.dvi *.pdf *.ps *.log
+ rm -rf WWW
+
+dist: pintos.html pintos.pdf
+ rm -rf WWW
+ mkdir WWW WWW/specs
+ cp *.html *.png *.pdf *.css WWW
+ (cd ../specs && cp -r *.pdf freevga kbd sysv-abi-update.html ../doc/WWW/specs)
diff --git a/doc/debug.texi b/doc/debug.texi
index d48e639..82f001f 100644
--- a/doc/debug.texi
+++ b/doc/debug.texi
@@ -16,7 +16,7 @@ introduces you to a few of them.
@end menu
@node printf
-@section @func{printf}
+@section @code{@code{printf()}}
Don't underestimate the value of @func{printf}. The way
@func{printf} is implemented in Pintos, you can call it from
diff --git a/doc/filesys.texi b/doc/filesys.texi
index da5f1e2..345183c 100644
--- a/doc/filesys.texi
+++ b/doc/filesys.texi
@@ -91,7 +91,7 @@ Modify the file system to allow the maximum size of a file to be as
large as the disk. You can assume that the disk will not be larger
than 8 MB. In the basic file system, each file is limited to a file
size of just under 64 kB. Each file has a header called an index node
-or @dfn{inode} (represented by @code{struct inode}) that is a table of
+or @dfn{inode} (represented by @struct{inode}) that is a table of
direct pointers to the disk blocks for that file. Since the inode is
stored in one disk sector, the maximum size of a file is limited by
the number of pointers that will fit in one disk sector. Increasing
@@ -293,9 +293,9 @@ No, @code{DISK_SECTOR_SIZE} is fixed at 512. This is a fixed property
of IDE disk hardware.
@item
-@b{Will the @code{struct inode} take up space on the disk too?}
+@b{Will the @struct{inode} take up space on the disk too?}
-Yes. Anything stored in @code{struct inode} takes up space on disk,
+Yes. Anything stored in @struct{inode} takes up space on disk,
so you must include this in your calculation of how many entires will
fit in a single disk sector.
@end enumerate
@@ -315,7 +315,7 @@ fit in a single disk sector.
The disk we create will be 8 MB or smaller. However, individual files
will have to be smaller than the disk to accommodate the metadata.
-You'll need to consider this when deciding your @code{struct inode}
+You'll need to consider this when deciding your @struct{inode}
organization.
@end enumerate
@@ -385,22 +385,22 @@ only be deleted if they are empty, as in Unix.
@enumerate 1
@item
@b{We're limited to a 64-block cache, but can we also keep a copy of
-each @code{struct inode} for an open file inside @code{struct file},
+each @struct{inode} for an open file inside @struct{file},
the way the stub code does?}
No, you shouldn't keep any disk sectors stored anywhere outside the
cache. That means you'll have to change the way the file
implementation accesses its corresponding inode right now, since it
-currently just creates a new @code{struct inode} in its constructor
+currently just creates a new @struct{inode} in its constructor
and reads the corresponding sector in from disk when it's created.
-There are two reasons for not storing inodes in @code{struct file}.
+There are two reasons for not storing inodes in @struct{file}.
First, keeping extra copies of inodes would be cheating the 64-block
limitation that we place on your cache. Second, if two processes have
the same file open, you will create a huge synchronization headache
-for yourself if each @code{struct file} has its own copy of the inode.
+for yourself if each @struct{file} has its own copy of the inode.
-Note that you can store pointers to inodes in @code{struct file} if
+Note that you can store pointers to inodes in @struct{file} if
you want, and you can store some other small amount of information to
help you find the inode when you need it.
@@ -408,13 +408,13 @@ Similarly, if you want to store one block of data plus some small
amount of metadata for each of your 64 cache entries, that's fine.
@item
-@b{But why can't we store copies of inodes in @code{struct file}? We
+@b{But why can't we store copies of inodes in @struct{file}? We
don't understand the answer to the previous question.}
-The issue regarding storing @code{struct inode}s has to do with
+The issue regarding storing @struct{inode}s has to do with
implementation of the buffer cache. Basically, you can't store a
-@code{struct inode *} in @code{struct inode}. Each time you need
-to read a @code{struct inode}, you'll have to get it either from the
+@code{struct inode *} in @struct{inode}. Each time you need
+to read a @struct{inode}, you'll have to get it either from the
buffer cache or from disk.
If you look at @func{file_read_at}, it uses the inode directly
diff --git a/doc/intro.texi b/doc/intro.texi
index 81b54fb..847eba4 100644
--- a/doc/intro.texi
+++ b/doc/intro.texi
@@ -9,10 +9,10 @@ project team will strengthen its support in all three of these areas.
You will also add a virtual memory implementation.
Pintos could, theoretically, run on a regular IBM-compatible PC. As
-fun as it might be, it is impractical to supply every student in CS
-140 with his or her own PC. Therefore, we will run Pintos projects in
-a PC simulator, that is, a program that simulates an 80@var{x}86 CPU
-and its peripheral devices well enough that unmodified operating
+much fun as it might be, it is impractical to supply every student in
+CS 140 with his or her own PC. Therefore, we will run Pintos projects
+in a PC simulator, that is, a program that simulates an 80@var{x}86
+CPU and its peripheral devices well enough that unmodified operating
systems and software can run under it. In class we will use the
@uref{http://bochs.sourceforge.net, , Bochs} simulator. Pintos has
also been tested within @uref{http://fabrice.bellard.free.fr/qemu/, ,
diff --git a/doc/mlfqs.pdf b/doc/mlfqs.pdf
deleted file mode 100644
index 8895088..0000000
Binary files a/doc/mlfqs.pdf and /dev/null differ
diff --git a/doc/mlfqs.ps b/doc/mlfqs.ps
deleted file mode 100644
index 0b1f527..0000000
--- a/doc/mlfqs.ps
+++ /dev/null
@@ -1,3313 +0,0 @@
-%!PS-Adobe-3.0
-%%Title: (Solaris)
-%%Version: 1 2
-%%CreationDate: (D:19981004210632)
-%%For: (Administrator)
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 2
-%%BoundingBox: 0 0 612 792
-%%Pages: 7
-%%DocumentProcessColors: (atend)
-%%DocumentSuppliedResources:
-%%+ font TimesNewRoman,Italic$2X1
-%%+ font CourierNew
-%%+ font TimesNewRoman,Bold$2X1
-%%+ font TimesNewRoman$2X1
-%%+ procset (Adobe Acrobat - PDF operators) 1.2 0
-%%+ procset (Adobe Acrobat - type operators) 1.2 0
-%%+ procset (Adobe Acrobat - general image support) 1.2 0
-%%+ procset (Adobe Acrobat - monochrome image support) 1.2 0
-%%EndComments
-%%BeginDefaults
-%%EndDefaults
-%%BeginProlog
-%%EndProlog
-%%BeginSetup
-%%BeginFile: l2check
-%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved.
-systemdict /languagelevel known
-{ systemdict /languagelevel get 1 eq }
-{ true }
-ifelse
-{
-initgraphics /Helvetica findfont 18 scalefont setfont
-72 600 moveto (Error: Your printer driver needs to be configured) dup show
-72 580 moveto (for printing to a PostScript Level 1 printer.) dup show
-exch = =
-/Helvetica-Bold findfont 16 scalefont setfont
-72 520 moveto (Windows and Unix) show
-/Times-Roman findfont 16 scalefont setfont
-72 500 moveto (Select ªLevel 1º in the PostScript options section) show
-72 480 moveto (of the Acrobat Exchange or Reader print dialog.) show
-/Helvetica-Bold findfont 16 scalefont setfont
-72 440 moveto (Macintosh) show
-/Times-Roman findfont 16 scalefont setfont
-72 420 moveto (In the Chooser, select your printer driver.) show
-72 400 moveto (Then select your printer and click the Setup button.) show
-72 380 moveto (Follow any on-screen dialogs that may appear.) show
-showpage
-quit
-}
-if
-%%EndFile
-/currentpacking where{pop currentpacking true setpacking}if
-userdict /PDF 85 dict put
-%%BeginFile: pdfvars.prc
-%%Copyright: Copyright 1987-1996 Adobe Systems Incorporated. All Rights Reserved.
-userdict /PDFVars 75 dict dup begin put
-/_save 0 def
-/_cshow 0 def
-/InitAll 0 def
-/TermAll 0 def
-/_lp /none def
-/_doClip 0 def
-/sfc 0 def
-/_sfcs 0 def
-/_sfc 0 def
-/ssc 0 def
-/_sscs 0 def
-/_ssc 0 def
-/_fcs 0 def
-/_scs 0 def
-/_fp 0 def
-/_sp 0 def
-/_f0 0 array def
-/_f1 1 array def
-/_f3 3 array def
-/_f4 4 array def
-/_fc null def
-/_s0 0 array def
-/_s1 1 array def
-/_s3 3 array def
-/_s4 4 array def
-/_sc null def
-/_cpcf null def
-/_cpcs null def
-/_inT false def
-/_tr -1 def
-/_rise 0 def
-/_ax 0 def
-/_cx 0 def
-/_ld 0 def
-/_tm matrix def
-/_ctm matrix def
-/_mtx matrix def
-/_hy (-) def
-/_fScl 0 def
-/_hs 1 def
-/_pdfEncodings 2 array def
-/_baselineadj 0 def
-/_Tj 0 def
-/_italMtx[1 0 .212557 1 0 0]def
-/_italMtx_WMode1 [1 -.212557 0 1 0 0]def
-/_basefont 0 def
-/_basefonto 0 def
-/_pdf_oldCIDInit null def
-/_categories 10 dict def
-/_sa? true def
-/_op? false def
-/_ColorSep5044? false def
-/_tmpcolr? [] def
-/_tmpop? {} def
-end
-%%EndFile
-PDFVars begin PDF begin
-%%BeginFile: pdfutil.prc
-%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved.
-/bd {bind def} bind def
-/ld {load def} bd
-/dd { PDFVars 3 1 roll put } bd
-/xdd { exch dd } bd
-/Level2?
-systemdict /languagelevel known
-{ systemdict /languagelevel get 2 ge } { false } ifelse
-def
-/here {
-dup currentdict exch known
-{ currentdict exch get true }
-{ pop false }
-ifelse
-} bd
-/isdefined? { where { pop true } { false } ifelse } bd
-/StartLoad { dup dup not { /_save save dd } if } bd
-/EndLoad { if not { _save restore } if } bd
-/npop { { pop } repeat } bd
-%%EndFile
-%%BeginFile: pdf.prc
-%%Copyright: Copyright 1987-1996 Adobe Systems Incorporated. All Rights Reserved.
-/initialize {
-_ColorSep5044? {sep_ops begin 50 dict begin} if
-newpath
-} bd
-/terminate {
-_ColorSep5044? {end end} if
-} bd
-Level2? StartLoad
-{ /m/moveto ld
-/l/lineto ld
-/c/curveto ld
-/setSA/setstrokeadjust ld
-} EndLoad
-Level2? not StartLoad
-{
-/pl {
-transform
-0.25 sub round 0.25 add exch
-0.25 sub round 0.25 add exch
-itransform
-} bd
-/m { _sa? { pl } if moveto } bd
-/l { _sa? { pl } if lineto } bd
-/c { _sa? { pl } if curveto } bd
-/setSA { /_sa? xdd } bd
-} EndLoad
-/v { currentpoint 6 2 roll c } bd
-/y { 2 copy c } bd
-/h/closepath ld
-/d/setdash ld
-/j/setlinejoin ld
-/J/setlinecap ld
-/M/setmiterlimit ld
-/w/setlinewidth ld
-/cf currentflat def
-/i {
-dup 0 eq { pop cf } if
-setflat
-} bd
-/ilp { /_lp /none dd } bd
-/sfc {
-_lp /fill ne {
-_sfcs
-_sfc
-/_lp /fill dd
-} if
-} dd
-/ssc {
-_lp /stroke ne {
-_sscs
-_ssc
-/_lp /stroke dd
-} if
-} dd
-/n {
-_doClip 1 ge {
-_doClip 1 eq { clip } { eoclip } ifelse
-/_doClip 0 dd
-} if
-newpath
-} bd
-/f {
-_doClip 1 ge
-{
-gsave sfc fill grestore
-_doClip 1 eq { clip } { eoclip } ifelse
-newpath
-ilp
-/_doClip 0 dd
-}
-{ sfc fill }
-ifelse
-} bd
-/f* {
-_doClip 1 ge
-{
-gsave sfc eofill grestore
-_doClip 1 eq { clip } { eoclip } ifelse
-newpath
-ilp
-/_doClip 0 dd
-}
-{ sfc eofill }
-ifelse
-} bd
-/S {
-_doClip 1 ge
-{
-gsave ssc stroke grestore
-_doClip 1 eq { clip } { eoclip } ifelse
-newpath
-ilp
-/_doClip 0 dd
-}
-{ ssc stroke }
-ifelse
-} bd
-/s { h S } bd
-/B {
-_doClip dup 1 ge
-gsave f grestore
-{
-gsave S grestore
-1 eq { clip } { eoclip } ifelse
-newpath
-ilp
-/_doClip 0 dd
-}
-{ pop S }
-ifelse
-} bd
-/b { h B } bd
-/B* {
-_doClip dup 1 ge
-gsave f* grestore
-{
-gsave S grestore
-1 eq { clip } { eoclip } ifelse
-newpath
-ilp
-/_doClip 0 dd
-}
-{ pop S }
-ifelse
-} bd
-/b* { h B* } bd
-/W { /_doClip 1 dd } bd
-/W* { /_doClip 2 dd } bd
-/q/save ld
-/Q { restore ilp } bd
-Level2? StartLoad
-{ /defineRes/defineresource ld
-/findRes/findresource ld
-currentglobal
-true systemdict /setglobal get exec
-[/Function /ExtGState /Form]
-{ /Generic /Category findresource dup length dict copy /Category defineresource pop }
-forall
-systemdict /setglobal get exec
-} EndLoad
-Level2? not StartLoad
-{ /AlmostFull?
-{ dup maxlength exch length sub 2 le
-} bind def
-/Expand
-{ 1 index maxlength mul cvi dict
-dup begin exch { def } forall end
-} bind def
-/xput
-{ 3 2 roll
-dup 3 index known not
-{ dup AlmostFull? { 1.5 Expand } if
-} if
-dup 4 2 roll put
-} bind def
-/defineRes
-{ _categories 1 index known not
-{ /_categories _categories 2 index 10 dict xput store
-} if
-_categories exch 2 copy get 5 -1 roll 4 index xput put
-} bind def
-/findRes
-{ _categories exch get exch get
-} bind def
-} EndLoad
-/cs
-{
-dup where { pop load } if
-dup /_fcs xdd
-ucs
-_cpcf exch get
-/_fc xdd
-/_fp null dd
-} bd
-/CS
-{
-dup where { pop load } if
-dup /_scs xdd ucs _cpcs exch get /_sc xdd /_sp null dd
-} bd
-/ucs {
-dup type /arraytype eq
-{ dup 0 get
-dup /Indexed eq
-{ pop 0 get }
-{ /Pattern eq
-{ dup length 2 eq
-{ 1 get ucs }
-{ 0 get }
-ifelse }
-{ 0 get }
-ifelse }
-ifelse }
-if }
-bd
-/_cpcf
-15 dict dup begin
-/DefaultGray _f1 def
-/DeviceGray _f1 def
-/DefaultRGB _f3 def
-/DeviceRGB _f3 def
-/DeviceCMYK _f4 def
-/CalGray _f1 def
-/CalRGB _f3 def
-/CalCMYK _f4 def
-/Lab _f3 def
-/Pattern _f0 def
-/Indexed _f1 def
-/Separation _f1 def
-/CIEBasedA _f1 def
-/CIEBasedABC _f3 def
-end
-dd
-/_cpcs
-15 dict dup begin
-/DefaultGray _s1 def
-/DeviceGray _s1 def
-/DefaultRGB _s3 def
-/DeviceRGB _s3 def
-/DeviceCMYK _s4 def
-/CalGray _s1 def
-/CalRGB _s3 def
-/CalCMYK _s4 def
-/Lab _s3 def
-/Pattern _s0 def
-/Indexed _s1 def
-/Separation _s1 def
-/CIEBasedA _s1 def
-/CIEBasedABC _s3 def
-end
-dd
-Level2? not StartLoad {
-/ri/pop ld
-/makePat/pop ld
-} EndLoad
-Level2? StartLoad {
-/ri
-{
-/findcolorrendering isdefined?
-{
-mark exch
-findcolorrendering
-counttomark 2 eq
-{ type /booleantype eq
-{ dup type /nametype eq
-{ dup /ColorRendering resourcestatus
-{ pop pop
-dup /DefaultColorRendering ne
-{
-/ColorRendering findresource
-setcolorrendering
-} if
-} if
-} if
-} if
-} if
-cleartomark
-}
-{ pop
-} ifelse
-} bd
-/makePat /makepattern ld
-} EndLoad
-Level2? not _ColorSep5044? or StartLoad
-{
-/L1setcolor {
-aload length
-dup 0 eq
-{ pop .5 setgray }
-{ dup 1 eq
-{ pop setgray }
-{ 3 eq
-{ setrgbcolor }
-{ setcmykcolor }
-ifelse }
-ifelse }
-ifelse
-} bind dd
-/_sfcs { } dd
-/_sscs { } dd
-} EndLoad
-Level2? not _ColorSep5044? not and StartLoad
-{
-/_sfc { _fc L1setcolor } dd
-/_ssc { _sc L1setcolor } dd
-} EndLoad
-Level2? _ColorSep5044? not and StartLoad
-{
-/_sfcs
-{
-_fcs setcolorspace
-} bind dd
-/_sscs
-{
-_scs setcolorspace
-} bind dd
-/_sfc
-{
-_fc aload pop
-_fp null eq
-{ setcolor }
-{ _fp setpattern }
-ifelse
-} bind dd
-/_ssc
-{
-_sc aload pop
-_sp null eq { setcolor } { _sp setpattern } ifelse
-} bind dd
-} EndLoad
-/sc
-{
-_fc astore pop
-ilp
-} bd
-/SC
-{
-_sc astore pop
-ilp
-} bd
-/scn {
-dup type /dicttype eq
-{ dup /_fp xdd
-/PaintType get 1 eq
-{ /_fc _f0 dd ilp }
-{ /_fc _cpcf _fcs ucs get dd
-sc }
-ifelse }
-{ sc }
-ifelse
-} bd
-/SCN {
-dup type /dicttype eq
-{ dup /_sp xdd
-/PaintType get 1 eq
-{ /_sc _s0 dd ilp }
-{ /_sc _cpcs _scs ucs get dd
-SC }
-ifelse }
-{ SC }
-ifelse
-} bd
-/g { /DefaultGray cs sc } bd
-/rg { /DefaultRGB cs sc } bd
-/k { /DeviceCMYK cs sc } bd
-/G { /DefaultGray CS SC } bd
-/RG { /DefaultRGB CS SC } bd
-/K { /DeviceCMYK CS SC } bd
-/cm { _mtx astore concat } bd
-/re {
-4 2 roll m
-1 index 0 rlineto
-0 exch rlineto
-neg 0 rlineto
-h
-} bd
-/RC/rectclip ld
-/EF/execform ld
-/PS { cvx exec } bd
-/initgs {
-/DefaultGray where
-{ pop }
-{ /DefaultGray /DeviceGray dd }
-ifelse
-/DefaultRGB where
-{ pop }
-{ /DefaultRGB /DeviceRGB dd }
-ifelse
-0 g 0 G
-[] 0 d 0 j 0 J 10 M 1 w
-true setSA
-} bd
-21 dict dup begin
-/CosineDot
-{ 180 mul cos exch 180 mul cos add 2 div } bd
-/Cross
-{ abs exch abs 2 copy gt { exch } if pop neg } bd
-/Diamond
-{ abs exch abs 2 copy add .75 le
-{ dup mul exch dup mul add 1 exch sub }
-{ 2 copy add 1.23 le
-{ .85 mul add 1 exch sub }
-{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
-ifelse }
-ifelse } bd
-/Double
-{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } bd
-/DoubleDot
-{ 2 { 360 mul sin 2 div exch } repeat add } bd
-/Ellipse
-{ abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt
-{ pop dup mul exch .75 div dup mul add 4 div
-1 exch sub }
-{ dup 1 gt
-{pop 1 exch sub dup mul exch 1 exch sub
-.75 div dup mul add 4 div 1 sub }
-{ .5 exch sub exch pop exch pop }
-ifelse }
-ifelse } bd
-/EllipseA
-{ dup mul .9 mul exch dup mul add 1 exch sub } bd
-/EllipseB
-{ dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } bd
-/EllipseC
-{ dup .5 gt { 1 exch sub } if
-dup .25 ge
-{ .5 exch sub 4 mul dup mul 1 sub }
-{ 4 mul dup mul 1 exch sub }
-ifelse
-exch
-dup .5 gt { 1 exch sub } if
-dup .25 ge
-{ .5 exch sub 4 mul dup mul 1 sub }
-{ 4 mul dup mul 1 exch sub }
-ifelse
-add -2 div } bd
-/InvertedDouble
-{ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg } bd
-/InvertedDoubleDot
-{ 2 { 360 mul sin 2 div exch } repeat add neg } bd
-/InvertedEllipseA
-{ dup mul .9 mul exch dup mul add 1 sub } bd
-/InvertedSimpleDot
-{ dup mul exch dup mul add 1 sub } bd
-/Line
-{ exch pop abs neg } bd
-/LineX
-{ pop } bd
-/LineY
-{ exch pop } bd
-/Rhomboid
-{ abs exch abs 0.9 mul add 2 div } bd
-/Round
-{ abs exch abs 2 copy add 1 le
-{ dup mul exch dup mul add 1 exch sub }
-{ 1 sub dup mul exch 1 sub dup mul add 1 sub }
-ifelse } bd
-/SimpleDot
-{ dup mul exch dup mul add 1 exch sub } bd
-/Square
-{ abs exch abs 2 copy lt { exch } if pop neg } bd
-end
-{ /Function defineRes pop } forall
-/Identity {} /Function defineRes pop
-_ColorSep5044? StartLoad {
-/_defaulttransferfunc currenttransfer def
-/currentcolortransfer where
-{ pop /_defaultcolortransferfuncs [ currentcolortransfer ] def }
-if
-/concattransferfuncs {
-[ 3 1 roll /exec load exch /exec load ] cvx
-} bd
-/concatandsettransfer {
-/_defaulttransferfunc load concattransferfuncs settransfer
-} bd
-/concatandsetcolortransfer {
-colorplate 0 eq
-{
-_defaultcolortransferfuncs aload pop
-8 -1 roll 5 -1 roll concattransferfuncs 7 1 roll
-6 -1 roll 4 -1 roll concattransferfuncs 5 1 roll
-4 -1 roll 3 -1 roll concattransferfuncs 3 1 roll
-concattransferfuncs
-setcolortransfer
-} if
-colorplate 1 ge colorplate 4 le and
-{
-4 colorplate sub index 4 { exch pop } repeat
-concatandsettransfer
-} if
-colorplate 5 ge
-{
-0 index 4 { exch pop } repeat
-concatandsettransfer
-} if
-} bd
-/tn5044sethalftone
-{
-begin
-HalftoneType 5 eq
-{ [/Default /Cyan /Magenta /Yellow /Black /Default /Default /Default]
-colorplate get
-here not {
-/Default here not { currentdict } if
-} if
-}
-{ currentdict }
-ifelse
-end
-begin
-/TransferFunction here
-{
-concatandsettransfer
-currentdict dup length dict
-begin
-{
-1 index /TransferFunction ne { def } { pop pop } ifelse
-} forall
-currentdict
-end
-}
-{
-currentdict
-} ifelse
-end
-sethalftone
-} bd
-} EndLoad
-Level2? StartLoad {
-/gs
-{
-begin
-/SA here { setstrokeadjust } if
-/OP here { setoverprint } if
-/BG here { setblackgeneration } if
-/UCR here { setundercolorremoval } if
-/TR here
-{
-_ColorSep5044?
-{
-dup xcheck
-{ concatandsettransfer }
-{ aload pop concatandsetcolortransfer }
-ifelse
-}
-{
-dup xcheck
-{ settransfer }
-{ aload pop setcolortransfer }
-ifelse
-} ifelse
-} if
-/sethalftonephase isdefined? { /HTP here { sethalftonephase } if } if
-/HT here
-{ _ColorSep5044?
-{ tn5044sethalftone }
-{ sethalftone }
-ifelse
-} if
-end
-} bd
-/_defaulthalftone currenthalftone def
-} EndLoad
-Level2? not StartLoad {
-/gs
-{
-begin
-/SA here { /_sa? xdd } if
-/OP here { dup /_op? xdd
-/setoverprint where {pop setoverprint}
-{pop} ifelse
-} if
-/TR here
-{
-_ColorSep5044?
-{ dup xcheck
-{ concatandsettransfer }
-{ aload pop concatandsetcolortransfer }
-ifelse
-}
-{ dup xcheck
-{ settransfer }
-{ aload pop setcolortransfer }
-ifelse
-} ifelse
-} if
-/HT here
-{ _ColorSep5044?
-{ tn5044sethalftone }
-{ sethalftone }
-ifelse
-} if
-end
-} bd
-5 dict dup
-begin
-currentscreen 1 [/HalftoneType /SpotFunction /Angle /Frequency ]
-{ exch def } forall
-end
-/_defaulthalftone exch def
-} EndLoad
-/int {
-dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul
-exch pop add exch pop
-} bd
-/limit {
-dup 2 index le { exch } if pop
-dup 2 index ge { exch } if pop
-} bd
-_ColorSep5044? StartLoad {
-/_sfc
-{
-_fp null eq
-{ _fcs type /arraytype eq
-{_fcs 0 get /Separation eq
-{
-_fcs 1 get /All eq
-{
-_fc aload pop 1 exch sub
-/setseparationgray where pop begin setseparationgray end
-}
-{
-1 _fcs 3 get exec _fcs 1 get
-/findcmykcustomcolor where pop begin findcmykcustomcolor end
-_fc aload pop
-/setcustomcolor where pop begin setcustomcolor end
-}
-ifelse
-}
-{ _fc L1setcolor }
-ifelse
-}
-{ _fc L1setcolor }
-ifelse
-}
-{ _fc L1setcolor }
-ifelse
-} bind dd
-/_ssc
-{
-_sp null eq
-{ _scs type /arraytype eq
-{_scs 0 get /Separation eq
-{
-_scs 1 get /All eq
-{
-_sc aload pop 1 exch sub
-/setseparationgray where pop begin setseparationgray end
-}
-{
-1 _scs 3 get exec _scs 1 get
-/findcmykcustomcolor where pop begin findcmykcustomcolor end
-_sc aload pop
-/setcustomcolor where pop begin setcustomcolor end
-}
-ifelse
-}
-{ _sc L1setcolor }
-ifelse
-}
-{ _sc L1setcolor }
-ifelse
-}
-{ _sc L1setcolor }
-ifelse
-} bind dd
-} EndLoad
-%%EndFile
-%%BeginFile: pdftext.prc
-%%Copyright: Copyright 1987-1997 Adobe Systems Incorporated. All Rights Reserved.
-PDF /PDFText 65 dict dup begin put
-/initialize { PDFText begin } bd
-/terminate { end } bd
-/pdf_has_composefont? systemdict /composefont known def
-/CopyFont {
-{
-1 index /FID ne 2 index /UniqueID ne and
-{ def } { pop pop } ifelse
-} forall
-} bd
-/Type0CopyFont
-{
-exch
-dup length dict
-begin
-CopyFont
-[
-exch
-FDepVector
-{
-dup /FontType get 0 eq
-{
-1 index Type0CopyFont
-/_pdfType0 exch definefont
-}
-{
-/_pdfBaseFont exch
-2 index exec
-}
-ifelse
-exch
-}
-forall
-pop
-]
-/FDepVector exch def
-currentdict
-end
-} bd
-/cHexEncoding
-[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12
-/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25
-/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38
-/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B
-/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E
-/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71
-/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84
-/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97
-/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA
-/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD
-/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0
-/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3
-/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6
-/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def
-/modEnc {
-/_enc xdd
-/_icode 0 dd
-counttomark 1 sub -1 0
-{
-index
-dup type /nametype eq
-{
-_enc _icode 3 -1 roll put
-_icode 1 add
-}
-if
-/_icode xdd
-} for
-cleartomark
-_enc
-} bd
-/trEnc {
-/_enc xdd
-255 -1 0 {
-exch dup -1 eq
-{ pop /.notdef }
-{ Encoding exch get }
-ifelse
-_enc 3 1 roll put
-} for
-pop
-_enc
-} bd
-/TE {
-/_i xdd
-StandardEncoding 256 array copy modEnc
-_pdfEncodings exch _i exch put
-} bd
-/TZ
-{
-/_usePDFEncoding xdd
-findfont
-dup length 2 add dict
-begin
-{
-1 index /FID ne { def } { pop pop } ifelse
-} forall
-/FontName exch def
-_usePDFEncoding 0 ge
-{
-/Encoding _pdfEncodings _usePDFEncoding get def
-pop
-}
-{
-_usePDFEncoding -1 eq
-{
-counttomark 0 eq
-{ pop }
-{
-Encoding 256 array copy
-modEnc /Encoding exch def
-}
-ifelse
-}
-{
-256 array
-trEnc /Encoding exch def
-}
-ifelse
-}
-ifelse
-FontName currentdict
-end
-definefont pop
-}
-bd
-/Level2?
-systemdict /languagelevel known
-{systemdict /languagelevel get 2 ge}
-{false}
-ifelse
-def
-Level2?
-{
-/_pdfFontStatus
-{
-currentglobal exch
-/Font resourcestatus
-{pop pop true}
-{false}
-ifelse
-exch setglobal
-} bd
-}
-{
-/_pdfFontStatusString 50 string def
-_pdfFontStatusString 0 (fonts/) putinterval
-/_pdfFontStatus
-{
-_pdfFontStatusString 6 42 getinterval
-cvs length 6 add
-_pdfFontStatusString exch 0 exch getinterval
-status
-{ pop pop pop pop true}
-{ false }
-ifelse
-} bd
-}
-ifelse
-Level2?
-{
-/_pdfCIDFontStatus
-{
-/CIDFont /Category resourcestatus
-{
-pop pop
-/CIDFont resourcestatus
-{pop pop true}
-{false}
-ifelse
-}
-{ pop false }
-ifelse
-} bd
-}
-if
-/_pdfString100 100 string def
-/_pdfComposeFontName
-{
-dup length 1 eq
-{
-0 get
-1 index
-type /nametype eq
-{
-_pdfString100 cvs
-length dup dup _pdfString100 exch (-) putinterval
-_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
-2 index exch cvs length
-add 1 add _pdfString100 exch 0 exch getinterval
-exch pop
-true
-}
-{
-pop pop
-false
-}
-ifelse
-}
-{
-false
-}
-ifelse
-} bd
-pdf_has_composefont?
-{
-/_pdfComposeFont
-{
-1 index /CMap resourcestatus
-{pop pop true}
-{false}
-ifelse
-1 index true exch
-{
-_pdfCIDFontStatus not
-{pop false exit}
-if
-}
-forall
-and
-{ 3 -1 roll pop composefont true}
-{
-4 -1 roll pop
-_pdfComposeFontName
-{
-dup _pdfFontStatus
-{ findfont definefont true }
-{
-pop
-dup _pdfFontStatus
-{ findfont true }
-{ pop false }
-ifelse
-}
-ifelse
-}
-{
-dup _pdfFontStatus
-{ findfont true }
-{ pop false }
-ifelse
-}
-ifelse
-}
-ifelse
-} bd
-}
-{
-/_pdfComposeFont
-{
-4 -1 roll pop
-_pdfComposeFontName not
-{
-dup
-}
-if
-2 copy _pdfFontStatus
-{pop findfont exch pop true}
-{
-eq
-{pop false}
-{
-dup _pdfFontStatus
-{findfont true}
-{pop false}
-ifelse
-}
-ifelse
-}
-ifelse
-} bd
-}
-ifelse
-/_pdfFaceByStyleDict 4 dict dup begin
-Level2?
-{
-/Serif
-/HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus
-{/HeiseiMin-W3}
-{/Ryumin-Light}
-ifelse
-def
-/SansSerif
-/HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus
-{/HeiseiKakuGo-W5}
-{/GothicBBB-Medium}
-ifelse
-def
-/HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus
-{/HeiseiMaruGo-W4}
-{
-/Jun101-Light-RKSJ-H _pdfFontStatus
-{ /Jun101-Light }
-{ SansSerif }
-ifelse
-}
-ifelse
-/RoundSansSerif exch def
-/Default Serif def
-}
-{
-/Serif /Ryumin-Light def
-/SansSerif /GothicBBB-Medium def
-{
-(fonts/Jun101-Light-83pv-RKSJ-H) status
-}stopped
-{pop}{
-{ pop pop pop pop /Jun101-Light }
-{ SansSerif }
-ifelse
-/RoundSansSerif exch def
-}ifelse
-/Default Serif def
-}
-ifelse
-end
-def
-/_pdf_Adobe-Japan1-2 (Adobe-Japan1-2) def
-/_pdfConcatNames
-{
-exch
-_pdfString100 cvs
-length dup dup _pdfString100 exch (-) putinterval
-_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval
-3 -1 roll exch cvs length
-add 1 add _pdfString100 exch 0 exch getinterval
-} bind def
-/_pdfSubSetFontByStyleDict 4 dict dup begin
-_pdfFaceByStyleDict
-{
-_pdf_Adobe-Japan1-2 _pdfConcatNames
-dup _pdfFontStatus
-{ def }
-{
-{
-pop
-dup /SansSerif eq
-{
-/HeiseiKakuGo-W5-Adobe-Japan1-2 dup _pdfFontStatus
-{ def exit }
-{ pop }
-ifelse
-}
-if
-dup /Serif eq
-{
-/HeiseiMin-W3-Adobe-Japan1-2 dup _pdfFontStatus
-{ def exit }
-{ pop }
-ifelse
-}
-if
-pop exit
-}
-loop
-}
-ifelse
-}
-forall
-end def
-/TZzero
-{
-/_fyAdj xdd
-/_wmode xdd
-/_styleArr xdd
-4 copy
-_pdfComposeFont
-{exch pop exch pop exch pop}
-{
-[
-0 1 _styleArr length 1 sub
-{
-_styleArr exch get
-_pdfFaceByStyleDict exch 2 copy known not
-{ pop /Default }
-if
-get
-}
-for
-]
-exch pop
-3 index 3 index 4 2 roll
-_pdfComposeFont
-{exch pop}
-{
-findfont
-}
-ifelse
-}
-ifelse
-dup /FontType get 3 eq _wmode 1 eq and
-{
-_pdfVerticalRomanT3Font dup length dict copy
-begin
-/_basefont exch def
-/Encoding _basefont /Encoding get def
-}
-{
-dup length 2 add dict
-begin
-{1 index /FID ne {def}{pop pop} ifelse }
-forall
-} ifelse
-/WMode _wmode def
-/BaseLineAdj _fyAdj def
-FontType 0 ne
-{
-/Encoding Encoding dup length array copy dup 16#5c /yen put def
-/_fauxfont true def
-} if
-currentdict
-end
-definefont pop
-}
-bd
-/swj {
-dup 4 1 roll
-dup length exch stringwidth
-exch 5 -1 roll 3 index mul add
-4 1 roll 3 1 roll mul add
-6 2 roll /_cnt 0 dd
-{1 index eq {/_cnt _cnt 1 add dd} if} forall pop
-exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
-} bd
-/jss {
-4 1 roll
-{
-2 npop
-(0) exch 2 copy 0 exch put
-gsave
-32 eq
-{
-exch 6 index 6 index 6 index 5 -1 roll widthshow
-currentpoint
-}
-{
-false charpath currentpoint
-4 index setmatrix stroke
-}
-ifelse
-grestore
-moveto
-2 copy rmoveto
-} exch cshow
-6 npop
-} def
-/jsfTzero {
-{
-2 npop
-(0) exch 2 copy 0 exch put
-exch show
-32 eq
-{
-4 index 4 index rmoveto
-}
-if
-2 copy rmoveto
-} exch cshow
-5 npop
-} def
-/jsp
-{
-{
-2 npop
-(0) exch 2 copy 0 exch put
-32 eq
-{ exch 5 index 5 index 5 index 5 -1 roll widthshow }
-{ false charpath }
-ifelse
-2 copy rmoveto
-} exch cshow
-5 npop
-} bd
-/trj { _cx 0 fWModeProc 32 _ax 0 fWModeProc 6 5 roll } bd
-/pjsf { trj sfc fawidthshowProc } bd
-/pjss { trj _ctm ssc jss } bd
-/pjsc { trj jsp } bd
-/_Tjdef [
-/pjsf load
-/pjss load
-{
-dup
-currentpoint 3 2 roll
-pjsf
-newpath moveto
-pjss
-} bind
-{
-trj swj rmoveto
-} bind
-{
-dup currentpoint 4 2 roll gsave
-pjsf
-grestore 3 1 roll moveto
-pjsc
-} bind
-{
-dup currentpoint 4 2 roll
-currentpoint gsave newpath moveto
-pjss
-grestore 3 1 roll moveto
-pjsc
-} bind
-{
-dup currentpoint 4 2 roll gsave
-dup currentpoint 3 2 roll
-pjsf
-newpath moveto
-pjss
-grestore 3 1 roll moveto
-pjsc
-} bind
-/pjsc load
-] def
-/BT
-{
-/_inT true dd
-_ctm currentmatrix pop matrix _tm copy pop
-0 _rise _baselineadj add translate _hs 1 scale
-0 0 moveto
-} bd
-/ET
-{
-/_inT false dd
-_tr 3 gt {clip} if
-_ctm setmatrix newpath
-} bd
-/Tr {
-_inT { _tr 3 le {currentpoint newpath moveto} if } if
-dup /_tr xdd
-_Tjdef exch get /_Tj xdd
-} bd
-/Tj {
-userdict /$$copystring 2 index put
-_Tj
-} bd
-/iTm { _ctm setmatrix _tm concat 0 _rise _baselineadj add translate _hs 1 scale } bd
-/Tm { _tm astore pop iTm 0 0 moveto } bd
-/Td { _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto } bd
-/TD { dup /_ld xdd Td } bd
-/_nullProc {} bd
-/Tf {
-dup 1000 div /_fScl xdd
-exch findfont dup
-/_nullProc exch
-/WMode known
-{
-1 index /WMode get 1 eq
-{pop /exch}
-if
-}
-if
-load /fWModeProc xdd
-dup
-/FontType get 0 eq dup _cx 0 ne and
-{ /jsfTzero }
-{ /awidthshow }
-ifelse
-load /fawidthshowProc xdd
-/_fTzero xdd
-dup /BaseLineAdj known
-{ dup /BaseLineAdj get _fScl mul }
-{ 0 }
-ifelse
-/_baselineadj xdd
-currentpoint iTm moveto
-exch scalefont setfont
-} bd
-/TL { neg /_ld xdd } bd
-/Tw {
-/_cx xdd
-_cx 0 ne _fTzero and
-{ /jsfTzero }
-{ /awidthshow }
-ifelse
-load /fawidthshowProc xdd
-} bd
-/Tc { /_ax xdd } bd
-/Ts { /_rise xdd currentpoint iTm moveto } bd
-/Tz { 100 div /_hs xdd iTm } bd
-/Tk { exch pop _fScl mul neg 0 fWModeProc rmoveto } bd
-/T* { 0 _ld Td } bd
-/' { T* Tj } bd
-/" { exch Tc exch Tw ' } bd
-/TJ {
-{
-dup type /stringtype eq
-{ Tj }
-{ 0 exch Tk }
-ifelse
-} forall
-} bd
-/T- { _hy Tj } bd
-/d0/setcharwidth ld
-/d1 { setcachedevice /sfc{}dd /ssc{}dd } bd
-/nND {{/.notdef} repeat} bd
-/T3Defs {
-/BuildChar
-{
-1 index /Encoding get exch get
-1 index /BuildGlyph get exec
-}
-def
-/BuildGlyph {
-exch begin
-GlyphProcs exch get exec
-end
-} def
-} bd
-/_pdfBoldRomanWidthProc
-{
-stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth
-} bd
-/_pdfType0WidthProc
-{
-dup stringwidth 0 0 moveto
-2 index true charpath pathbbox
-0 -1
-7 index 2 div .88
-setcachedevice2
-pop
-} bd
-/_pdfBoldBaseFont
-10 dict begin
-/FontType 3 def
-/FontMatrix[1 0 0 1 0 0]def
-/FontBBox[0 0 1 1]def
-/Encoding cHexEncoding def
-/_setwidthProc /_pdfBoldRomanWidthProc load def
-/_bcstr1 1 string def
-/BuildChar
-{
-exch begin
-_basefont setfont
-_bcstr1 dup 0 4 -1 roll put
-dup
-_setwidthProc
-0 0 moveto
-dup show
-_basefonto setfont
-0 0 moveto
-show
-end
-}bd
-currentdict
-end
-def
-/_pdfVerticalRomanT3Font
-10 dict begin
-/FontType 3 def
-/FontMatrix[1 0 0 1 0 0]def
-/FontBBox[0 0 1 1]def
-/_bcstr1 1 string def
-/BuildChar
-{
-exch begin
-_basefont setfont
-_bcstr1 dup 0 4 -1 roll put
-dup
-_pdfType0WidthProc
-0 0 moveto
-show
-end
-}bd
-currentdict
-end
-def
-/MakeBoldFont
-{
-dup dup length 2 add dict
-begin
-CopyFont
-/PaintType 2 def
-/StrokeWidth .03 0 FontMatrix idtransform pop def
-/dummybold currentdict
-end
-definefont
-_pdfBoldBaseFont 8 dict copy begin
-/_basefont exch def
-/_basefonto exch def
-currentdict
-end
-definefont
-} bd
-/MakeBold {
-findfont dup
-/FontType get 0 eq
-{
-_pdfBoldBaseFont /_setwidthProc /_pdfType0WidthProc load put
-{MakeBoldFont} Type0CopyFont definefont
-}
-{
-dup /_fauxfont known not
-{
-_pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put
-MakeBoldFont
-}
-{ definefont }
-ifelse
-}
-ifelse
-pop
-}bd
-/MakeItalic {
-findfont
-dup /WMode 2 copy known
-{
-get 1 eq
-{ _italMtx_WMode1 }
-{ _italMtx }
-ifelse
-}
-{ pop pop _italMtx }
-ifelse
-makefont
-definefont pop
-}bd
-/MakeBoldItalic {
-/dummybold exch
-MakeBold
-/dummybold
-MakeItalic
-}bd
-currentdict readonly pop end
-%%EndFile
-PDFText begin
-[39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-0 TE
-[1/dotlessi/caron 39/quotesingle 96/grave
-127/bullet/bullet/bullet/quotesinglbase/florin/quotedblbase/ellipsis
-/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE
-/bullet/bullet/bullet/bullet/quoteleft/quoteright/quotedblleft
-/quotedblright/bullet/endash/emdash/tilde/trademark/scaron
-/guilsinglright/oe/bullet/bullet/Ydieresis/space/exclamdown/cent/sterling
-/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine
-/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus
-/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla
-/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters
-/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
-/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
-/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash
-/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave
-/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde
-/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute
-/ucircumflex/udieresis/yacute/thorn/ydieresis
-1 TE
-end
-%%BeginFile: pdfimage.prc
-%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
-PDF /PDFImage 38 dict put
-PDF /PDFIVars 20 dict put
-PDF /PDFImage get begin
-/initialize { PDFImage begin } bd
-/terminate { end } bd
-/nulldict 0 dict def
-/gv { PDFIVars exch get } bd
-/pv { PDFIVars 3 1 roll put } bd
-/BI { save /savelevel exch pv mark } bd
-/EI { /savelevel gv restore } bd
-end
-%%EndFile
-%%BeginFile: pdfimg2.prc
-%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved.
-PDF /PDFImage get begin
-Level2? StartLoad {
-/ID {
-5 counttomark 2 idiv
-dup 3 1 roll add
-dict begin
-{ def } repeat
-cleartomark
-currentdict
-end
-begin
-/ImageType 1 def
-/ImageMatrix [ Width 0 0 Height neg 0 Height ] def
-/ImageMask here { not } { true } ifelse
-{ /ImageMask false def } if
-ImageMask not { ColorSpace setcolorspace } if
-/Intent here { ri } if
-/Decode here { pop } {
-/Decode [
-ImageMask {
-0 1
-} {
-currentcolorspace 0 get /Indexed eq {
-0 2 BitsPerComponent exp 1 sub
-} {
-mark currentcolor counttomark
-dup 2 add 1 roll cleartomark
-{ 0 1 } repeat
-} ifelse
-} ifelse
-] def
-} ifelse
-[
-/DataSource here { pop } {
-currentfile
-/Filter here {
-dup type /arraytype eq { length } { pop 1 } ifelse
-1 sub 0 1 3 -1 roll {
-/DecodeParms here {
-dup type /arraytype eq {
-1 index get
-} if
-dup null eq { pop } { exch } ifelse
-} if
-Filter dup type /arraytype eq
-{ exch get } { exch pop } ifelse
-filter
-dup
-} for
-} if
-/DataSource exch def
-} ifelse
-currentdict
-/ImageMask here not { false } if
-{ sfc imagemask } { image } ifelse
-counttomark
-{ dup status
-{ dup flushfile closefile }
-{ pop }
-ifelse
-}
-repeat
-pop
-end
-} bd
-currentdict readonly pop
-} EndLoad
-end
-%%EndFile
-currentdict readonly pop
-end end
-/currentpacking where {pop setpacking}if
-PDFVars/InitAll{[PDF PDFText PDFImage]{/initialize get exec}forall initgs 0 Tr}put
-PDFVars/TermAll{[PDFImage PDFText PDF]{/terminate get exec}forall}put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-userdict begin
-%%BeginResource: font TimesNewRoman,Bold
-%%EndResource
-end
-% Begin encoding-delta
-[/N8/Times-Bold 1 TZ
-% End encoding-delta
-userdict begin
-%%BeginResource: font TimesNewRoman
-%%EndResource
-end
-% Begin encoding-delta
-[/N6/Times-Roman 1 TZ
-% End encoding-delta
-userdict begin
-%%BeginResource: font TimesNewRoman,Italic
-%%EndResource
-end
-% Begin encoding-delta
-[/N10/Times-Italic 1 TZ
-% End encoding-delta
-userdict begin
-%%BeginResource: font CourierNew
-%%EndResource
-end
-% Begin encoding-delta
-[/N17/Courier 1 TZ
-% End encoding-delta
-PDFVars/TermAll get exec end end
-
-%%EndSetup
-%%Page: 1 1
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(1)Tj
-ET
-1 1 1 rg
-180 657.12 252 62.88 re
-f
-BT
-180 712.08 TD
-0 0 0 rg
-/N6 12 Tf
-0.0933 Tc
--0.1293 Tw
-(Stanford University)Tj
-0 -14.16 TD
-0.0768 Tc
--0.1128 Tw
-(Computer Science Department)Tj
-0 -27.84 TD
-0.0447 Tc
-0.0393 Tw
-(CS140: Operating Systems)Tj
-ET
-1 1 1 rg
-432 684 108 36 re
-f
-BT
-448.08 712.08 TD
-0 0 0 rg
-0.03 Tc
-0.174 Tw
-(A. Arpaci-Dusseau)Tj
-25.68 -14.16 TD
-0.024 Tc
-0.18 Tw
-(Autumn 1998)Tj
--401.76 -77.28 TD
-/N8 13.92 Tf
-0.076 Tc
-0 Tw
-(Purpose)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.0743 Tc
-1.0447 Tw
-(In this handout, we give a brief overview of the behavior of the Solaris\
- 2.6 Time-Sharing \(TS\))Tj
-0 -13.92 TD
-0.096 Tc
-0.3 Tw
-(scheduler, an example of a )Tj
-132.96 0 TD
-/N10 12 Tf
-0.0104 Tc
-0.1496 Tw
-(Multilevel Feedback Queue )Tj
-136.8 0 TD
-/N6 12 Tf
-0.1083 Tc
-0.3357 Tw
-(scheduler. The information in this hand-)Tj
--269.76 -13.92 TD
-0.1074 Tc
-1.0849 Tw
-(out, in conjunction with that given in Lecture, should be used to answer\
- Problem 4 of the first)Tj
-0 -14.16 TD
-0.0991 Tc
--0.2251 Tw
-(assignment. The end of this document specifies in more detail which asp\
-ects of the Solaris sched-)Tj
-0 -13.92 TD
-0.1191 Tc
-0.0369 Tw
-(uler that you should implement. )Tj
-0 -29.28 TD
-/N8 13.92 Tf
-0.0723 Tc
--0.1437 Tw
-(Multilevel Feedback Queue Schedulers)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.1389 Tc
-0.7251 Tw
-(The goal of a multilevel feedback queue scheduler is to fairly and effic\
-iently schedule a mix of)Tj
-0 -13.92 TD
-0.0972 Tc
-2.6544 Tw
-(processes with a variety of execution characteristics. By controlling h\
-ow a process moves)Tj
-0 -14.16 TD
-0.063 Tc
-0.7301 Tw
-(between priority levels, processes with different characteristics can be\
- scheduled as appropriate.)Tj
-0 -13.92 TD
-0.0613 Tc
-2.0627 Tw
-(Priority-based schedulers attempt to provide a compromise between severa\
-l desirable metrics)Tj
-T*
-0.0834 Tc
-0.6929 Tw
-(\(e.g., response time for interactive jobs, throughput for compute-inte\
-nsive jobs, and fair alloca-)Tj
-0 -14.16 TD
-0.0875 Tc
-0.0205 Tw
-(tions for all jobs\). )Tj
-0 -24 TD
-0.0825 Tc
-1.1158 Tw
-(The queues in the system are ranked according to priority. Processes wai\
-ting in higher priority)Tj
-0 -13.92 TD
-0.0821 Tc
-0.4899 Tw
-(queues are always scheduled over those in lower priority queues. Proces\
-ses at the same priority)Tj
-T*
-0.1077 Tc
--0.0237 Tw
-(are usually scheduled in a round-robin fashion.)Tj
-0 -24 TD
-0.072 Tc
--0.204 Tw
-(Such schedulers tend to be )Tj
-129.6 0 TD
-/N10 12 Tf
-0.0218 Tc
--0.2618 Tw
-( preemptible )Tj
-62.64 0 TD
-/N6 12 Tf
-0.0642 Tc
--0.2922 Tw
-(in order to support interactive processes. That is, a higher)Tj
--192.24 -14.16 TD
-0.0929 Tc
--0.0009 Tw
-(priority process is immediately scheduled if a lower priority process is\
- running on the CPU. )Tj
-0 -29.28 TD
-/N8 13.92 Tf
-0.1088 Tc
--0.1001 Tw
-(Scheduling in Solaris)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.0748 Tc
-2.3577 Tw
-(The Solaris operating system is based on Unix System V Release 4 \(SVR4\)\
-. Scheduling in)Tj
-0 -13.92 TD
-0.0614 Tc
-0.8226 Tw
-(Solaris, as in all SVR4-based schedulers, is performed at two levels: cl\
-ass-independent routines)Tj
-T*
-0.068 Tc
-0.836 Tw
-(and class-dependent routines. Class-independent routines are those that\
- are responsible for dis-)Tj
-0 -14.16 TD
-0.0641 Tc
-1.6279 Tw
-(patching and preempting processes \(the low-level mechanisms\). Class-d\
-ependent routines are)Tj
-0 -13.92 TD
-0.0854 Tc
-0.0198 Tw
-(those that are responsible for setting the priority of each of its proce\
-sses \(the high-level policy\). )Tj
-0 -24 TD
-0.0772 Tc
-0.2668 Tw
-(By default, Solaris supports three scheduling classes: time-sharing \(TS\
-\), real-time \(RT\), and sys-)Tj
-0 -13.92 TD
-0.0817 Tc
-0.3623 Tw
-(tem \(SYS\). Users with root privileges can easily implement and add ne\
-w scheduling classes by)Tj
-0 -14.16 TD
-0.0944 Tc
-0.7656 Tw
-(adhering to a predefined interface. Each scheduling class gives each of\
- its processes a priority,)Tj
-0 -13.92 TD
-0.1174 Tc
--0.0334 Tw
-(the range of which is shown below.)Tj
-0 562.08 TD
-0.072 Tc
--0.108 Tw
-(Handout #9)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 2 2
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(2)Tj
--231.6 553.92 TD
-/N6 12 Tf
-0.0772 Tc
-1.0334 Tw
-(As long as a user has the correct privileges, he or she can submit jobs \
-to any scheduling class.)Tj
-0 -13.92 TD
-0.0647 Tc
-0.2993 Tw
-(\(See the man pages for )Tj
-117.6 0 TD
-/N8 12 Tf
-0.03 Tc
-0 Tw
-(priocntl)Tj
-40.56 0 TD
-/N6 12 Tf
-0.1242 Tc
-0.2325 Tw
-( on any machine running Solaris for information on how to sub-)Tj
--158.16 -13.92 TD
-0.1112 Tc
-0.7168 Tw
-(mit jobs to different scheduling classes; however, since you probably do\
-n)Tj
--2.892 Tc
-0 Tw
-(\222)Tj
-0.0493 Tc
-0.8747 Tw
-(t have root privileges)Tj
-0 -14.16 TD
-0.18 Tc
-1.464 Tw
-(on your machine, you won)Tj
--2.652 Tc
-0 Tw
-(\222)Tj
-0.1005 Tc
-1.5435 Tw
-(t be able to do much.\) By default, jobs are executed in the same)Tj
-0 -13.92 TD
-0.0876 Tc
--0.0036 Tw
-(scheduling class as the parent process that forked the job. Since your \
-shell is running in the time-)Tj
-T*
-0.1086 Tc
--0.0246 Tw
-(sharing class, all of your jobs run by default in the time-sharing class\
-.)Tj
-0 -24 TD
-0.0816 Tc
-1.2824 Tw
-(To see the scheduling class of each process in the system, run )Tj
--1.692 Tc
-0 Tw
-(\223)Tj
-318.72 0 TD
-/N8 12 Tf
--0.0267 Tc
-1.2507 Tw
-(ps -edaflc)Tj
-50.16 0 TD
-/N6 12 Tf
--1.452 Tc
-2.856 Tw
-(\224 )Tj
--0.012 Tc
-0 Tw
-(\()Tj
-13.68 0 TD
-/N8 12 Tf
--0.09 Tc
-0.114 Tw
-(-c )Tj
-13.44 0 TD
-/N6 12 Tf
-0.1292 Tc
-1.2748 Tw
-(is the flag that)Tj
--396 -14.16 TD
-0.1028 Tc
-0.6452 Tw
-(shows the scheduling class\). The fourth column shows the scheduling cl\
-ass of the running pro-)Tj
-0 -13.92 TD
-0.091 Tc
-0.461 Tw
-(cess. Most jobs will be running in the TS class, with a few \(owned by \
-root\) running in the SYS)Tj
-T*
-0.062 Tc
-0 Tw
-(class.)Tj
-0 -14.16 TD
-/N17 12 Tf
--0.0133 Tc
-0.0133 Tw
-(elaine1:~> ps -edafc)Tj
-0 -13.92 TD
--0.0077 Tc
-0.0077 Tw
-( UID PID PPID CLS PRI STIME TTY TIME CMD)Tj
-T*
-0 Tc
--0.0083 Tw
-( root 0 0 SYS 96 Aug 01 ? 0:00 sched)Tj
-0 -14.16 TD
--0.0077 Tw
-( root 1 0 TS 58 Aug 01 ? 1:06 /etc/init -)Tj
-0 -13.92 TD
--0.0083 Tw
-( root 2 0 SYS 98 Aug 01 ? 0:02 pageout)Tj
-T*
--0.0086 Tw
-( root 3 0 SYS 60 Aug 01 ? 15:22 fsflush)Tj
-0 -14.16 TD
--0.008 Tc
-0.008 Tw
-( root 245 239 TS 59 Aug 01 ? 0:00 ttymon)Tj
-0 -13.92 TD
-0 Tc
--0.0083 Tw
-( root 181 1 TS 48 Aug 01 ? 0:00 sendmail -q15m)Tj
-T*
--0.008 Tw
-( root 239 1 TS 59 Aug 01 ? 0:00 sac -t 300)Tj
-0 -14.16 TD
--0.0083 Tw
-( root 96 1 TS 58 Aug 01 ? 0:00 rpcbind)Tj
-0 -13.92 TD
--0.0092 Tw
-( root 125 1 TS 59 Aug 01 ? 0:32 syslogd)Tj
-0 -37.92 TD
-/N6 12 Tf
-0.0821 Tc
-0.1519 Tw
-(In this document, we only discuss the Solaris time-sharing \(TS\) class.\
- Note the priorities of each)Tj
-0 -14.16 TD
-0.1155 Tc
--0.0315 Tw
-(of the processes, as listed in the fifth column.)Tj
-0 -29.28 TD
-/N8 13.92 Tf
-0.1063 Tc
--0.2177 Tw
-(Class Independent Functionality)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.0693 Tc
-0.4855 Tw
-(The class independent routines arbitrate across the scheduling classes. \
- This involves three basic)Tj
-0 -13.92 TD
-0.0438 Tc
-0 Tw
-(responsibilities.)Tj
-0 -24 TD
--2.652 Tc
-(\225)Tj
-18 0 TD
-0.0745 Tc
-0.4015 Tw
-(The process with the highest priority must be dispatched, and the state \
-of the preempted pro-)Tj
-0 -13.92 TD
-0.0444 Tc
-0.0796 Tw
-(cess saved. )Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-0.1096 Tc
--0.1256 Tw
-(The class independent functions must notifying the class-dependent routi\
-nes when the state of)Tj
-0 -14.16 TD
-0.0722 Tc
-0.1318 Tw
-(its processes changes \(for example, at creation and termination, when a\
- process changes from)Tj
-0 -13.92 TD
-0.057 Tc
-0.067 Tw
-(blocked to runnable, or runnable to blocked, and when a 10ms timer expir\
-es\). )Tj
-111.6 613.92 TD
-0.084 Tc
-0.12 Tw
-(Scheduling Class)Tj
-136.32 0 TD
-0.0348 Tc
-0 Tw
-(Priorities)Tj
--143.04 -24 TD
-0.084 Tc
-(Real-Time)Tj
-108 0 TD
--0.1251 Tc
-(100-159)Tj
--108 -21.84 TD
-0.134 Tc
-(System)Tj
-108 0 TD
--0.1176 Tc
-(60-99)Tj
--108 -22.08 TD
-0.077 Tc
-(Time-Sharing)Tj
-108 0 TD
--0.111 Tc
-(0-59)Tj
--152.64 -22.08 TD
-/N8 12 Tf
-0.012 Tc
--0.108 Tw
-(Table 1: )Tj
-45.36 0 TD
-0.0258 Tc
--0.139 Tw
-(Range of Priorities for Scheduling Classes in Solaris)Tj
-ET
-188.64 628.32 0.48 91.44 re
-f
-296.64 627.84 0.48 92.4 re
-f
-422.88 628.32 0.48 91.44 re
-f
-188.64 720.24 m
-188.64 719.76 l
-423.36 719.76 l
-423.36 720.24 l
-h
-f
-189.36 695.52 m
-189.36 695.04 l
-422.64 695.04 l
-422.64 695.52 l
-h
-f
-189.36 693.12 m
-189.36 692.64 l
-422.64 692.64 l
-422.64 693.12 l
-h
-f
-188.64 672.24 m
-188.64 671.76 l
-423.36 671.76 l
-423.36 672.24 l
-h
-f
-188.64 650.16 m
-188.64 649.68 l
-423.36 649.68 l
-423.36 650.16 l
-h
-f
-188.64 628.32 m
-188.64 627.84 l
-423.36 627.84 l
-423.36 628.32 l
-h
-f
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 3 3
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(3)Tj
--231.6 676.08 TD
-/N6 12 Tf
--2.652 Tc
-(\225)Tj
-18 0 TD
-0.0755 Tc
-0.147 Tw
-(Processes must be moved between priority queues in the class independent\
- data structures, as)Tj
-0 -14.16 TD
-0.0968 Tc
--0.0048 Tw
-(directed by its scheduling class, and must be moved between blocked and \
-ready queues. )Tj
--18 -29.28 TD
-/N8 13.92 Tf
-0.0866 Tc
--0.078 Tw
-(Time-Sharing Scheduling Class)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.0848 Tc
-1.8361 Tw
-(The Time-Sharing scheduler in Solaris is an example of a multi-level fee\
-dback queue sched-)Tj
-0 -13.92 TD
-0.0841 Tc
-0.4104 Tw
-(uler. A job begins at priority 29. Compute-bound jobs then filter do\
-wn to the lower priorities,)Tj
-T*
-0.0777 Tc
-0.5377 Tw
-(where they are scheduled less frequently \(but for longer time-slices\) \
-and interactive jobs propa-)Tj
-0 -14.16 TD
-0.0919 Tc
-0.7521 Tw
-(gate to the higher priorities \(where they are scheduled whenever they h\
-ave work to perform, on)Tj
-0 -13.92 TD
-0.0831 Tc
--0.0441 Tw
-(the assumption that they will soon relinquish the processor again\). In\
- the TS scheduler, the prior-)Tj
-T*
-0.1006 Tc
-0.2297 Tw
-(ity of a process is lowered after it consumes its allocated time-slice. \
- Its priority is raised if it has)Tj
-0 -14.16 TD
-0.091 Tc
-0.033 Tw
-(not consumed its time-slice before a )Tj
-176.64 0 TD
-/N10 12 Tf
-0.0133 Tc
--0.0133 Tw
-(starvation interval )Tj
-94.8 0 TD
-/N6 12 Tf
-0.0315 Tc
-0 Tw
-(expires.)Tj
--271.44 -25.92 TD
-/N8 12 Tf
-0.0175 Tc
--0.2335 Tw
-(Dispatch Table)Tj
-0 -24 TD
-/N6 12 Tf
-0.084 Tc
-0.0343 Tw
-(The durations of the time-slices, the changes in priorities, and the sta\
-rvation interval are specified)Tj
-0 -13.92 TD
-0.0961 Tc
-0.1593 Tw
-(in a user-tunable dispatch table. The system administrator \(or anyone \
-with root privileges again\))Tj
-0 -14.16 TD
-0.089 Tc
-0.4579 Tw
-(can change the values in this table, thus configuring how the time-shari\
-ng scheduler manages its)Tj
-0 -13.92 TD
-0.12 Tc
--0.3693 Tw
-(jobs. While this has the noble intention of allowing different systems \
- to tune the scheduler to bet-)Tj
-T*
-0.1129 Tc
-1.5151 Tw
-(ter handle their workloads, in reality no one really knows how to config\
-ure these tables well.)Tj
-0 -14.16 TD
-0.0878 Tc
-0.1162 Tw
-(Therefore, we will focus on the default dispatch table. )Tj
-0 -24 TD
-0.116 Tc
--0.032 Tw
-(To see how this table is configured in your system, run)Tj
-185.52 -24 TD
-/N8 12 Tf
-0.044 Tc
--0.18 Tw
-(dispadmin -c TS -g)Tj
--185.52 -24 TD
-/N6 12 Tf
-0.1011 Tc
-1.2888 Tw
-(You should see something like that in Table 2. \(Looking at the man pag\
-es on dispadmin and)Tj
-0 -13.92 TD
-0.0963 Tc
-0.9689 Tw
-(ts_dptbl may also be helpful\). You will see one row for every priority\
- in the scheduling class:)Tj
-T*
-0.0871 Tc
-0.0369 Tw
-(from 0 to 59. For each priority, there are five columns: )Tj
-0 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.0905 Tc
-(ts_quantum:)Tj
-65.28 0 TD
-/N6 12 Tf
-0.1021 Tc
-1.6619 Tw
-( Length of the time-slice \(in the actual table, this value is specified\
- in 10ms)Tj
--65.28 -14.16 TD
-0.111 Tc
--0.051 Tw
-(clock ticks; in the output from running dispadmin, the value is specifie\
-d in units of 1ms\).)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.0413 Tc
-(ts_tqexp:)Tj
-47.28 0 TD
-/N6 12 Tf
-0.1113 Tc
-0.4969 Tw
-( Priority level of the new queue on which to place a process if it exc\
-eeds its time)Tj
--47.28 -13.92 TD
-0.1106 Tc
--0.0196 Tw
-(quantum. Normally this field links to a lower priority time-sharing\
- level. )Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.006 Tc
-(ts_slpret:)Tj
-48 0 TD
-/N6 12 Tf
-0.0994 Tc
-1.3732 Tw
-( the priority to change to \(generally a higher priority\) when the job \
-returns from)Tj
--48 -13.92 TD
-0.0863 Tc
--0.0115 Tw
-(sleeping \(i.e., from the blocked queue\) if ts_dispwait exceeds ts_max\
-wait \(see next entry\).)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.048 Tc
-(ts_maxwait)Tj
-58.56 0 TD
-/N6 12 Tf
-0.0504 Tc
--0.0864 Tw
-(: A per process counter,)Tj
-119.52 0 TD
-/N8 12 Tf
-0.018 Tc
--0.154 Tw
-( ts_dispwait, )Tj
-69.6 0 TD
-/N6 12 Tf
-0.072 Tc
--0.108 Tw
-(is initialized to zero each time a process)Tj
--247.68 -14.16 TD
-0.0602 Tc
-1.081 Tw
-(is placed back on the dispatcher queue after its time quantum has e\
-xpired or when it is)Tj
-0 -13.92 TD
-0.0602 Tc
-0.0347 Tw
-(awakened \(ts_dispwait is not reset to zero when a process is preempt\
-ed by a higher prior-)Tj
-T*
-0.0862 Tc
--0.1889 Tw
-(ity process\). This counter is incremented once per second. If a \
-process)Tj
--2.652 Tc
-0 Tw
-(\222)Tj
-0.0572 Tc
--0.0932 Tw
-(s ts_dispwait value)Tj
-0 -14.16 TD
-0.0843 Tc
-0.1197 Tw
-(exceeds the ts_maxwait value for its level, the process)Tj
--2.652 Tc
-0 Tw
-(\222)Tj
-0.1033 Tc
-0.1007 Tw
-(s priority is changed to that indicated)Tj
-0 -13.92 TD
-0.092 Tc
--0.0189 Tw
-(by ts_lwait. The purpose of this field is to prevent starvation.)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.036 Tc
-(ts_lwait:)Tj
-43.92 0 TD
-/N6 12 Tf
-0.0936 Tc
-0.5047 Tw
-( the priority to change to \(generally a higher priority\) if the starva\
-tion timer expires)Tj
--43.92 -13.92 TD
-0.0825 Tc
--0.0225 Tw
-(before the job consumes its time-slice \(i.e., if ts_dispwait exceeds ts\
-_maxwait\).)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 4 4
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(4)Tj
-ET
-1 1 1 rg
-103.44 80.88 405.12 630.24 re
-f
-BT
-103.44 704.4 TD
-0 0 0 rg
-0.1271 Tc
--0.0582 Tw
-(# ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait #PRIORITY LEVEL \
- )Tj
-0 -10.08 TD
--0.0635 Tc
-0.1735 Tw
-(200 0 50 0 50 # 0 )Tj
-T*
-0.1753 Tw
-(200 0 50 0 50 # 1 )Tj
-0 -9.84 TD
-0.1735 Tw
-(200 0 50 0 50 # 2 )Tj
-0 -10.08 TD
-(200 0 50 0 50 # 3 )Tj
-T*
-(200 0 50 0 50 # 4 )Tj
-0 -9.84 TD
-(200 0 50 0 50 # 5 )Tj
-0 -10.08 TD
-(200 0 50 0 50 # 6 )Tj
-T*
-(200 0 50 0 50 # 7 )Tj
-0 -9.84 TD
-(200 0 50 0 50 # 8 )Tj
-0 -10.08 TD
-(200 0 50 0 50 # 9 )Tj
-T*
--0.0581 Tc
-0.1698 Tw
-(160 0 51 0 51 # 10 )Tj
-0 -9.84 TD
-(160 1 51 0 51 # 11 )Tj
-0 -10.08 TD
-(160 2 51 0 51 # 12 )Tj
-T*
-(160 3 51 0 51 # 13 )Tj
-0 -9.84 TD
-(160 4 51 0 51 # 14 )Tj
-0 -10.08 TD
-(160 5 51 0 51 # 15 )Tj
-T*
-(160 6 51 0 51 # 16 )Tj
-0 -9.84 TD
-(160 7 51 0 51 # 17 )Tj
-0 -10.08 TD
-(160 8 51 0 51 # 18 )Tj
-T*
-(160 9 51 0 51 # 19 )Tj
-0 -9.84 TD
--0.0535 Tc
-0.1627 Tw
-(120 10 52 0 52 # 20 )Tj
-0 -10.08 TD
-(120 11 52 0 52 # 21 )Tj
-T*
-(120 12 52 0 52 # 22 )Tj
-0 -9.84 TD
-(120 13 52 0 52 # 23 )Tj
-0 -10.08 TD
-(120 14 52 0 52 # 24 )Tj
-T*
-(120 15 52 0 52 # 25 )Tj
-0 -9.84 TD
-(120 16 52 0 52 # 26 )Tj
-0 -10.08 TD
-(120 17 52 0 52 # 27 )Tj
-T*
-(120 18 52 0 52 # 28 )Tj
-0 -9.84 TD
-0.1609 Tw
-(120 19 52 0 52 # 29 )Tj
-0 -10.08 TD
--0.0181 Tc
-0.1212 Tw
-(80 20 53 0 53 # 30 )Tj
-T*
-(80 21 53 0 53 # 31 )Tj
-0 -9.84 TD
-(80 22 53 0 53 # 32 )Tj
-0 -10.08 TD
-(80 23 53 0 53 # 33 )Tj
-T*
-0.1186 Tw
-(80 24 53 0 53 # 34 )Tj
-0 -9.84 TD
-0.1212 Tw
-(80 25 54 0 54 # 35 )Tj
-0 -10.08 TD
-(80 26 54 0 54 # 36 )Tj
-T*
-(80 27 54 0 54 # 37 )Tj
-0 -9.84 TD
-0.1186 Tw
-(80 28 54 0 54 # 38 )Tj
-0 -10.08 TD
-0.1212 Tw
-(80 29 54 0 54 # 39 )Tj
-T*
-(40 30 55 0 55 # 40 )Tj
-0 -9.84 TD
-0.1186 Tw
-(40 31 55 0 55 # 41 )Tj
-0 -10.08 TD
-0.1212 Tw
-(40 32 55 0 55 # 42 )Tj
-T*
-0.1186 Tw
-(40 33 55 0 55 # 43 )Tj
-0 -9.84 TD
-0.1212 Tw
-(40 34 55 0 55 # 44 )Tj
-0 -10.08 TD
-(40 35 56 0 56 # 45 )Tj
-T*
-(40 36 57 0 57 # 46 )Tj
-0 -9.84 TD
-(40 37 58 0 58 # 47 )Tj
-0 -10.08 TD
-(40 38 58 0 58 # 48 )Tj
-T*
-0.1186 Tw
-(40 39 58 0 59 # 49 )Tj
-0 -9.84 TD
-(40 40 58 0 59 # 50 )Tj
-0 -10.08 TD
-0.1212 Tw
-(40 41 58 0 59 # 51 )Tj
-T*
-(40 42 58 0 59 # 52 )Tj
-0 -9.84 TD
-(40 43 58 0 59 # 53 )Tj
-0 -10.08 TD
-(40 44 58 0 59 # 54 )Tj
-T*
-(40 45 58 0 59 # 55 )Tj
-0 -9.84 TD
-(40 46 58 0 59 # 56 )Tj
-0 -10.08 TD
-(40 47 58 0 59 # 57 )Tj
-T*
-0.1186 Tw
-(40 48 58 0 59 # 58 )Tj
-0 -9.84 TD
--0.0281 Tc
-0.133 Tw
-(20 49 59 32000 59 # 59)Tj
-0 -18 TD
-0.1233 Tc
--0.0801 Tw
-(Table 2: Default Solaris Time-Sharing Dispatch Table )Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 5 5
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(5)Tj
--231.6 676.08 TD
-/N6 12 Tf
-0.0731 Tc
-0.3138 Tw
-(In this table, the priority of jobs ranges from a high of 59 down to 0.\
- Time-slices begin at 20ms)Tj
-0 -14.16 TD
-0.0887 Tc
-1.5553 Tw
-(at the highest priority and gradually increase in duration up to 200ms a\
-t the lowest priorities.)Tj
-0 -13.92 TD
-0.0769 Tc
-0.0521 Tw
-(Generally, the priority of a process decreases by 10 levels after it con\
-sumes its time-slice; the pri-)Tj
-T*
-0.0616 Tc
-0.091 Tw
-(ority of a process is increased to 50 or above when the starvation timer\
- expires.)Tj
-0 -26.16 TD
-/N8 12 Tf
-0.0591 Tc
-0 Tw
-(Implementation)Tj
-0 -24 TD
-/N6 12 Tf
-0.0869 Tc
-0.3571 Tw
-(For each job in the TS class, the following data structure is maintained\
- \(we)Tj
--2.652 Tc
-0 Tw
-(\222)Tj
-0.1296 Tc
-0.2544 Tw
-(ve removed a few of)Tj
-0 -13.92 TD
-0.1285 Tc
--0.0045 Tw
-(the fields for simplicity\):)Tj
-0 -12.72 TD
-/N17 9.84 Tf
-0.096 Tc
-0 Tw
-(/*)Tj
-0 -12 TD
-0.0901 Tc
-0.0059 Tw
-( * time-sharing class specific thread structure)Tj
-T*
-0.096 Tc
-0 Tw
-( */)Tj
-T*
-0.084 Tc
-0.012 Tw
-(typedef struct tsproc {)Tj
-T*
-0.096 Tc
-0 Tw
-( long)Tj
-54 0 TD
-0.076 Tc
-0.02 Tw
-( ts_timeleft;)Tj
-132 0 TD
-0.096 Tc
-0 Tw
-( /* time remaining in quantum */)Tj
--186 -12 TD
-0.09 Tc
-0.006 Tw
-( long ts_dispwait; /* number of seconds since */)Tj
-0 -12 TD
-0.096 Tc
--0.0062 Tw
-( /* start of quantum \(not reset */)Tj
-T*
--0.0067 Tw
-( /* upon preemption\) */)Tj
-T*
-0.088 Tc
-0.008 Tw
-( pri_t ts_pri; /* priority \(0-59\) */)Tj
-T*
-0.0891 Tc
-0.0069 Tw
-( kthread_t *ts_tp; /* pointer to thread */)Tj
-T*
-0.0909 Tc
-0.0051 Tw
-( struct tsproc *ts_next; /* link to next tsproc on list */)Tj
-T*
-0.0907 Tc
-0.0053 Tw
-( struct tsproc *ts_prev; /* link to previous tsproc */)Tj
-T*
-0.096 Tc
-0 Tw
-(} tsproc_t;)Tj
-0 -23.28 TD
-/N6 12 Tf
-0.0908 Tc
-0.7224 Tw
-(The kthread_t structure tracks the necessary information to context-swit\
-ch to and from this pro-)Tj
-0 -13.92 TD
-0.0673 Tc
-0.6617 Tw
-(cess. This structure is kept separate from the time-sharing class in or\
-der to separate the mecha-)Tj
-0 -14.16 TD
-0.0989 Tc
-0.0178 Tw
-(nisms of the dispatcher from the policies of the scheduler. )Tj
-0 -24 TD
-0.0592 Tc
-0.0548 Tw
-(There are seven interesting routines in the TS class:)Tj
-T*
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.018 Tc
--0.234 Tw
-(ts_enterclass\(thread *T\):)Tj
-128.16 0 TD
-/N6 12 Tf
-0.0846 Tc
-0.0321 Tw
-( called when a new thread is added to the TS class.)Tj
--128.16 -13.92 TD
-0.0675 Tc
-0.0405 Tw
-(It initializes a tsproc structure for this process and adds it to the li\
-st of processes)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.0256 Tc
--0.2416 Tw
-(ts_exitclass\(thread *T\):)Tj
-120.24 0 TD
-/N6 12 Tf
-0.0819 Tc
-0.0155 Tw
-( called when the thread terminates or exits the class.)Tj
--120.24 -13.92 TD
-0.0722 Tc
-0.0518 Tw
-(The tsproc structure is removed from the list of processes.)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.048 Tc
--0.264 Tw
-(ts_tick\(thread *T\):)Tj
-96.96 0 TD
-/N6 12 Tf
-0.1131 Tc
--0.0891 Tw
-( called once every 10ms with a pointer to the currently running thread.)Tj
--96.96 -14.16 TD
-0.1146 Tc
-0.7934 Tw
-(The ts_timeleft variable of the running thread is decremented by one. I\
-f ts_timeleft goes to)Tj
-0 -13.92 TD
-0.094 Tc
--0.2712 Tw
-(zero, then its new priority is calculated according to the value of ts_t\
-qexp in the table, its time-)Tj
-T*
-0.0714 Tc
--0.1356 Tw
-(slice is reset, and ts_dispwait is cleared; the thread is then added to \
-the back of the appropriate)Tj
-0 -14.16 TD
-0.1083 Tc
--0.1101 Tw
-(priority queue and a new job is scheduled.)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.045 Tc
-(ts_update\(\):)Tj
-61.92 0 TD
-/N6 12 Tf
-0.1059 Tc
--0.0619 Tw
-( called once a second to check the starvation qualities of each job.)Tj
--61.92 -13.92 TD
-0.082 Tc
-0.5848 Tw
-(The routine increments the ts_dispwait counter of every process in the c\
-lass \(even those that)Tj
-0 -13.92 TD
-0.0962 Tc
-1.3318 Tw
-(are blocked\) by one. If the job is on the ready queue \(i.e., the job\
- is neither running nor)Tj
-0 -14.16 TD
-0.0806 Tc
-0.0034 Tw
-(blocked\), then if its ts_dispwait exceeds ts_maxwait, the priority and\
- the ts_dispwait value of)Tj
-0 -13.92 TD
-0.0752 Tc
-0.0488 Tw
-(this process are reset \(but not ts_timeleft\). Note that this may invo\
-lve rearranging the priority)Tj
-T*
-0.0394 Tc
-0.1646 Tw
-(queues. )Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.024 Tc
--0.24 Tw
-(ts_sleep\(thread *T\):)Tj
-102.96 0 TD
-/N6 12 Tf
-0.0904 Tc
-0.0136 Tw
-( called when the thread blocks \(e.g., due to I/O or synchronization\). \
-)Tj
--102.96 -14.16 TD
-0.0935 Tc
-0.0785 Tw
-(The TS routine does not need to do anything in these circumstance. Howe\
-ver, the dispatcher,)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 6 6
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(6)Tj
--213.6 676.08 TD
-/N6 12 Tf
-0.081 Tc
-0.7401 Tw
-(or class-independent routines, must add the thread to the blocked queue \
-and schedule a new)Tj
-0 -14.16 TD
-0.096 Tc
-0 Tw
-(thread.)Tj
--18 -24 TD
--2.652 Tc
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.0618 Tc
--0.1578 Tw
-(ts_wakeup\(thread *T\): )Tj
-120.48 0 TD
-/N6 12 Tf
-0.1034 Tc
--0.0194 Tw
-(called when the blocked thread becomes ready. )Tj
--120.48 -13.92 TD
-0.0809 Tc
-0.0751 Tw
-(If the ts_dispwait value associated with this process is greater than th\
-e value of ts_maxwait in)Tj
-0 -13.92 TD
-0.0816 Tc
-0.1224 Tw
-(the dispatch table, then the priority of the process is set to that spec\
-ified by ts_slpret, its time-)Tj
-0 -14.16 TD
-0.0892 Tc
--0.1385 Tw
-(slice \(ts_timeleft\) is reset, and ts_dispwait is cleared. If the prio\
-rity of this job is less than that)Tj
-0 -13.92 TD
-0.1074 Tc
--0.1567 Tw
-(of the running job, then the newly awoken job is added to the back of it\
-s priority queue; other-)Tj
-T*
-0.0831 Tc
-0.0409 Tw
-(wise, it preempts the currently running job.)Tj
--18 -24 TD
--2.652 Tc
-0 Tw
-(\225)Tj
-18 0 TD
-/N8 12 Tf
-0.0206 Tc
-0.0034 Tw
-(ts_preempt\(thread *T\): )Tj
-123.84 0 TD
-/N6 12 Tf
-0.086 Tc
-0.022 Tw
-(called when the thread is preempted by a higher priority thread.)Tj
--123.84 -14.16 TD
-0.1009 Tc
--0.0278 Tw
-(The preempted thread is added to the front of its priority queue.)Tj
--18 -25.92 TD
-/N8 12 Tf
--0.0255 Tc
-0 Tw
-(Fairness)Tj
-0 -24 TD
-/N6 12 Tf
-0.086 Tc
-0.938 Tw
-(The Solaris time-sharing scheduler approximates fair allocations by decr\
-easing the priority of a)Tj
-0 -13.92 TD
-0.0971 Tc
-0.0469 Tw
-(job the more that it is scheduled. Therefore, a job that is runnable re\
-latively infrequently remains)Tj
-0 -14.16 TD
-0.0963 Tc
-0.3477 Tw
-(at a higher priority and is scheduled over lower priority jobs. However\
-, due to the configuration)Tj
-0 -13.92 TD
-0.0914 Tc
--0.1674 Tw
-(of the default dispatch table \(i.e., the starvation interval is set to \
-zero\), you will note that the prior-)Tj
-T*
-0.1038 Tc
-0.8061 Tw
-(ity of every process is raised once a second, regardless of whether or n\
-ot it is actually starving.)Tj
-0 -14.16 TD
-0.0824 Tc
-0.1401 Tw
-(Thus, the allocation history of each process is erased every second and \
-compute-bound processes)Tj
-0 -13.92 TD
-0.0881 Tc
--0.0241 Tw
-(tend to acquire more than their fair share of the resources. )Tj
-0 -24 TD
-0.0766 Tc
-0.8794 Tw
-(This behavior is illustrated in Figure 1 for three competing jobs that r\
-elinquish the processor at)Tj
-0 -13.92 TD
-0.123 Tc
-0.1343 Tw
-(different rates while waiting for I/O to complete: a )Tj
-247.68 0 TD
-/N10 12 Tf
-0.04 Tc
-0 Tw
-(coarse)Tj
-31.92 0 TD
-/N6 12 Tf
-0.0662 Tc
-0.3092 Tw
-( job that rarely relinquishes the CPU, a)Tj
--279.6 -14.16 TD
-/N10 12 Tf
-0 Tc
-0 Tw
-(medium)Tj
-37.92 0 TD
-/N6 12 Tf
-0.1129 Tc
--0.0589 Tw
-( job that does so more frequently, and a)Tj
-189.36 0 TD
-/N10 12 Tf
--0.06 Tc
--0.18 Tw
-( fine)Tj
-21.12 0 TD
-/N6 12 Tf
-0.0796 Tc
-0.0444 Tw
-( job that often relinquishes the CPU. The fig-)Tj
--248.4 -13.92 TD
-0.091 Tc
--0.157 Tw
-(ure shows a typical snapshot over a five second execution interval. As \
-described, each second the)Tj
-0 -13.92 TD
-0.0788 Tc
-0.2452 Tw
-(priority of all three jobs is raised to level 50 or higher. As a job ex\
-ecutes and consumes its time-)Tj
-0 -14.16 TD
-0.0872 Tc
--0.1232 Tw
-(slice, its priority is lowered about ten levels Since the coarse job ru\
-ns more frequently, it drops in)Tj
-0 -13.92 TD
-0.0922 Tc
--0.0215 Tw
-(priority at a faster rate than the other two jobs.)Tj
-ET
-1 1 1 rg
-160.08 103.92 288 207.12 re
-f
-q
-288 0 0 207.12 160.08 103.92 cm
-BI
- /Width 341
- /Height 252
- /BitsPerComponent 1
- /ColorSpace /DeviceGray
- /Decode [1 0 ]
- /DecodeParms [null <> ]
- /Filter [/ASCII85Decode /CCITTFaxDecode ]
-ID
--D5]FA8n>d7gp!_JX[(R5">e_j!0;@j@9Z7"XAU2d2e_p*"\,c3#Ka/8'jaH&a,4-
-#\85\,N&M_PW@[i'VW`2TgqY6%"m9(Eif#,+NhRZU!,MtGK`'RHROJclh`+B1kB";)XU5`d7B!_EFsYEA<>
-W";hc#V..7_C0RG,M4,<#UTrL":JHNs8VkBJ)gS/pdI^NJ,^T3$iUPcIQulmn,>E?
-503?pi.6CU&2*jd%t&=]^]+FVoEZ5KJ'@m'?SB1PJUdA8m4e5Q":.5H#_2:^%N/f'pf!H3=[S;G-:'6g-A!n+)8(a8a25&G'O>A*+jmo?7,0pqB3^I#glAa5hHbrunC*s'LhS
-I"*Poa'aH'p\@1:3QM0tU%'5.aUabgr."a]are\(."B;6r'rI@s7o%^J!;s'j8Y2?
-p%\?U*0G+I)H!Es8Dpnr]g3Gs8PIG3J[Y7s6PV-PW<76s,[3Q
-q"]^FargZ\+"2-L+92B)Ld.%E0_rchs8N$HIin^jreJP<5!T(.p-g(G+3-A@s-,b@
-q"]^Fs8VG5U&8p1r-tF`r]Xc^O8o#Ck9'0`L[kEErKmdb?]US%J,^KBrr4Br*97(u
-;#!?
-9Re/)a?fk(J,^i[jU_@rr`K3\s5W.V3<0$S1&ptrIj#'sr."bF8,rV4+92B3L]
`%T)6s:ur0`jU^Si3X?oj#cI5$NZo<../AYu+e3LW
-`'f!*NZjP$8,R6(+91mK+7^D$s,RQe6BC1,s8W*k+#\B>LQD!#^]006deAlbj=(%i
-cMs!Ar]n*qr"2;\3t)[MO8o7[s7hZ9.0'>Hs,Y*JM#[M@q&'+_j='(;s8W-!kTYf[
-J&hS=a6A`&?fWWqq1o"%nhL1E+J=5as8W,sKcg5Bs7,ft&cBQHs5[\br^)W3O8o7[
-rb24WEW?'Zcm'(s$97/i0`F<97R-q6'G(6)0L,U;YN.,23<0$=m=$:II)GaZq&'*^
-IR9&]O8n8p5QCaC$ND1fJ,fPhne?R-q1nM7s8U.>ne`J#s+C6'+34E]s+GCl+#*`T
-n,NFK.0'=/_#D+Kr]WRHs851^6BC7Nr-eV@2$8oF3[:@[,G7Vm3CB#k6^0PQ9?8-p
-@"23I7!(peF@S`@7mqGh7!(peF;OuPLkrE*"7eDg"EFJ>K0]J:s8W)W"lnZ$T^dU:
-ZV[HN'sIQ#N=g8<+G/+;$?DZ7.E@QgJd@Bg.IhEf,Da_HOD>h(>^$bl&;%u<%un@(
-s7l`VO6@dCc(E6i8,d69&7:+'N.8oaO.:^j%>0K:=9&<\j?^WjoF):\r]WSuru]1/
-r8[h:&7>J;j5`MHs8O/`5lZKRs8I$T&3o4Ts8W'0?iU0+j8]/ZrX`H:s8V-Zs8W'0
-?iU0+j8]/ZrX`H:s8RoTs8W'd*$E#rnc/.Zs,[(Es8G<(na[g]s8VWm&-)\0r]cM!
-Lu^l$C12AniFcIa=lC(c3"u<7a>isM*)_:ds79mDnbu!BO,nejYlFWNs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r.a!Ha20:q*@LkCEA,BG%R?\-"Tsi7
-*.^BRs8Kq9nc/+k&b60Z9G8Cu,T=`S_4ZE+*saC5j$=Z-5lr:hO?eWs7i_^E*9\N$
-kTc.KUS,XnNfa:;#bf\";l'bt8Q(TU+^lO5PrMBf8<8'$W3Q35]);`X2NTg8#,i@b
-O>@?#^EJ[U_i@)4F)f5C5i`hR,lE[-(dbk4ni*(.f.:sTX/"WS
-EI
-Q
-BT
-286.08 85.92 TD
-0 0 0 rg
-/N8 12 Tf
--0.0086 Tc
-0.0326 Tw
-(Figure 1)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Page: 7 7
-%%BeginPageSetup
-userdict /pgsave save put
-PDFVars begin PDF begin PDFVars/InitAll get exec
-%%EndPageSetup
-0 0 612 792 RC
-BT
-303.6 36 TD
-0 0 0 rg
-/N6 9.84 Tf
-0.0019 Tc
-0 Tw
-(7)Tj
--231.6 676.08 TD
-/N6 12 Tf
-0.1058 Tc
--0.1418 Tw
-(The impact of this policy on the relative execution times of the three a\
-pplications is shown in Fig-)Tj
-0 -14.16 TD
-0.0714 Tc
--0.2345 Tw
-(ure 2. Because the coarse application acquires more CPU time, it finish\
-es its work earlier than the)Tj
-0 -13.92 TD
-0.0967 Tc
--0.2527 Tw
-(other applications, even though all three jobs require the same amount o\
-f time in a dedicated envi-)Tj
-T*
-0.1286 Tc
-0 Tw
-(ronment)Tj
-0 -290.4 TD
-/N8 13.92 Tf
-0.0697 Tc
--0.0611 Tw
-(Project Requirements)Tj
-0 -24.72 TD
-/N6 12 Tf
-0.1132 Tc
-1.2458 Tw
-(For your project, you need to implement code that is similar in function\
-ality to the Solaris TS)Tj
-0 -13.92 TD
-0.1128 Tc
--0.0954 Tw
-(scheduler, but your code does not have to be structured in the same way.\
- Implement your code in)Tj
-0 -14.16 TD
-0.1186 Tc
--0.0253 Tw
-(whatever manner you find easiest when interfacing with the already exist\
-ing Nachos code. )Tj
-0 -24 TD
-0.0825 Tc
-0.2743 Tw
-(Specifically, you are not required to separate the class-independent and\
- class-dependent schedul-)Tj
-0 -13.92 TD
-0.1074 Tc
-0.6886 Tw
-(ing functionality. You do not need to support multiple scheduling class\
-es. You can implement)Tj
-T*
-0.13 Tc
-0.419 Tw
-(any routines that you feel are necessary, not just the seven functions w\
-e specifically listed. You)Tj
-0 -14.16 TD
-0.1262 Tc
--0.0593 Tw
-(can pass any parameters that you find helpful.)Tj
-0 -24 TD
-0.068 Tc
-1.416 Tw
-(However, it is important that your approach be table-driven, with a user\
--configurable dispatch)Tj
-0 -13.92 TD
-0.1033 Tc
-0.154 Tw
-(table. Your table should be initialized to the default values in Solari\
-s 2.6, but you may also want)Tj
-T*
-0.1348 Tc
-0.3492 Tw
-(to experiment with different configurations. To demonstrate the functio\
-nality of your scheduler,)Tj
-0 -14.16 TD
-0.1051 Tc
-0.3089 Tw
-(you may want to print out the change in priorities of several different \
-competing processes, as in)Tj
-0 -13.92 TD
-0.0405 Tc
-0.1635 Tw
-(Figure 1. )Tj
-ET
-1 1 1 rg
-150.96 432 315.12 225.12 re
-f
-q
-315.12 0 0 225.12 150.96 432 cm
-BI
- /Width 341
- /Height 252
- /BitsPerComponent 1
- /ColorSpace /DeviceGray
- /Decode [1 0 ]
- /DecodeParms [null <> ]
- /Filter [/ASCII85Decode /CCITTFaxDecode ]
-ID
--D5T@*#T_R#j@>3`c+g8+WV0Tfc1\<_$Ju0_BXXE`^^,YNXB)_TA[R+A:+?CLE*3A
-cXe*VS9']+%s"dE_M87$4L*'"XLs09$?CnbQ$-HLT#"/]6"dKqK-ifZ5c>5sGST*A
-('rsj";T%>n;8=KHk8UMj2""b-9Z<61Ch;jHNX\,"MoRQK%C,5ru2E%fMDO."onU]
-+Gu3`s1ub9s,ZeB^[OLe&3u1=s6("HM"grK#S\sY"mD"so%s^+Qf%]P?fV/rK.?p#
-+Ft&`5Q?BBE.8u%$H3'Q`#qF.A+CK[83)GJG\.lJa!%Pi]`\of!lcDINe/_LOL_]m
-&!;pG@$c]Ls8W-!s8W-!s8W-!q=Bu+i`VE4_;c]*Bb0DMM!-%T7!Xl/FGMK.69hF'kn1c$V^i+[LEZ/f4es=0Jgc$"
-TKs19:e2-pJj=la*g7EP6jgsX?P&QdO0/kpj'fuadR0WVrK69;4jYG[j.JpS>f3A(
-,DM:660o.*j5@`^U#<`rTTYD?i].Et-ZFZ'+M#9hVNU`D77'>,BZOg+[iku9j>*GQ
-'KSVtLE-FMrV6U-#cAei.Re%_4@0#?4bB2ELH+JfLD68n.hFuP@0Al`J(NW\TKt8=
-jEqM9q&]_T#`:oC;kX@d-+2)cI"21rlnK)@c4U\SJgc,_?[r+5q?16r8KnS\TXnZQ
-=8p,\6f\*?(Ud87/_(c7D8&9Zss00M:V1Kr9TuAUerWqQAJ"T7Q
-Jd(:?ThEf^I"jmD^6;tZ6'aJr&,sQ[8VGVbYK,UT
-OouFHEMWG9CM]C&5nssK/dehE5ns!F&B#cJKNICb#V_E,Ml#I06'^AZ3Zs'P#X:r@
-&OV3`("E?lpdpA8&jZSBr<,ENGo[)#64uoWI4088q?\Z$oA5Zs";F0.7mR:#++bn]
-LXKT[$kC69s6(d9aUXM%`->K$#rf4YV;S_6J!%WR4X(-KUd#-_2C,8C
-JZg:=+o**8aS.t34h*cg[A?H9J?K7\5qHu,'GZn#5nH/6k^!f*i?AMrTY2gIHkklK
-\Ju(C:dGVbJL%p*+I-@T5f#U"opJd;oT
-4:II*";!&H:cO-%";$WeJHR2&Uk0a[KQ6XI$%k+JdU6d7NhZ#S;Y#s5q7N+IB9oNg(YPD-rre"eE
-O?jK*=X!Eg"??CG!XNl0&d/c!$F/"b+JYPc&4!2rjD\%nU(B]g5_026S-=./,Sq\W
-SKNM/*$C%/JdLK;9t[s";8aG
-+B/pn"eEdUL99\gUcgImC')fh+ID:T+Fse`X8#+DYU#<$G(n#X5ls<'cp\F3:k)"Y
-5nVIL1,s##"G-tFNYEUi!rmoZ+UB7F_FPf83'ef$=`L5C+[KLfdKgD;&B#1$dRYYi
-&G1Q>M!-BKKFf7m&f_c/(%jirNY2I+TY2T^5nAX3#U/t.O<@,>8HK5_P!K0AJHX'X
-00pnFWX'70JHX'X0*DhP"Wp#U&2-Qc82!73#U"oP&d`kTNa[0(63quB+YQBUJg6r%
-":-:q8HK//qPZ[jTRd4[HmTg)JdWa2)PFT/59lhQNg%Ckq4!4i7QCpOaDHr)CiUJ)
-OP:b0d/F"Elp(O?s8O3R)\%&o80Fl71uQ_J:(IIbLHH-tZClrB)E:/G%9J3]TRd^E
-MKBCtF:h9PMKgO<4,+hHG-QOQRF\0qo3XmJ:ddXml^Bc"PJNs1O?6;Kr?`3o#
-lLGC&GVG#&L62/eI`#TeCc3+Qp)=,?2B*/LAfD2.6Qe+=*/7;Pj,QBUa>AoKq&Hmu
-Km3@RD`E`Z=QOg08&D@..Lfd^Ab2<1i.<2H8.\J4r/ZF85ob=[!XXOr&b&(?YYW@%
-"nipcr-Jo4s'bq9Da9GEs6rN#5`q)!hLP_3o9eLQJe3JDrX^7B@"eXb#X/eC_6,!c
-6']N,O7&?j^]XX&~>
-EI
-Q
-BT
-286.08 414 TD
-0 0 0 rg
-/N8 12 Tf
--0.0086 Tc
-0.0326 Tw
-(Figure 2)Tj
-ET
-PDFVars/TermAll get exec end end
-userdict /pgsave get restore
-showpage
-%%PageTrailer
-%%EndPage
-%%Trailer
-%%DocumentProcessColors: Cyan Magenta Yellow Black
-%%EOF
diff --git a/doc/mlfqs.texi b/doc/mlfqs.texi
index 253f91b..2ac1780 100644
--- a/doc/mlfqs.texi
+++ b/doc/mlfqs.texi
@@ -356,7 +356,12 @@ consumes its timeslice, its priority is lowered about ten levels Since
the coarse job runs more frequently, it drops in priority at a faster
rate than the other two jobs.
+@ifnottex
@image{mlfqs1}
+@end ifnottex
+@iftex
+@image{mlfqs1, 3in}
+@end iftex
The impact of this policy on the relative execution times of the three
applications is shown in the next graph below. Because the coarse
@@ -364,7 +369,12 @@ application acquires more CPU time, it finishes its work earlier than
the other applications, even though all three jobs require the same
amount of time in a dedicated environment.
+@ifnottex
@image{mlfqs2}
+@end ifnottex
+@iftex
+@image{mlfqs2, 3in}
+@end iftex
@node Project Requirements
@section Project Requirements
diff --git a/doc/pintos.texi b/doc/pintos.texi
new file mode 100644
index 0000000..1dd83fd
--- /dev/null
+++ b/doc/pintos.texi
@@ -0,0 +1,80 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename projects.info
+@settitle Pintos Projects
+@c %**end of header
+
+@c @bibref{} macro
+@iftex
+@macro bibref{cite}
+[\cite\]
+@end macro
+@end iftex
+@ifinfo
+@ifnotplaintext
+@macro bibref{cite}
+@ref{\cite\}
+@end macro
+@end ifnotplaintext
+@ifplaintext
+@macro bibref{cite}
+[\cite\]
+@end macro
+@end ifplaintext
+@end ifinfo
+@ifhtml
+@macro bibref{cite}
+[@ref{\cite\}]
+@end macro
+@end ifhtml
+
+@macro func{name}
+@code{\name\()}
+@end macro
+
+@macro struct{name}
+@code{struct \name\}
+@end macro
+
+@titlepage
+@title Pintos
+@author by Ben Pfaff
+@author based on past contributions of CS 140 TAs
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top Pintos Projects
+@end ifnottex
+
+@menu
+* Introduction::
+* Pintos Tour::
+* Project 1--Threads::
+* Project 2--User Programs::
+* Project 3--Virtual Memory::
+* Project 4--File Systems::
+* References::
+* Multilevel Feedback Scheduling::
+* Coding Standards::
+* Project Documentation::
+* Debugging Tools::
+* Development Tools::
+@end menu
+
+@include intro.texi
+@include tour.texi
+@include threads.texi
+@include userprog.texi
+@include vm.texi
+@include filesys.texi
+@include references.texi
+@include mlfqs.texi
+@include standards.texi
+@include doc.texi
+@include debug.texi
+@include devel.texi
+
+@bye
diff --git a/doc/projects.texi b/doc/projects.texi
deleted file mode 100644
index b5b08f5..0000000
--- a/doc/projects.texi
+++ /dev/null
@@ -1,78 +0,0 @@
-\input texinfo @c -*- texinfo -*-
-@c %**start of header
-@setfilename projects.info
-@settitle Pintos Projects
-@c %**end of header
-
-@c @bibref{} macro
-@iftex
-@macro bibref{cite}
-[\cite\]
-@end macro
-@end iftex
-@ifinfo
-@ifnotplaintext
-@macro bibref{cite}
-@ref{\cite\}
-@end macro
-@end ifnotplaintext
-@ifplaintext
-@macro bibref{cite}
-[\cite\]
-@end macro
-@end ifplaintext
-@end ifinfo
-@ifhtml
-@macro bibref{cite}
-[@ref{\cite\}]
-@end macro
-@end ifhtml
-
-@macro func{name}
-@code{\name\()}
-@end macro
-
-@macro struct{name}
-@code{struct \name\}
-@end macro
-
-@titlepage
-@title Pintos Projects
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top, Introduction, (dir), (dir)
-@top Pintos Projects
-@end ifnottex
-
-@menu
-* Introduction::
-* Pintos Tour::
-* Project 1--Threads::
-* Project 2--User Programs::
-* Project 3--Virtual Memory::
-* Project 4--File Systems::
-* References::
-* Multilevel Feedback Scheduling::
-* Coding Standards::
-* Project Documentation::
-* Debugging Tools::
-* Development Tools::
-@end menu
-
-@include intro.texi
-@include tour.texi
-@include threads.texi
-@include userprog.texi
-@include vm.texi
-@include filesys.texi
-@include references.texi
-@include mlfqs.texi
-@include standards.texi
-@include doc.texi
-@include debug.texi
-@include devel.texi
-
-@bye
diff --git a/doc/threads.texi b/doc/threads.texi
index 04d48d1..63aed69 100644
--- a/doc/threads.texi
+++ b/doc/threads.texi
@@ -15,9 +15,8 @@ Before you read the description of this project, you should read all
of the following sections: @ref{Introduction}, @ref{Coding Standards},
@ref{Project Documentation}, @ref{Debugging Tools}, and
@ref{Development Tools}. You should at least skim the material in
-@ref{Threads Tour}, but there's no need to fret over the details. To
-complete this project you will also need to read @ref{Multilevel
-Feedback Scheduling}.
+@ref{Threads Tour}. To complete this project you will also need to
+read @ref{Multilevel Feedback Scheduling}.
@menu
* Understanding Threads::
@@ -131,7 +130,7 @@ gets initialized.
@item thread.c
@itemx thread.h
Basic thread support. Much of your work will take place in these
-files. @file{thread.h} defines @code{struct thread}, which you will
+files. @file{thread.h} defines @struct{thread}, which you will
modify in the first three projects.
@item switch.S
@@ -407,7 +406,7 @@ should implement @func{thread_join} to have the same restriction.
That is, a thread may only join its immediate children.
A thread need not ever be joined. Your solution should properly free
-all of a thread's resources, including its @code{struct thread},
+all of a thread's resources, including its @struct{thread},
whether it is ever joined or not, and regardless of whether the child
exits before or after its parent. That is, a thread should be freed
exactly once in all cases.
diff --git a/doc/tour.texi b/doc/tour.texi
index ae9e74e..ee90cca 100644
--- a/doc/tour.texi
+++ b/doc/tour.texi
@@ -204,7 +204,7 @@ threads to continue running.
@end menu
@node struct thread
-@subsection @struct{thread}
+@subsection @code{struct thread}
The main Pintos data structure for threads is @struct{thread},
declared in @file{threads/thread.h}. @struct{thread} has these
@@ -283,6 +283,7 @@ memory. The rest of the page is used for the thread's stack, which
grows downward from the end of the page. It looks like this:
@example
+@group
4 kB +---------------------------------+
| kernel stack |
| | |
@@ -304,6 +305,7 @@ grows downward from the end of the page. It looks like this:
| name |
| status |
0 kB +---------------------------------+
+@end group
@end example
The upshot of this is twofold. First, @struct{thread} must not be
@@ -346,8 +348,8 @@ called early in Pintos initialization.
Called by @func{main} to start the scheduler. Creates the idle
thread, that is, the thread that is scheduled when no other thread is
ready. Then enables interrupts, which enables the scheduler because
-processes are rescheduled in the return path from the timer
-interrupt. FIXME
+processes are rescheduled on return from the timer interrupt, using
+@func{intr_yield_on_return} (@pxref{External Interrupt Handling}).
@end deftypefun
@deftypefun void thread_create (const char *@var{name}, int @var{priority}, thread_func *@var{func}, void *@var{aux})
diff --git a/doc/userprog.texi b/doc/userprog.texi
index 72ab256..da9fe3d 100644
--- a/doc/userprog.texi
+++ b/doc/userprog.texi
@@ -478,25 +478,25 @@ because there's no way to return an error code from a memory access.
Therefore, for those who want to try the latter technique, we'll
provide a little bit of helpful code:
-@example
+@verbatim
/* Tries to copy a byte from user address USRC to kernel address DST.
Returns true if successful, false if USRC is invalid. */
-static inline bool get_user (uint8_t *dst, const uint8_t *usrc) @{
+static inline bool get_user (uint8_t *dst, const uint8_t *usrc) {
int eax;
asm ("movl $1f, %%eax; movb %2, %%al; movb %%al, %0; 1:"
: "=m" (*dst), "=&a" (eax) : "m" (*usrc));
return eax != 0;
-@}
+}
/* Tries write BYTE to user address UDST.
Returns true if successful, false if UDST is invalid. */
-static inline bool put_user (uint8_t *udst, uint8_t byte) @{
+static inline bool put_user (uint8_t *udst, uint8_t byte) {
int eax;
asm ("movl $1f, %%eax; movb %b2, %0; 1:"
: "=m" (*udst), "=&a" (eax) : "r" (byte));
return eax != 0;
-@}
-@end example
+}
+@end verbatim
Each of these functions assumes that the user address has already been
verified to be below @code{PHYS_BASE}. They also assume that you've
@@ -592,7 +592,7 @@ This value, the exit status of the process, must be returned to the
thread's parent when @func{join} is called.
@item
-@b{Can I just cast a pointer to a @code{struct file} object to get a
+@b{Can I just cast a pointer to a @struct{file} object to get a
unique file descriptor? Can I just cast a @code{struct thread *} to a
@code{pid_t}? It's so much simpler that way!}
@@ -688,7 +688,7 @@ some of your caches. This is why inlining code can be much faster.
@end menu
@node Argument Passing to main
-@subsection Argument Passing to @func{main}
+@subsection Argument Passing to @code{main()}
In @func{main}'s case, there is no caller to prepare the stack
before it runs. Therefore, the kernel needs to do it. Fortunately,
@@ -807,12 +807,12 @@ You may find the non-standard @func{hex_dump} function, declared in
Here's what it would show in the above example, given that
@code{PHYS_BASE} is @t{0xc0000000}:
-@example
+@verbatim
bfffffc0 00 00 00 00 | ....|
bfffffd0 04 00 00 00 d8 ff ff bf-ed ff ff bf f5 ff ff bf |................|
bfffffe0 f8 ff ff bf fc ff ff bf-00 00 00 00 00 2f 62 69 |............./bi|
bffffff0 6e 2f 6c 73 00 2d 6c 00-2a 2e 68 00 2a 2e 63 00 |n/ls.-l.*.h.*.c.|
-@end example
+@end verbatim
@node System Calls
@section System Calls
@@ -868,4 +868,4 @@ In this example, the caller's stack pointer would be at
The 80@var{x}86 convention for function return values is to place them
in the @samp{EAX} register. System calls that return a value can do
-so by modifying the @samp{eax} member of @code{struct intr_frame}.
+so by modifying the @samp{eax} member of @struct{intr_frame}.
diff --git a/doc/vm.texi b/doc/vm.texi
index 4d495d4..64619c8 100644
--- a/doc/vm.texi
+++ b/doc/vm.texi
@@ -131,6 +131,7 @@ address.
@end enumerate
@example
+@group
32 22 12 0
+--------------------------------------------------------------------+
| Page Directory Index | Page Table Index | Page Offset |
@@ -158,6 +159,7 @@ address.
1|____________| | 1|____________| | |____________|
0|____________| \__\0|____________| \____\|____________|
/ /
+@end group
@end example
Header @file{threads/mmu.h} has useful functions for various
@@ -471,7 +473,7 @@ true if the first is less than the second. These two functions have
to be compatible with the prototypes for @code{hash_hash_func} and
@code{hash_less_func} in @file{lib/kernel/hash.h}.
-Here's a quick example. Suppose you want to put @code{struct thread}s
+Here's a quick example. Suppose you want to put @struct{thread}s
in a hash table. First, add a @code{hash_elem} to the thread
structure by adding a line to its definition:
@@ -479,7 +481,7 @@ structure by adding a line to its definition:
hash_elem h_elem; /* Hash table element. */
@end example
-We'll choose the @code{tid} member in @code{struct thread} as the key,
+We'll choose the @code{tid} member in @struct{thread} as the key,
and write a hash function and a comparison function:
@example
@@ -493,7 +495,8 @@ thread_hash (const hash_elem *e, void *aux UNUSED)
/* Returns true if A's tid is less than B's tid. */
bool
-thread_less (const hash_elem *a_, const hash_elem *b_, void *aux UNUSED)
+thread_less (const hash_elem *a_, const hash_elem *b_,
+ void *aux UNUSED)
@{
struct thread *a = hash_entry (a_, struct thread, h_elem);
struct thread *b = hash_entry (b_, struct thread, h_elem);
@@ -509,7 +512,7 @@ struct hash threads;
hash_init (&threads, thread_hash, thread_less, NULL);
@end example
-Finally, if @code{@var{t}} is a pointer to a @code{struct thread},
+Finally, if @code{@var{t}} is a pointer to a @struct{thread},
then we can insert it into the hash table with:
@example