IFE FTDISK+FTRC10+2,< TITLE SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK) > IFE FTDISK+FTRC10+1,< TITLE SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK) > SUBTTL CLKCSW R,KRASIN/AF/TH/RCC TS 02 JUNE 69 V421 XP VSCHED,421 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP INTERNAL FTRC10 ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA ; PRODUCTS DISK FILE) FOR SWAPPING. IFN FTRC10, < ENTRY RCXSKD ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM RCXSKD: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. INTERNAL XCKCSW > IFE FTRC10, < ENTRY XCKCSW > EXTERNAL JOB,JBTSTS EXTERNAL JBTQ,PJBSTS EXTERNAL PJBSTS,TIMEF,MJOBN INTERNAL NXTJOB,FTSWAP ;ACCUMULATOR DEFINITIONS --- QJ=DEVDAT ;QJOB WORD SW=TAC1 ;STATUS WORD J=ITEM ;JOB NO. ;INITIALIZE SCHEDULER (CALLED FROM SYSINI BEFORE ALL OTHER ; DEVICES ARE INITIALIZED) INTERNAL NXTINI XCKCSW: NXTINI: MOVEI TAC,MAXQ ;MAX. NO. OF QUEUES SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAIL. FLAGS SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT ; TO -, I.E. NO JOB WAITING OR ; USING DEVICE OTHER THAN INITIALIZATION SOJGE TAC,.-2 SETZM QJOB ;CLEAR NO. OF JOBS NEEDING REQUEING SETZM XJOB ;CLEAR NO. OF JOBS NEEDING EXPANDING SETZM JOBQUE ;CLEAR JOB NO. TO BE REQUEUED POPJ PDP, ,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT ,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0 ,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY ,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR. ,MAKES NO ASSUMPTIONS RE. ACS ,RETURSN NEXT JOB TO RUN IN J. EXTERNAL JBTSWP,POTLST NXTJOB: SKIPN TIMEF ;CLOCK TIC? JRST NXTJB1 ;NO MOVSI J,MJOBN ;YES MOVSI SW,-1 ;DECREMENT IN CORE PROTECT TIME MOVSI DAT,SWP TDNE DAT,JBTSTS(J) JRST .+3 SKIPL JBTSWP(J) ADDM SW,JBTSWP(J) AOBJN J,.-4 NXTJB1: SKIPN J,JOB ;CURRENT JOB NO., IS IT NULL JOB? JRST CKJB1 ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING MOVEI QJ,0 ;GET READY IN CASE CURRENT JOB UNRUNNABLE HLRZ SW,JBTSTS(J) ;GET JOB STATUS BITS AND CODES TRZ SW,RUNMSK+CMWB ;MASK OUT DO NOT CARE BITS CAIE SW,RUNABLE ;IS CURRENT JOB RUNABLE? JRST CKJB3 ;NO. REQUEU CURRENT JOB SKIPN TIMEF ;NO. IS THIS A TIME INTERRUPT? JRST CKJB1 ;NO. SOS SW,JBTSTS(J) ;DECREMENT QUANT. TIME TRNE SW,-1 ;HAS TIME GONE TO 0? JRST CKJB1 ;NO MOVEI DAT,QTIME ;YES---REQUEUE AND RESET QUANT. TIME MOVE TAC,JOBQUE PUSHJ PDP,QXFER CKJB1: SKIPG QJ,QJOB ;SET QJ NON ZERO IF ANY REQUEUING TO DO JRST CKJB5 ;NO REQUEUEING NECESSARY MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED CKJB2: MOVSI SW,JRQ ;JOB NEEDS REQUEUEING BIT TDNN SW,JBTSTS(J) ;THIS JOB? SOJG J,.-1 ;NO, KEEP LOOKING JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS? ; (MAY NOT FIND A KJOBED JOB IF HIGHEST ; GO DECR, COUNT QJOB ANYWAY) ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD MOVEI DAT,QCMW ;ASSUME COMMAND WAIT TLNN SW,CMWB ;IS JOB IN COMMAND WAIT? JRST CKJB9 ;NO. TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND? JRST CKJB4A ;YES. PUT JOB IN COMMAND WAIT Q CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q LDB SW,PJBSTS ;YES, GET QUEUE CODE. CAIN SW,WSQ ;*** EXPERIMENTAL *** JRST CKJB10 ;*** EXPERIMENTAL *** CAIN SW,TIOWQ ;CURRENT JOB GOING INTO TTY IO WAIT? HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1, ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE ; ELSE WANTS TO BE SWAPPED IN CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW) ; BUT JRQ WASN'T SET SO DON'T DECR QJOB SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE? SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK CKJB5: MOVEI QJ,AVLNUM ;CK AVAL FLAGS FOR SHAR. DEVS. CKJB6: SKIPN AVALTB(QJ) ;FLAG=0? SOJG QJ,CKJB6 ;YES - TRY NEXT ONE JUMPLE QJ,CKJB7 ;NO - OR FINISHED? HLR J,AVLQTB(QJ) ;NO--GET 1ST JOB IN Q CKJB6A: HRRE J,JBTQ(J) JUMPLE J,CKJB8 ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB MOVE DAT,JBTSTS(J) ;IS JOB IN CORE? TLNE DAT,SWP JRST CKJB6A ;NO, LOOK AT NEXT JOB IN THIS QUEUE ; TO SEE IF IN CORE. HRRZ DAT,AVLQTB(QJ) ;NO--GET TRANS. TABLE ADDRESS SETZM AVALTB(QJ) ;CLEAR AVAL FLAG CAIL QJ,MINQ ;LESS THAN MIN, SHARABLE DEV. Q? PUSHJ PDP,QXFER ;REQUEUE THE JOB AND PUT IT IN ; PROCESSOR Q SO SCHEDULER WILL RUN IT CKJB8: SOJG QJ,CKJB6 ;CONTINUE IF ANY MORE FLAGS TO LOOK AT CKJB7: ;NONE--GO SHUFFLE AND SWAP IFE FTSWAP,< EXTERNAL CHKSHF PUSHJ PDP,CHKSHF > IFN FTSWAP,< PUSHJ PDP,SWAP> ;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE ;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J SCHED: SETZM POTLST ;CLEAR POTENTIALLY LOST TIME FLAG MOVEI DAT,SSCAN ;ADDRESS OF SCAN TABLE JSP TAC,QSCAN ;BEGIN SCAN JRST SCHD1 ;NO MORE JOBS--RETURN NULLJOB SETOM POTLST ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1 MOVE QJ,JBTSTS(J) ;IS THIS JOB SWAPPED OUT TLNE QJ,SWP+SHF+JXPN ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE? JRST (TAC1) ;YES--CONTINUE SCAN,JOB CANNOT BE RUN HLREM TAC1,JOBQUE ;YES--SAVE ITS Q MOVSI QJ,WTMASK ;CLEAR WAIT CODE ANDCAM QJ,JBTSTS(J) SETZM POTLST ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN POPJ PDP, ;RETURN SCHD1: SETZ J, ;RETURN NULL JOB POPJ PDP, ;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON ; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68 CKJB10: SKIPE INFLG SKIPL JBTSWP(J) JRST CKJB4B MOVEI DAT,CKJBT JRST CKJB4A CKJBT: EXP EQFIX XWD QQTTY,-PQ2 ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS INFLG: 0 ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN. SUBTTL OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000 ,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION ,TYPE TO DEFINE NUMBER OF JOBS ,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION ,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED ,BY THEM. EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS INTERNAL QXFER,QSCAN,FTSWAP,FTDISK ,STORAGE: ,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD ,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS ,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q. ,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF. THE LINKS MAKING ,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE ,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND ,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD ,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE ,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE ,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE ,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN ,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER; ,LH(LINK)=BACKWARD POINTER. ,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND ,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ ,ITSELF IS THE Q-HEADER FOR Q 0). ,ROUTINES: ,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE ,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH ,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED. ;QUEUE INITIALIZATION ;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED) ;CALLED ON RESTART AT LOC 143 INTERNAL QINI EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ EXTERNAL JBTQP1 ;EQUALS JBTQ+1 EXTERNAL JBTQM1 ;EQUALS JBTQ-1 EXTERNAL JBTQMN ;EQUALS JBTQ-NULQ QINI: MOVNI TAC,MXQUE ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES HRL TAC,TAC ;BACKWARD POINTERS TOO MOVEM TAC,JBTQ(TAC) AOBJN TAC,.-1 MOVEI TAC,-NULQ ;PUT JOBS ALL IN NULQ QUEUE MOVSM TAC,JBTQP1 ;BACK POINTER FOR JOB 1 MOVEI ITEM,JOBMAX ;MAX. JOB NO. MOVEM TAC,JBTQ(ITEM) ;FOR. POINTER OF JOBMAX JOB NO. HRLM ITEM,JBTQMN ;SET NULQ HEADER TO POINT TO JOB1 MOVEI TAC,1 ;AND JOBMAX HRRM TAC,JBTQMN ;FORWARD POINTER QINI1: HRRM ITEM,JBTQM1(ITEM) ;JOB I-1 POINT TO JOB I SETZM JBTQ SOJLE ITEM,CPOPJ ;FINISHED? HRLM ITEM,JBTQP1(ITEM) ;BACK POINTER JOB I+1 POINTS TO JOB I JRST QINI1 ,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q" ,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT ,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY ,RESET THE JOB'S QUANTUM TIME (RH JBTSTS). ,THE DRIVING TABLES ARE "TRANSFER TABLES": , ,T.TABLE: EXP , XWD , , ,DEPENDING ON , THE SECOND WORD IS EITHER DATA OR THE ,ADDRESSES OF "CORRESPONDANCE TABLES". , ,THE PREFIX OF SPECIFIES WHETHER THE JOB IS TO BE ,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX ,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q. ,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS: ,DEST-Q AS A FIXED (PREDETERMINED Q: ,BQFIX: INSERT AT BEG OF DEST-Q ,EQFIX: INSERT AT END , , THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q , IF = -1, QUANT, TIME IS NOT RESET. , IF .G. 0 , QUANT. TIME IS RESET TO . , SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD , ALONE, O CORRES, TABLE IS NECESSARY. ,DEST-Q AS A FUNCTION OF SOURCE-Q ,BQLINK: INSRT AT BEG OF DEST-Q ,EQLINK: INSERT AT END , , =ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO , DEST-QS, , IF = -1, QUANT. TIME IS NOT RESET. , OTHERWISE IS TAKEN AS THE ADDRESS OF A , TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE. , FORMAT OF THE TABLES ARE: , , : XWD , ;1ST SOURCE-Q:DEST-Q PAIR , ... , XWD , ;NTH ... , Z ;ZERO TERMINATES TABLE , , : EXP ;CORRES. TO +0 , ... , EXP ;CORRES. TO +N-1 , Z , , UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES , THE SOURCE-Q (CURRENT Q) OF THE JOB. THE LH OF THE , ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE , RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET , (IF NOT -1) TO THE CORRES. ENTRY IN THE , TABLE. , IF NO MATCH FOUND..NO TRANSFER TAKES PLACE. ,DEST-Q AS A FUNCTION OF JOB SIZE ,BQJSIZ INSERT AT BEG OF DEST-Q ,EQJSIZ INSERT AT END , , =ADDRESS OF A TABLE ASSOCIATING JOB SIZE , (IN 1K BLOCKS) TO DEST-QS. , HAS SAME MEANING AS FOR B-EQLINK , , : XWD , , ... , XWD , , Z , , : SIMILAR TO THAT FOR B-EQLINK , , THE 'S MUST BE IN INCREASING ORDER. , THE TABLE IS SEARCHED UNTIL IS LESS THAN OR , EQUAL TO THE JOB SIZE, THEN THE CORRES. IS , TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO , TRANSFER TAKES PLACE, , QUANT, TIME IS HANDLED AS IN B-EQLINK. ,CALLING SEQUENCE: , MOVE J,[JOB NUMBER] , MOVE T2,[CURRENT Q] ;BQLINK AND EQLINK ONLY , MOVEI TT,TRANS TABLE ADDRESS , PUSHJ PDP,QXFER , ... ;RETURN , ON RETURN J IS UNALTERED; LH(Q)=-1 IF QUANT, TIME OUT , RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q , ,ACS: TT=DAT ;POINTER TO TRANSFER TABLE J=ITEM ;JOB NO. Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN T1=TAC1 ;TEMP T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINK EXTERNAL ERROR QXFER: MOVE Q,1(TT) ;GET TRANSFER TABLE ADDRESS JRST @(TT) ;DISPATCH ,DEST-Q AS FUNCTION OF SOURCE-Q QLINK: SKIPN T1,(Q) ;END OF TABLE? POPJ PDP, ;YES HLRE T1,T1 CAME T1,T2 ;NO--SOURCE-Q=LH(TABLE ENTRY)? AOBJP Q,QLINK ;NO- CONTINUE SEARCH JRST QX2 ,DEST-Q AS FUNCTION OF JOB SIZE QJSIZ: HLRZ T2,JBTADR(J) ;HIGHEST REL. LOC. OF JOB ASH T2,-^D10 ;CONVERT TO NO. OF 1K BLOCKS - 1. MOVSI T2,1(T2) ;NO. OF 1K BLOKS TO LH. QX1: SKIPN T1,(Q) ;END OF TABLE? JSP DAT,ERROR CAMLE T2,T1 ;JOBSIZE .LE. LH(TABLE ENTRY)? AOBJP Q,QX1 ;NO--CONTINUE SEARCH, JUMP ALWAYS. QX2: MOVS T2,Q ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED) HRRO Q,(Q) ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.) SKIPL 1(TT) ;WAS QUANT. TIME REQUESTED? HRL Q,(T2) ;YES--GET IT ,FIXED DEST-Q QFIX: MOVE T1,JBTQ(J) ;DELETE JOB FROM SOURCE-Q MOVS T2,T1 ;T1=FORW. LINK, T2=BACK LINK HRRM T1,JBTQ(T2) ;FORW, LINK PAST JOB HRLM T2,JBTQ(T1) ;BACK LINK PAST JOB SKIPGE (TT) ;END OR BEG. OF Q? HLR Q,JBTQ(Q) ;END--THIS WILL LEAVE Q=IDX OF ; CURRENT LAST LINK;T2=IDX OF Q-HEADER MOVE T2,JBTQ(Q) ;BEG--T2=IDX OF CURRENT 1ST LINK ; Q=IDX OF Q-HEADER HRRM J,JBTQ(Q) ;INSERT JOB IN DEST-Q HRLM J,JBTQ(T2) HRRM T2,JBTQ(J) HRLM Q,JBTQ(J) JUMPL Q,QX3 ;RETURN IF QUANT. TIME NOT REQ. HLRM Q,JBTSTS(J) ;SET QUANT. TIME MOVEI TT,RNQ ;SET JOB STATUS WAIT DPB TT,PJBSTS ;CODE TO RUN QUEUE (0). QX3: POPJ PDP, BQFIX=QFIX EQFIX=QFIX+1B0 BQLINK=QLINK EQLINK=QLINK+1B0 BQJSIZ=QJSIZ EQJSIZ=QJSIZ+1B0 ,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS. ,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS ,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ. ,THE SCAN TABLE HAS THE FORM: , ,SCANTAB: XWD , ;SCN Q1 ACCRDING TO CODE1 , ... , XWD , ;QN ACCORDING TO CODEN , Z ;ZERO TERMINATES TABLE , ,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY ,THE CODES ARE: , ,QFOR SCAN WHOLE Q FORWARD ,QFOR1 SCAN FOR ONLY THE 1ST MEMBER (IF ANY) ,QBAK SCAN WHOLE Q BACKWARD ,QBAK1 SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST , ,CALLING SEQ. , , MOVEI ST,SCAN TABLE ADDRESS , JSP PC,QSCAN ;SET UP PC FOR REPEATED RETURNS , ... ;RETURN HERE WHEN NO MORE JOBS , ... ;RETURN HERE WITH NEXT JOB IN AC J , ; AND ITS Q IN LH(QR) , , PERFORM ANY NECESSARY TESTING OF THIS JOB , J,ST,PC,QR MUST BE PRESERVED , , JRST (QR) ;RETURN TO QSCAN TO GET NEXT JOB , ; IF THIS ONE NOT ACCEPTABLE , ,ACS: J=ITEM ;JOB NO. ST=DAT ;POINTER TO SCAN TABLE PC=TAC ;RETURN ADDRESS QR=TAC1 ;ITERATED RETURN ADDRESS TO QSCAN QSCAN: SKIPN QR,(ST) ;END OF SCAN TABLE? JRST (PC) ;YES--RETURN TO CALL+1 HLRE J,QR ;NO--GET NO. OF Q JRST (QR) ;DISPATCH QFOR1: MOVEI QR,QFOR2 ;ONLY THE FIRST JOB QFOR: HRRE J,JBTQ(J) ;SCAN FORWARD ALL JOBS JUMPG J,1(PC) ;RETURN THIS JOB NO. CALL+2 UNLESS-- QFOR2: AOJA ST,QSCAN ;END OF THIS Q--GET NEXT Q QBAK1: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS EXCEPT 1ST SKIPLE JBTQ(J) ;IS THIS THE FIRST MEMBER? JRST 1(PC) ;NO--RETURN CALL+2 AOJA ST,QSCAN ;YES--GET NEXT Q QBAK: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS JUMPG J,1(PC) ;RETURN CALL+2 WITH JOB NO. UNLESS AOJA ST,QSCAN ;BEG OF THIS Q--GET NEXT Q INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL AVALTB DEFINE X(A,B),< EXTERNAL A'AVAL INTERNAL A'Q A'Q=ZZ ZZ=ZZ+1 > ZZ=0 QUEUES LOC=ZZ > IFE FTCHECK+FTMONP,< ;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO) ;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK ;AT THAT QUEUE TO FIND A JOB TO RUN ;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE) DEFINE X(A,B) INTERNAL AVALTB AVALTB: QUEUES ;GENERATE THE AVAL FLAGS LOC=.-AVALTB > NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE XP MAXQ,NQUEUE-1 ;MAX. STATE CODE WHICH HAS AN AVAL FLAG XP MINQ,STQ ;MINIMUM SHARABLE DEVICE QUEUE XP AVLNUM,MAXQ ;MAX. STATE CODE WHICH HAS AN AVAL FLAG ;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS DEFINE X(A) CODES XP MXCODE,LOC-1 ;MAX, JOB STATE DONE PQ1=LOC LOC=LOC+1 PQ2=LOC LOC=LOC+1 PQ3=LOC LOC=LOC+1 CMQ=LOC ;COMMAND DELAY QUEUE ;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES ;USED BY SCHEDULER ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE. ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX DEFINE X(A,B) < EXP Q'A'W > INTERNAL QBITS QBITS: QUEUES CODES IFN FTCHECK+FTMONP,< DEFINE X(A,B),< EXTERNAL A'REQ > QUEUES EXTERNAL REQTAB > IFE FTCHECK+FTMONP,< ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO) ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE ;WSREQ AND RNREQ ARE UNUSED DEFINE X(A,B) INTERNAL REQTAB REQTAB: QUEUES ;GENERATE REQ TABLE > ;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR. ;INDEX INTO TABLE ALSO = QUEUE CODE ;FOR SHARABLE DEVICES ONLY ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT ;STATE CODE. DEFINE X(A,B) < XWD -A'Q,Q'A'S > QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE QWSS=0 QTSS=0 INTERNAL AVLQTB AVLQTB: QUEUES IFN FTCHECK+FTMONP,< EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT ; DEPENDING ON FTRC10 IN SCHDAT IFN FTSWAP,< EXTERNAL XJOB >> IFE FTCHECK+FTMONP,< INTERNAL JOBQUE JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT INTERNAL QJOB QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL IFN FTSWAP,< XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN INTERNAL XJOB > > INTERNAL QSTOP,QTIME,SSCAN,QCMW BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE EQFIX=QFIX+1B0 ;END OF QUEUES " " " BQLINK=QLINK EQLINK=QLINK+1B0 BQJSIZ=QJSIZ EQJSIZ=QJSIZ+1B0 DEFINE TTAB(FCTN,QUEUE,QUANT) < EXP FCTN XWD QUANT,-QUEUE > DEFINE PTTAB(FCTN,QUEUE,QUANT) < EXP FCTN XWD QUANT,QUEUE > QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY) ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME ;ACCORDING TO JOB SIZE QTSW: TTAB BQFIX,PQ1,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ11) QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ QAUW: TTAB EQFIX,AUQ,-1, QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK) QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO ;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE ;DO NOT RESET QUANTUM RUN TIME QQSD=-1 QMQS: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1 QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)... QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL... QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD QTIME: PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME ,ENTER PROCESSOR QS ACCORDING TO JOB SIZE QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE Z ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME QTTAB: XWD -PQ1,-PQ2 XWD -PQ2,-PQ3 XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS Z ,QUANTUM TABLES QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS , QUANT. TIMES ACCORDING TO PROCESSOR Q: INTERNAL RNQUNT RNQUNT: QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND EXP 2*^D60 ;PQ2: TWO SECONDS EXP 2*^D60 ;PQ3: TWO SECONDS Z IFN FTSWAP,< INTERNAL ISCAN,QSCAN ISCAN: ;SCAN FOR INPUT XWD -CMQ,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES XWD -DAQ,QFOR1 XWD -AUQ,QFOR1 XWD -DCQ,QFOR1 XWD -MTQ,QFOR1 XWD -STQ,QFOR1 XWD -DTQ,QFOR1 SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES XWD -PQ2,QFOR XWD -PQ3,QFOR Z ;PATCH SPACE Z Z ;FINAL ZERO TO FLAG END OSCAN: ;SCAN FOR OUTPUT XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST XWD -SLPQ,QFOR XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP XWD -STQ,QBAK1 XWD -MTQ,QBAK1 XWD -DCQ,QBAK1 XWD -AUQ,QBAK1 XWD -DAQ,QBAK1 XWD -MQQ,QBAK1 XWD -TIOWQ,QFOR ;TTY IOW XWD -PQ3,QBAK XWD -DTQ,QFOR1 XWD -STQ,QFOR1 XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES XWD -DCQ,QFOR1 XWD -AUQ,QFOR1 XWD -DAQ,QFOR1 XWD -MQQ,QFOR1 XWD -PQ2,QBAK XWD -PQ1,QBAK Z ;PATCH SPACE Z Z ;FINAL ZERO TO FLAG END > SUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406 ,SWAPPER CALLED EVERY CLOCK TIC. ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE ;ARE USED TO "REMEMBER" PREVIOUS STATES. ,THE BASIC ALOGRITHM: ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB? ; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS) ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH? ; YES--RETURN AND DO NOTHING ;IS SWAPPER STILL BUSY? ; YES--RETURN AND DO NOTHING ,SCAN QS FOR 1ST JOB OUT OF CORE. , IF NONE-RETURN ;A: , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE? , YES--START INPUT AND RETURN , NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG? ; YES--CALL CORE SHUFFLER ; IS SHUFFLER WAITING FOR IO TO STOP? ; YES--RETURN AND DO NOTHING ; NO--GO TO A: , NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT: ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN? , YES--OUTPUT ONE AND RETURN , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME , (SET ON INPUT) HAS GONE TO 0. , IF NONE--RETURN , IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)? , YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT , NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE , IN LOW SEGEMENT AS LONG AS IT CAN , IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF) EXTERNAL JBTSTS EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC EXTERNAL JBTDAT,SHFWAT,CHKSHF EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL INTERNAL SWAP INTERNAL XPAND,FT2REL T=DEVDAT T1=TAC1 T2=TAC J=ITEM ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*" SWAP: SKIPE SHFWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP ; FOR SOME JOB? PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF ; IO STOPPED YET SKIPN SHFWAT ;IS SHUFFLER STILL WAITING? SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB? POPJ PDP, ;*YES--RETURN SETZM INFLG ;*** EXPERIMENTAL *** SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH? JRST SWP2 ;NO- JUMPL J,FINOUT ;YES--INPUT OR OUTPUT? SKIPE SERA ;INPUT, ANY INPUT ERRORS? JRST INERR ;YES FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0) IFN FT2REL,< EXTERN FININ PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN? JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB) ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG) ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH) ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS ; AND SETTING PROTECT TIME WON'T MATTER EITHER. > LDB T,IMGIN ;NEW CORE SIZE LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK SUB T1,T ;OLD-NEW=DECREASE ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0) ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS? ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE ; ON REDUCTION WHICH DOES NOT GO TO 0 SKIPLE T1 ;DECREASED? ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY ; AMOUNT OF DECREASE IN HIGH OR LOW SEG PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN ; AND SWP!SHF(JBTSTS) TO 0 LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM ; SIZE OF JOB(1K BLOCKS-1) IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE HRLM T,JBTSWP(J) MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION IFN JDAT-PROG,< MOVE PROG,JBTADR(J) > MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE? TLNE T,USRMOD ;TEST PD FLAG JRST SWP1 ;NO HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA SUBI T,(PROG) ;OLD RELOC-NEW RELOC MOVNS T ;NEW RELOC-OLD RELOC ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG JRST SWP1 INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG IFN PROG-JDAT, PUSHJ PDP,KCORE1 ;RETURN CORE JSP TAC,ERRPNT ;PRINT ON USER CONSOLE ASCIZ /SWAP READ ERROR/ JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO. SKIPE SERA ;ANY ERRORS JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN, ; IN A DIFFERENT PLACE ON DISK MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG IFN PROG-JDAT,< MOVE JDAT,JBTDAT(J) ;JOB DATA AREA > PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT ; EVEN IF ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING ; SWAP OUT (GET) SINCE JOB IS MARKED WITH ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN IFN FT2REL,< EXTERN FINOT PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT? JRST FORCEL ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER ; IS FINISHED. > SWP1: SETZM FINISH ;CLEAR FINISH FLAG SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE? JRST FORCE1 ;YES FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE? JRST FIT1 ;YES ,SCAN FOR INPUT MOVEI DAT,ISCAN JSP TAC,QSCAN JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE? TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER ; OR BOTH SEGS SWAPPED OUT JRST (TAC1) ;NO--CONTINUE SCAN FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE) IFE FT2REL,< CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE? > IFN FT2REL,< EXTERN FITSIZ PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN ; 1. THIS JOBS LOW SEG AND HIGH SEG ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE) ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE? > JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED ; AC1=TOTAL CORE NEEDED(IN K) CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS? ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG) JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG IFN FT2REL,< EXTERN FRECR1,HOLEF SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)? PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE > PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP? JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW. POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS EXTERN VIRTAL,SWPERC SWPREC: MOVE TAC,SERA ;ERROR FLAGS IORM TAC,SWPERC ;SAVE FOR POSTERITY LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP LDB TAC,IMGOUT TLO TAC,1 ADDM TAC,SWPERC JRST SWAPO ;GO TRY AGAIN ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING ; JOB SINCE THERE IS ONE ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND? JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING ; FOR ONE TO SWAP OUT MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED MOVSI T,JXPN ;SETUP JOB EXPANDED BIT TDNN T,JBTSTS(J) ;IS THIS JOB EXPANDING? SOJG J,.-1 ;NO, KEEP LOOKING IFN FTRCHK,< JUMPG J,SCNOK SETZM XJOB ;CLEAR XJOB SO MESSAGE WILL PRINT JSP DAT,ERROR ;ERROR IF NONE FOUND > SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD JRST FORCE0 ;GO TRY TO SWAP JOB OUT ;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ) ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN, ;OR SUM IF BOTH MUST BE SWAPPED IN SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER MOVEM T,SUMCOR SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT JSP TAC,QSCAN JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN? JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?> SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT? ; PROTECT TIME IS DECREMENTED ONLY WHEN ; A JOB IS RUNABLE, SO LOOK AT IT ; ONLY IF RUN BIT STILL ON TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED? ; (DISPLAY, REAL TIME)? JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB JUMPE T,(TAC1) ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED) ; OUT FOR THIS USER IF NO LOW SEG) ASH T,-12 ;CONVERT TO 1K BLOCKS ADDI T,1 IFN FT2REL,< EXTERN FORSIZ PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL) > CAMG T,MAXSIZ ;LARGEST SO FAR? JRST FORCE2 ;NO MOVEM T,MAXSIZ ;YES, SAVE SIZE MOVEM J,MAXJBN ;AND JOB NUMBER FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN? JRST (TAC1) ;NO. LOOK FOR MORE MOVE J,MAXJBN ;YES, SWAP OUT LARGEST FORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP? JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE ; LOOK FOR AN OTHER JOB TO SWAP IFN FT2REL,< EXTERN FORHGH PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE ; TRYING TO SWAP OUT LOW SEGMENT? ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE: ; 1. JOB HAS A HIGH SEG AND ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER ; (SWP=0 FOR JOB) ; 3. IT IS IN CORE(NOT XPANDH) ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING ; THIS ONLY USER USING IN CORE ; 5. HIGH SEG NOT ON DISK YET ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB ; BEING FITTED IN IS GOING TO WANT ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE ; RETURN LOW SEG NO. ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS ; FOR JOB SO IO WILL STOP NEXT BUFFERE > MOVSI T,SWP!IFE FT2REL, ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL ; STOP AFTER NEXT BUFFERFUL. FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT? FORCE1: IFN JDAT-PROG,< MOVE JDAT,JBTDAT(J) > SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE ; ASSIGNED IN MEMORY? JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.) POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP. ;SWAP OUT LOW OR HIGH SEGEMENT INTERNAL FTTRACK SWAPO: IFN FTTRACK, SETZM FORCE ;CLEAR FORCE FLAG HLRZ T,JBTADR(J) ;COMPUTE CORE IMAGE JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0 ; WHEN CORE WAS RETURNED HRRZ T1,JBTADR(J) MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT ASH T,-^D10 ;CONVERT TO 1K BLOCKS ADDI T,1 DPB T,IMGOUT ;RECORD AS OUT IMAGE HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT PUSH PDP,T1 ;* LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN SKIPN DAT ;ALREADY BEEN SET(XPAND) DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE JRST FULL ;*NONE AVAILABLE HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED ; WHEN IO COMPLETED(SQREQ BECOMES ZERO) POP PDP,TAC1 ;*GET IOWD JRST SQOUT ;*START OUTPUT AND RETURN NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY. ;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK EXTERN GETFCR FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE) PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS HLRZ DAT,AC3 ;RESTORE DAT MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL HRLI AC3,-4 ;4 LOCS TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE JRST FULL2 ;CANT HAVE THAT MUCH HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE POP PDP,DAT ;RESTORE AMT GOTTEN HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE SUB T,DAT ;AMOUNT STILL NEEDED JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED ;COME HERE WHEN CANT GET THE CHUNK REQUESTED FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE JUMPG DAT,FULL1A ;GO GET THAT AMOUNT IFN FT2REL,< EXTERN FRESWP PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED ; NONE FOUND, PRINT MONITOR ERROR > EXTERN CERROR POP PDP,TAC ;WHAT? NONE LEFT? POP PDP,TAC ;SET PDP TO RIGHT VALUE JSP DAT,CERROR ;ERROR IN MONITOR AT ..... ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS JRST OUTP2 ;GO START OUTPUT ;HERE TO GET 4 LOCS OF FREE CORE FULCOR: PUSH PDP,ITEM ;GETFCR USES ITEM PUSHJ PDP,GETFCR ;GET 4 CELLS JRST IPOPJ ;RETORE ITEM AND RETURN ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE PUSHJ PDP,FULCOR ;GET 4 MORE LOCS HRLI AC3,-4 CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS? POPJ PDP, ;YES. RETURN MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART HRR AC3,TAC1 ;NEW TABLE LOC AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN ;SWAP IN A JOB OR HIGH SEGMENT SWAPI: IFN FTTRACK, MOVEM J,FINISH ;SET FINISH FLAG TO INPUT SETZM FIT ;CLEAR FIT FLAG LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK) LSH TAC,^D10 ;CONVERT TO HIGHEST ADR SUBI TAC,1 ;-1 FOR CALL TO CORGET SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE? JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY ; HIGH SEG WAS SWAPPED OUT. PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER) IFN FT2REL, LDB T,IMGOUT ;GET OUTPUT IMAGE JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0 LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE? CAMGE TAC1,T ;WELL? MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB) LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN MOVN TAC1,T ;* HRR TAC1,JBTADR(J) ;* HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS JRST SQIN ;*START INPUT ;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0) ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED ;CALLED FROM CORE0 ;CALL: MOVE ITE,JOB OR HIGH SEG NO. ; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT ; PUSHJ PDP,CHGSWP ; ALWAYS RETURN ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0 INTERN CHGSWP EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR? LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN) ; HAPPENS ONLY ON R,RUN,GET,KJOB DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN PUSH PDP,ITEM ;SAVE AN AC LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM) CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER? MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER? MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW ; VIRTUAL CORE SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL ;CORE JRST IPOPJ ;RESTORE ITEM AND RETURN ;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS ;VIRTUAL CORE ASSIGNMENT ;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO. ; PUSHJ PDP,ZERSWP ;CALLED FROM SEGCON IN MANY PLACES(5) ;AND FININ0 HERE IN SWAP INTERN ZERSWP ZERSWP: TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP) MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED ; FOR SWAP OR CORE SHUFFLE PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER) LDB DAT,IMGOUT ;*SIZE ON DISK(1K BLOCKS) JUMPE DAT,CHG3 ;DID SEG HAVE ANY DISK SPACE? HLRZ TAC,JBTSWP(ITEM) ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT PUSHJ PDP,FXSAT ;*FREE THE DISK BLOCKS NO LONGER NEEDED CHG3: POP PDP,DAT ;RESTORE TTY OUTPUT BYTE POINTER MOVEI TAC,0 ;0 IS NEW DISK ASSIGNMENT DPB TAC,IMGOUT ;SET DISK ASSIGNEMENT TO 0 DPB TAC,IMGIN ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN ; HERE FROM CHGSWP IF NOT ASKING FOR 0 POPJ PDP, ;RETURN EXTERN PROT0,PROT ;PROT AND PROT0 OCCUR IN COMMON IFE FTRC10, < XP ICPRT1,3+1*3 ;PROTECT TIME IN CLOCK TICS= XP ICPROT,^D10 ;((JOBSIZE/1K)*+PROT0)*PROT ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES. > IFN FTRC10, < ;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK...... XP ICPRT1,3+1*3 ;ZERO CORE PLUS K MULTIPLIER XP ICPROT,3 ;MULTIPLY BY K-1 OF LOW SEG > ;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT ,THEM BACK IN TO DESIRED AMOUNT. ,JOBS POSITION IN QS NOT AFFECTED. ;CALLED ONLY FROM CORE COMMAND ;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL ;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG ,CALL: MOVE ITEM,[JOB NO.] ; MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED] ; PUSHJ PDP,XPAND ; RETURN, TAC DESTROYED XPAND: LSH TAC,-12 ;CONVERT HIGHEST DESIRED ADDRESS ADDI TAC,1 ;TO 1K BLOCKS DPB TAC,IMGIN ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE ; TO REQUEST WHEN NEXT SWAPPED IN ;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT ;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK ;OR ON ITW WAY IN OR OUT. THE SIZE OF THE HIGH SEG IS UNCHANGED ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG) ;CALL: MOVE ITEM,HIGH SEG NUMBER ; PUSHJ PDP,XPANDH INTERN XPANDH EXTERN IPOPJ XPANDH: IFN FT2REL,< PUSH PDP,ITEM ;SAVE JOB NUMBER CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG? MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB) > MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY) AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT IFE FT2REL,< POPJ PDP, ;RETURN > IFN FT2REL,< JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN > SUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406 INTERNAL SQIN,SQOUT,SQGO,SQGO1 INTERNAL FTSWAP EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR ; INPUT, SWOUT FOR OUTPUT ;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1) ; HRRZ TAC,DISK BLOCK NO. ; PUSHJ PDP,SQIN/SQOUT ; RETURN HERE ALWAYS ; CONTENTS OF TAC,TAC1 LOST SQIN: TLO TAC,400000 ;SET READ INDICATOR SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER MOVEM TAC1,SQREQ ;STORE THE IOWD MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB MOVNI TAC,1 ;IS THE DEVICE BUSY? EXCH TAC,DFBUSY JUMPN TAC,CPOPJ ;YES IF JUMP ERATRY=3 ;NO. OF TIMES TO READ AND WRITE ON ERRORS ;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE ;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE. ;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO) SQGO: MOVEI TAC1,ERATRY MOVEM TAC1,SERACT MOVSI TAC,400000 TDNE TAC,SERA ;WRITE? JRST SQGO1 ;NO HRRZ TAC,SQREQ ADDI TAC,JOBDAC HRLI TAC,MJOBCK PUSHJ PDP,CHECK MOVM TAC,FINISH MOVEM TAC1,JBTCHK(TAC) SQGO1: SETZM SQLEN ;ZERO AMOUNT TRANSFERRED SO FAR MOVE TAC1,SQREQ ;*PUT IOWD INTO TAC1 MOVSI TAC,200000 ;*SET "SWAPPER I/O GOING" FLAG ON ORB TAC,SERA ;* TRZN TAC,FRGSEG ;*FRAGMENTED? JRST SQGO2 ;*NO, READ IN ENTIRE (OR PART) OF SEG EXTERN CLCOR1 FRAGIO: PUSH PDP,DAT MOVN DAT,SQLEN ;AMOUNT PREVIOUSLY TRANSFERRED SUB TAC1,DAT ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS FRGIO1: HLRE DAT,(TAC) ;NO OF K IN THIS DISK CHUNCK HRR TAC,(TAC) ;SWAPPING ADDRESS FOR THIS DISK CHUNK JUMPGE DAT,FRGIO2 ;POINTER TO NEW CORE LIST IF NEG. MOVEI DAT,77777 ;CLEAR OUT ADR(15 BITS) ANDCAM DAT,SERA ORM TAC,SERA ;INSERT NEW ADDRESS JRST FRGIO1 FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT MOVNS DAT ;-N WORDS HRLM DAT,TAC1 ;IOWD IN TAC1 HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND) MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER ADDI DAT,777777 ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE POP PDP,DAT SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH. ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER. TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT. SOJA TAC1,DFRED ;*YES SOJA TAC1,DFWRT ;*NO, WRITE. ;SERVICE A SWAPPING INTERRUPT EXTERNAL DINT4B,CKSMCT INTERNAL SWPINT SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM JRST SWPERR ;ERRORS TRZE TAC,FRGSEG ;*FRAGMENTED? SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO? JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT AOS SERA ;YES, FRAGMENTED AND MORE TO GO SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST? AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG DINT8B: TLNN TAC,400000 ;*INPUT? JRST DINT8A ;*NO HRRZ TAC,SQREQ ADDI TAC,JOBDAC HRLI TAC,MJOBCK PUSHJ PDP,CHECK MOVM TAC,FINISH CAME TAC1,JBTCHK(TAC) JRST SWPER1 DINT8A: HRRZM IOS,SERA SETZM SQREQ JRST DINT4B SWPER1: MOVSI TAC,100 ADDM TAC,CKSMCT TRO IOS,IODTER SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR) HRRM TAC, SERA ;*RESTORE SERA MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB MOVEM TAC,SQREQ SOSLE SERACT ;*TRIED ENOUGH? JRST SQGO1 ;*NO, TRY AGAIN JRST DINT8A ;*YES, TOUGH. IFE FTRC10, < ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE --- ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED ;AT CLOCK LEVEL. ;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED ; PUSHJ PDP,GXSAT ; ERROR EXIT (DISK IS FULL) ; NORMAL EXIT ;C(TAC) = BLOCK NO. ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST. INTERNAL GXSAT EXTERNAL GETBIT,IPOPJ1 GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC. MOVE AC2,XSAT2 ; LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS PUSH PDP,ITEM ;SAVE C(ITEM) MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN MOVEI TAC,-1(TAC1) CAIL TAC,BLOCKS ;IS IT ON DISK 17? ADDI TAC,DIFF ;YES LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP. JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM) ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED ;AT CLOCK LEVEL ;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE ; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE ; PUSHJ PDP,FXSTAT ; ALWAYS RETURN HERE ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST. INTERNAL FXSAT EXTERNAL CLRBIT,IPOPJ FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS. CAIL TAC,HISWAP ;ON DISK 17? SUBI TAC,DIFF ;YES LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK MOVE AC2,XSAT2 ;AC2 TOO PUSH PDP,ITEM ;SAVE C(ITEM) MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT PUSHJ PDP,CLRBIT JRST IPOPJ ;RETURN, AND RESTORE ITEM ;INITIALIZE SWAPPER DISK STORAGE TABLE INTERNAL SWPINI SWPINI: MOVE TAC,XSAT2 MOVEM TAC,XSAT31 MOVSI TAC,1B18 MOVEM TAC,XSAT3 SETZM XSAT4 MOVE TAC,XSAT4P BLT TAC,XSAT61 MOVE TAC,XSAT7 MOVEM TAC,XSAT5 MOVE TAC,XSAT8 MOVEM TAC,XSAT6 POPJ PDP, IFN FTCHECK+FTMONP,< EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61 > IFE FTCHECK+FTMONP,< ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS ; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING ; 5400 (OCTAL) RECORDS INTERNAL SQREQ,SERA,SERACT SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE ESQREQ: Z ;COPY OF SQREQ, IN CASE OF ; ERROR IN FRAGMENTED JOB SERA: Z ;SIGN IS 1 IF A READ ; C(RH)=BLOCK NUMBER BEFORE READING. ; ERROR BITS AFTER READING. SERACT: 0 ;COUNT FOR ERRORS SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT XWD -SWPSIZ,XSAT4 ; BIT TABLE FOR SWAPPING ALLOCATION XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD EX=BLOCKS+E1-^D35 W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD XP XSAT31,XSAT3+1 XSAT4: BLOCK W1 XSAT5: BLOCK W2+1 XSAT6: BLOCK 1 REPEAT 1,< IFE E1, IFN E1,> IFE E2, IFN E2, >> XP XSAT61,XSAT6-1 XSAT7: EXP X XSAT8: EXP Z SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST ; BLOCK ON DISK DIFF=HISWAP-BLOCKS-1 XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD ;DISC BLOCKS(SHIFT COUNT) XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD XSAT4P: XWD XSAT4,XSAT4+1 > > ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK. IFN FTRC10, < ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK --- INTERNAL GXSAT,FXSAT,SWPINI EXTERNAL GETBIT,CLRBIT EXTERNAL LBHIGH,IPOPJ,IPOPJ1 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON ; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL. ;CALLING SEQUENCE --- ; PUSHJ PDP,GXSAT ; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE. ; NORMAL EXIT ;ENTRY CONDITIONS --- ; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED. ;EXIT CONDITIONS --- ; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN ; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST. ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE. GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM". MOVE ITEM,DAT MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE. MOVE AC2,SWPENT PUSHJ PDP,GETBIT JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK. ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK). MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED. LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN ;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL. ;CALLING SEQUENCE --- ; PUSHJ PDP,FXSAT ; NORMAL EXIT ;ENTRY CONDITIONS --- ; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE ; SERIES WHICH IS TO BE MADE AVAILABLE. ; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH ; ARETO BE MADE AVAILABLE. ;EXIT CONDITIONS --- ; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE ; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO. ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE. FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED? JRST FXSAT1 ;NO. DO IN REGULAR WAY FRAGBK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3 FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS HLRE DAT,(AC3) ;NUMBER OF K JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE PUSH PDP,ITEM HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK LSH ITEM,-2 ;4 WDS PER BIT AOS ITEM PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE POP PDP,ITEM SKIPE TAC,(AC3) ;END OF TABLE? JRST FRAGBK ;NO, GO CHASSE NEXT PART POPJ PDP, ;YES, DONE FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM". MOVE ITEM,DAT LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS. SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK). SUB TAC,DAT MOVEI AC1,SWPENT MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE. FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES ; THE WORK OF CLEARING THE BITS. JRST IPOPJ ;RESTORE ITEM AND RETURN ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT ; SYSTEM INITIALIZATION TIME. EXTERN VIRTAL,SWPHGH SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING. MOVEM TAC,(TAC1) AOBJN TAC1,.-1 MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE. JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ". IFN FTCHECK+FTMONP,< EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT". EXTERNAL SQREQ,SERA,SERACT EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP > IFE FTCHECK+FTMONP,< ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK --- INTERN MXK2SWP,CONVMD,BLKSPK,SWPTAB,MAXSWP EXTERN K4SWAP ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE. ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING ;DETERMINED BY ONCE ONLY REFRESH DIALOG ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS ;DETERMINED BY ONCE ONLY REFRESH DIALOG MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB ; USED SINCE SYSTEM BEGAN ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD ;HAPPENED SOMETIME DURING THE PAST BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E., ; EIGHT DISK BLOCKS PER K OF CORE. CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE. MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.) SWPSIZ=MXK2SWP/^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE. SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES. SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE. ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES --- INTERNAL SQREQ,SERA,SERACT,ESQREQ SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB SERA: Z ;SIGN IS 1 IF A READ ; C(RH)=BLOCK NUMBER BEFORE READING. ; ERROR BITS AFTER READING. SERACT: 0 ;COUNT FOR ERRORS SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB > > ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK. SCHEND: END