From: SMTP%"DSJ@WKUVX1.WKU.EDU" 18-JUL-1994 18:15:18.80 To: EVERHART CC: Subj: JUNE94.SCHED X-FileServer: Digital Systems Journal File Server Date: Mon, 18 Jul 1994 17:14:26 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: JUNE94.SCHED To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : SCHED $! By : Hunter Goatley $! Date : 8-JUN-1994 14:44:20.52 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. SCHED.DSJ;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X X X X X`5Binsert`201`5D X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20$`20MCR`20SYSMAN X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SYSMAN>`20PARAM`20USE`20CURREN VT X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SYSMAN>`20PARAM`20SET`20LOAD_S VYS_IMAGES`201`20`20`20`20`20!`20May`20already`20be`201 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SYSMAN>`20PARAM`20WRITE`20CURR VENT X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SYSMAN>`20SYS_LOAD`20ADD`20VMS V`20CLASS_SCHEDULER X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SYSMAN>`20EXIT X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20$`20@SYS$UPDATE:VMS$SYSTEM_IMA VGES X X== X X`5Binsert`202`5D X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20EXE$SCHED`20`20`20`20`20`20`20 V`20`20-`20The`20SYS$SCHED`20System`20Service X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SCH$CLASS_QEND`20`20`20`20-`20 VQuantum`20End`20processing X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SCH$CLASS_IDLE`20`20`20`20-`20 VScheduler`20Idle`20Loop`20routine X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SCH$CLASS_PIXSCAN`20-`20PIXSCA VN`20for`20Class`20Scheduled`20processes X X== X X`5Binsert`203`5D X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PCB$V_CLASS_SCHEDULED`20-`20Pr Vocess`20is`20Class`20Scheduled X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PCB$V_CLASS_SUPPLIED`20-`20Pro Vcess`20is`20assigned`20a`20Scheduling`20Class X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PCB$V_IN_TBS_STATE`20-`20Quant Vum`20exhausted`20-`20Temp`20Bypass`20Scheduling X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20PCB$V_WINDFALL`20-`20Process V`20eligible`20for`20windfall`20CPU X X== X X`5Binsert`204`5D X X X`20`20`20`20`20`20`20`20SYS$SCHED(func,`20p1,`20p2,`20p3) X`20`20`20`20`20`20`20`20func:`20function`20code,`20read-only`20by`20value X`20`20`20`20`20`20`20`20p1,`20p2,`20p3:`20`20`20parameter`201,`202,`20and`203, V`20usage`20varies`20by`20function`20code X X== X X`5Binsert`205`5D X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20;`20Infinite`20loop`20in`20MAC VRO! X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.entry V`20`20main,0 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`2010$:`20`20`20`20brb`20`20`20 V`20`2010$ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.end V`20main X X== X X X`5Bfigure`201`5D X XCLASS_SCHED.C`5D X X/* X`20*`20`20`20`20`20`20CLASS_SCHED`20`20`20`20`20--`20Sample`20Class`20Schedule Vr X`20* X`20*`20`20`20`20`20`20A`20simple`20sample`20Class`20Scheduler`20process`20to V`20pool`20all`20jobs`20with`20the`20same X`20*`20`20`20`20`20`20ACCOUNT`20field`20into`20a`20single`20scheduling`20class V,`20and`20limit`20those`20classes X`20*`20`20`20`20`20`20to`2015%`20of`20the`20CPU.`20`20Quantum`20is`20granted V`20to`20Classes`20at`201`20second X`20*`20`20`20`20`20`20intervals. X`20* X`20*`20`20`20`20`20`20NOTE:`20CSH$_READ_ALL`20is`20not`20used,`20since`20we`20 Vonly`20want`20to`20know`20about X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20processes`20we`20haven't`20seen. V`20`20Once`20class`20scheduled,`20we`20don't X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20really`20care`20to`20see`20it`20 Vagain...`20`20For`20the`20first`20invocation, X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20CSH$_READ_NEW`20and`20CSH$_READ_ VALL`20will`20be`20equivalent. X`20* X`20*`20Author:`20`20`20`20`20`20David`20L.`20Cathey`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20davidc@montagar.com X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20Montagar`20Software`20Concepts X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20P.`20O.`20Box`20260772 X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20Plano,`20TX`20`2075026-0772 X`20* X`20*`20Date:`20`20`20`20`20`20`20`2026-FEB-1994 X`20*/ X X#include`20`20`20`20`20`20`20`20`7E`7Estdio.h> X#include`20`20`20`20`20`20`20`20`7E`7Estring.h> X#include`20`20`20`20`20`20`20`20`7E`7Ecshdef.h> X#include`20`20`20`20`20`20`20`20`7E`7Esyidef.h> X#include`20`20`20`20`20`20`20`20`7E`7Esignal.h> X Xint`20`20`20`20`20SYS$SCHED(),`20SYS$GETSYIW()`20;`20/*`20Sys`20Servs`20return Vs`20int`20status`20value`20*/ X Xchar`20`20`20`20*malloc()`20; X Xextern`20int`20exit()`20; X X#define`20TICKS`20`20`20`20`20`20`20`20`20`20`2050`20`20`20`20`20`20/*`2050% V`20of`20the`20ticks`20in`20a`201`20second`20interval`20*/ X#define`20MAXCLASS`20`20`20`20`20`20`20`208192`20`20`20`20/*`20VMS`20defined V`20maximum`20number`20of`20classes`20`20`20*/ X X/*`20The`20following`20two`20structures`20provide`20a`20pointer`20to`20an`20ar Vray`20of`20CSHx X`20*`20`20`20`20`20`20structures.`20`20Memory`20will`20be`20allocated`20for`20 Vthese`20structures`20based X`20*`20`20`20`20`20`20upon`20the`20value`20of`20the`20SYSGEN`20parameter`20MAC VPROCESSCNT,`20so`20this`20array X`20*`20`20`20`20`20`20will`20size`20itself`20automatically`20based`20upon`20sy Vstem`20configuration. X`20*/ XCSHP`20`20`20`20`20`20`20`20`20`20`20`20(*cshp_array)`5B`5D`20;`20`20`20`20`20 V`20`20/*`20Address`20to`20array`20of`20CSHP's`20`20`20*/ Xint`20`20`20`20`20`20`20`20`20`20`20`20`20cshp_size`20;`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20Returned`20size`20of`20CSHP`20`20`20`20`20`20`20`20*/ XCSHC`20`20`20`20`20`20`20`20`20`20`20`20(*cshc_array)`5B`5D`20;`20`20`20`20`20 V`20`20/*`20Address`20to`20array`20of`20CSHC's`20`20`20*/ Xint`20`20`20`20`20`20`20`20`20`20`20`20`20cshc_size`20;`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20Usable`20size`20of`20CSHC`20`20`20`20`20`20`20`20`20`20 V*/ Xint`20`20`20`20`20`20`20`20`20`20`20`20`20max_proc`20;`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20Maximum`20Process`20Count`20`20`20`20`20`20`20`20*/ X Xstruct`20class_entry`20`7B X`20`20`20`20`20`20`20`20char`20`20`20`20account`5B8`5D`20;`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20Account`20name`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20*/ X`7D`20class_list`5BMAXCLASS`5D`20;`20`20`20`20`20`20`20`20/*`208192`20Class`20 VEntries,`20maximum`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20number`20of`20classes`20available`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X Xint`20`20`20`20`20quantum_array`5BMAXCLASS`5D`20;`20/*`20Array`20to`20be`20fil Vled`20in`20class`20quantums`20`20*/ Xint`20`20`20`20`20max_class`20=`200`20;`20`20`20`20`20`20`20`20`20/*`20Our`20m Vaximum`20defined`20classes`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X X/* X`20*`20`20`20`20`20`20SCHED_PROCESS_NEW`20-`20Get`20all`20processes`20that`20h Vave`20not`20been`20assigned X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20a`20scheduling`20class.`20`20Ass Vign`20them`20a`20class`20based`20upon`20the X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20ACCOUNTING`20field`20returned. V`20`20Exception:`20`20Any`20process`20with`20a X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20base`20priority`20above`204`20is V`20exempt`20from`20class`20scheduling`20and X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20assigned`20a`20class`20of`20-1 V`20(not`20class`20scheduled). X`20*/ Xsched_process_new() X`7B X`20`20`20`20`20`20`20`20int`20`20`20`20`20status`20; X`20`20`20`20`20`20`20`20int`20`20`20`20`20i`20; X X`20`20`20`20`20`20`20`20/* X`20`20`20`20`20`20`20`20`20*`20Read`20new`20processes. X`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20cshp_size`20=`20CSHP$K_LENGTH`20*`20max_proc`20; X`20`20`20`20`20`20`20`20status`20=`20SYS$SCHED(CSH$_READ_NEW,`20cshp_array,`20 V`26cshp_size,`20`26cshp_size); X`20`20`20`20`20`20`20`20if(!(status`20`26`201)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(status)`20; X`7D X X/* X`20*`20`20`20`20`20`20SCHED_CHOOSE_CLASSES`20`20`20`20--`20Read`20the`20CSHP V`20structures`20and`20initialize X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20the`20CSHC`20structures`20with V`20the`20correct`20Scheduling`20Class.`20`20Also X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20make`20sure`20that`20a`20Class V`20quanta`20is`20created. X`20*/ Xsched_choose_classes() X`7B X`20`20`20`20`20`20`20`20int`20`20`20`20`20i,`20j`20; X`20`20`20`20`20`20`20`20int`20`20`20`20`20use_class`20; X X`20`20`20`20`20`20`20`20cshc_size`20=`200`20; X`20`20`20`20`20`20`20`20for(i`20=`200`20;`20(i*CSHP$K_LENGTH)`20`7E`7E`20cshp_ Vsize`20;`20i++)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if(strncmp((*cshp_array)`5Bi V`5D.CSHP$T_ACCOUNT,`20"`7E`7Estart>`20",`208)`20==`200) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20use_cl Vass`20=`20-1`20;`20/*`20Don't`20class`20schedule`20system`20procs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20if((*cshp_array)`5Bi`5D V.CSHP$B_PRIB`20>`208) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20use_cl Vass`20=`20-1`20;`20/*`20Don't`20class`20schedule`20system`20procs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20N Von-system`20process,`20find`20the`20account`20for`20it.`20`20`20`20`20`20`20*/ V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20for(j V`20=`200`20;`20j`20`7E`7E`20max_class`20;`20j++)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20if(strncmp((*cshp_array)`5Bi`5D.CSHP$T_ACCOUNT, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20class_list V`5Bj`5D.account,`208)`20==`200) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20break`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20N Vew`20class,`20fill`20in`20account`20and`20increment`20max_class`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if(j V`20>=`20max_class)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20memcpy(class_list`5Bj`5D.account, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20(*cshp_array)`5Bi`5D.CSHP$T_ACCOUNT, V`208)`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20max_class++`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20use_cl Vass`20=`20j`20;`20/*`20Mark`20our`20current`20class`20to`20use`20`20`20`20`20 V`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20/*`20end`20else`20if`20* V/ X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/* X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*`20Initialize`20CSHC`20str Vucture`20for`20the`20new`20process,`20no`20windfall X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(*cshc_array)`5Bi`5D.CSHC$L_EP VID`20=`20(*cshp_array)`5Bi`5D.CSHP$L_EPID`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(*cshc_array)`5Bi`5D.CSHC$W_CL VASS`20=`20use_class`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20(*cshc_array)`5Bi`5D.CSHC$W_WI VNDFALL`20=`200`20;`20/*`20No`20windfall`20now`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20cshc_size`20+=`20CSHC$K_LENGTH V`20; X`20`20`20`20`20`20`20`20`7D`20/*`20end`20for,`20get`20another`20process`20*/ X`7D X X/* X`20*`20`20`20`20`20`20SCHED_SET_QUANTUMS`20`20`20`20`20`20--`20Set`20up`20the V`20quantums`20for`20each`20class.`20`20A X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20class`20must`20have`20been`20def Vined`20before`20the`20call`20to`20CSH$_SET_CLASS, X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20since`20if`20the`20class`20is`20 Vnot`20defined`20beforehand,`20it`20will`20fail`20with X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20SS$_BADPARAM. X`20*/ Xsched_set_quantums() X`7B X`20`20`20`20`20`20`20`20int`20`20`20`20`20status`20; X`20`20`20`20`20`20`20`20int`20`20`20`20`20i,`20quant_size`20; X X`20`20`20`20`20`20`20`20/* X`20`20`20`20`20`20`20`20`20*`20Allocate`20TICKS`20cpu`20ticks`20for`20each`20S Vcheduling`20Class`20we`20need. X`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20for(i`20=`200`20;`20i`20`7E`7E`20max_class`20;`20i++) V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20quantum_array`5Bi`5D`20=`20TIC VKS`20; X X`20`20`20`20`20`20`20`20/*`20Set`20the`20quantum`20allocation`20for`20each`20c Vlass`20(max_class`20of`20them)`20*/ X`20`20`20`20`20`20`20`20quant_size`20=`20max_class`20*`204`20; X`20`20`20`20`20`20`20`20status`20=`20SYS$SCHED(CSH$_SET_QUANT,`20quantum_array V,`20`26quant_size,`200)`20; X`20`20`20`20`20`20`20`20if(!(status`20`26`201)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(status)`20; X`7D X X/* X`20*`20`20`20`20`20`20SCHED_SET_CLASSES`20`20`20`20`20`20`20--`20Set`20each`20 Vprocess`20into`20the`20defined`20classes X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20using`20the`20CSHC`20array`20bui Vlt`20by`20SCHED_CHOOSE_CLASSES X`20*/ Xsched_set_classes() X`7B X`20`20`20`20`20`20`20`20int`20`20`20`20`20status`20; X X`20`20`20`20`20`20`20`20status`20=`20SYS$SCHED(CSH$_SET_CLASS,`20cshc_array, V`20`26cshc_size, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`26CSHC$K_LENGTH)`20; X`20`20`20`20`20`20`20`20if(!(status`20`26`201)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(status)`20; X`7D X X/* X`20*`20`20`20`20`20`20Initialize`20our`20Class`20Scheduler: X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20Allocate`20the`20cshp_array`20ba Vsed`20upon`20MAXPROCESSCNT X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20Perform`20a`20READ_NEW`20to`20ge Vt`20all`20the`20processes X`20*/ Xinit_class_sched() X`7B X`20`20`20`20`20`20`20`20int`20`20`20`20`20status`20; X`20`20`20`20`20`20`20`20struct`20itemlist`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20short`20`20`20buflen`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20short`20`20`20code`20; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20int`20`20`20`20`20*bufadr`20; V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20short`20`20`20*retlen`20; X`20`20`20`20`20`20`20`20`7D`20itmlst`5B5`5D`20; X X`20`20`20`20`20`20`20`20/*`20Get`20MAXPROCESSCNT`20so`20we`20know`20how`20to V`20size`20our`20array`20of`20processes`20*/ X`20`20`20`20`20`20`20`20itmlst`5B0`5D.buflen`20=`204`20; X`20`20`20`20`20`20`20`20itmlst`5B0`5D.code`20=`20SYI$_MAXPROCESSCNT`20; X`20`20`20`20`20`20`20`20itmlst`5B0`5D.bufadr`20=`20`26max_proc`20; X`20`20`20`20`20`20`20`20itmlst`5B0`5D.retlen`20=`200`20; X`20`20`20`20`20`20`20`20itmlst`5B1`5D.buflen`20=`200`20; X`20`20`20`20`20`20`20`20itmlst`5B1`5D.code`20=`200`20; X`20`20`20`20`20`20`20`20status`20=`20SYS$GETSYIW(0,`200,`200,`20itmlst,`200, V`200,`200)`20; X`20`20`20`20`20`20`20`20if(!(status`20`26`201)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(status)`20; X X`20`20`20`20`20`20`20`20/* X`20`20`20`20`20`20`20`20`20*`20Allocate`20CSHP`20and`20CSHC`20arrays`20large V`20enough`20for`20MAXPROCESSCNT X`20`20`20`20`20`20`20`20`20*`20`20`20`20`20`20processes. X`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20cshp_array`20=`20(CSHP`20(*)`5B`5D)malloc(max_proc`20* V`20CSHP$K_LENGTH)`20; X`20`20`20`20`20`20`20`20cshc_array`20=`20(CSHC`20(*)`5B`5D)malloc(max_proc`20* V`20CSHC$K_LENGTH)`20; X`7D X X/* X`20*`20Main`20Routine X`20*/ Xmain() X`7B X`20`20`20`20`20`20`20`20init_class_sched()`20;`20`20`20`20`20`20`20`20`20`20 V`20`20/*`20Initialize`20our`20memory`20areas`20*/ X X`20`20`20`20`20`20`20`20while(1)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sched_process_new()`20;`20`20 V`20`20/*`20Find`20new`20processes`20`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sched_choose_classes()`20;`20/ V*`20Select`20classes`20for`20them`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sched_set_quantums()`20;`20`20 V`20/*`20Set`20up`20the`20class`20quanta`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sched_set_classes()`20;`20`20 V`20`20/*`20Set`20processes`20into`20classes`20`20*/ X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sleep(1)`20;`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Sleep`20for`20a`20second`20`20`20*/ X`20`20`20`20`20`20`20`20`7D`20/*`20end`20while`20*/ X`7D X X== X X X`5Bfigure`202`5D X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20VAX/VMS`20Monitor`20Utility X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20TOP`20CPU`20TIME`20PROCESSES X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20on`20node`20AVATAR X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`201-MAR-1994`2000:02:57 X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`200`20`20`20`20`20`20`20`20`2025`20`20`20`20`20 V`20`20`2050`20`20`20`20`20`20`20`2075`20`20`20`20`20`20`20100 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20+`20-`20-`20-`20-`20+`20-`20-`20-`20-`20+`20- V`20-`20-`20-`20+`20-`20-`20-`20-`20-+ X`20220014AC`20`20uucp`20cleanup`20`20`20`20`20`20`20`20`20`20`2028`20`20XXXXXX VXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`2022000C38`20`20CPUHOG_3`20`20`20`20`20`20`20`20`20`20`20`20`20`20`2017`20`20 VXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`2022000C37`20`20CPUHOG_2`20`20`20`20`20`20`20`20`20`20`20`20`20`20`2017`20`20 VXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20220014B5`20`20CPUHOG_1`20`20`20`20`20`20`20`20`20`20`20`20`20`20`2016`20`20 VXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`2022000AA2`20`20uucp`20->`20ondec X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`2022000095`20`20DECW$SERVER_0 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20+`20-`20-`20-`20-`20+`20-`20-`20-`20-`20+`20- V`20-`20-`20-`20+`20-`20-`20-`20-`20-+ X X== X X`5Bfigure`203`5D X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20VAX/VMS`20Monitor`20Utility X`20`20`20`20`20`20`20`20`20`20`20`20+-----+`20`20`20`20`20`20`20`20`20TIME`20I VN`20PROCESSOR`20MODES X`20`20`20`20`20`20`20`20`20`20`20`20`7C`20CUR`20`7C`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20on`20node`20AVATAR X`20`20`20`20`20`20`20`20`20`20`20`20+-----+`20`20`20`20`20`20`20`20`20`20`20 V`201-MAR-1994`2000:04:10 X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`200`20`20`20`20`20`20`20`20`2025`20`20`20`20`20 V`20`20`2050`20`20`20`20`20`20`20`2075`20`20`20`20`20`20`20100 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20+`20-`20-`20-`20-`20+`20-`20-`20-`20-`20+`20- V`20-`20-`20-`20+`20-`20-`20-`20-`20-+ X`20Interrupt`20Stack`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`2011 V`20`7CXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20MP`20Synchronization`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`7C X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20Kernel`20Mode`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`2015`20`7CXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20Executive`20Mode`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`201`20`7C X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20Supervisor`20Mode`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`7C X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20User`20Mode`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`2052`20`7CXXXXXXXXXXXXXXXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20Compatibility`20Mode`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`7C X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20 V`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`7C`20`20`20`20`20`20`20`20`20`20 V`7C X`20Idle`20Time`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`2020`20`7CXXXXXXXX X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20+`20-`20-`20-`20-`20+`20-`20-`20-`20-`20+`20- V`20-`20-`20-`20+`20-`20-`20-`20-`20-+ X $ call unpack SCHED.DSJ;1 1365241149 "" 23 1 1 $ v=f$verify(v) $ exit