$A NLS=1 $A TAB=0,3,6,9,12,15,18,21,24,27,30 $B0 %SEMAPHORE MANAGERSEM $B0 %CYCLING %SEMAPHORE MUTEX1, MUTEX3,R,W $B2 %BEGIN %PROCESS $B0 %CAPABILITY .PROCESS $B0 %CYCLING %SEMAPHORE THE STATUS $B0 %CYCLE $B0 $A INDENT=2 READER ENTRY $B0 %CYCLE $A INDENT=3 .PROCESS = NEXT PROCESS( .PROCESS .LIST) $B0 %IF .PROCESS # .NULL %THEN %START $A INDENT=4 _@P (THE STATUS) $A INDENT=5 %IF .PROCESS$_STATUS = 'READY' %THEN %START $A INDENT=6 .PROCESS$_STATUS = 'RUNNING' $A INDENT=5 %FINISH %ELSE %START $A INDENT=6 .PROCESS = .DUMMY $A INDENT=5 %FINISH $A INDENT=4 _@V(THE STATUS) $A INDENT=3 %FINISH $A INDENT=2 %REPEAT %UNTIL .PROCESS # .DUMMY $B0 READER EXIT $B0 %IF %PROCESS # .NULL %THEN %START $A INDENT=3 RESUME-PROCESS( .PROCESS) $A INDENT=2 %FINISH %ELSE %START $B0 $T3 @V(MANAGERSEM) $B0 %FINISH $A INDENT=2 %REPEAT $B %END %PROCESS $B2 $L1 M @FIGURE 4.2-5A $B5 $L8 %BEGIN %PROCESS %CYCLE DETERMINE APPROPIATE MODIFICATIONS ON PROCESS LIST WRITER ENTRY UPDATE ( .PROCESS .LIST ) WRITER EXIT %REPEAT %END %PROCESS $B $L1 M @FIGURE 4.2-5B $E $A INDENT=2; NLS=1 $C-7 @P(S) = $C+3 [ S = S-1 ; %IF S < 0 %THEN -> L1 ] $B $C-4 CRITICAL SECTION: $B $C+5 $. $B0 $C+5 $. $B0 $C+5 $. $B L1: [ %IF .CYS < 1 %THEN -> L1 ; .CYS = .CYS-1 ] $B $A INDENT=3; NLS=2 QUEUE UP(QS,ME) $B0 [ .NUMQPR = .NUMQPR+1 ] $B0 .ACTIVATOR = BLOCK-PROCESS(ME) $B0 RESUME-PROCESS .(ACTIVATOR) $B0 [ .CYS = .CYS+1 ] $B0 -> CRITICAL SECTION $A INDENT=0 AND $A INDENT=2; NLS=1 $C-7 @V(S) = $C+3 [ S = S+1 ; %IF S <= 0 %THEN -> L2 ] $B $C+5 $. $B0 $C+5 $. $B0 $C+5 $. $A INDENT=3; NLS=2 $B $C-4 L2: [%IF .NUMQPR<1 %THEN -> L2 ; .NUMQPR$=NUMQPR+1] $B0 $C-4 L3: [ %IF .CYS < 1 %THEN -> L3 ; .CYS = .CYS-1 ] $B0 ID = DEQUEUE(QS) $B0 WAKE-UP-PROCESS(ID) $B0 [ .CYS = .CYS+1 ] $B0 -> INSTRUCTION FOLLOWING THE @V $A INDENT=0 $B2 $L1 M FIGURE 4.2-3. $E $A TAB=1,3,5,7,9,34,36,38 $T1 %ROUTINE READER ENTRY $T6 %ROUTINE WRITER ENTRY $B0 $T2 _@P(MUTEX3) $T7 @P(MUTEX2) $B0 $T3 _@P(R) $T8 WRITECOUNT=WRITECOUNT+1 $B0 $T4 _@P(MUTEX1) $T8 %IF WRITECOUNT=1 %THEN _@P(R) $B0 $T5 READCOUNT=READCOUNT+1 $T7 @V(MUTEX2) $B0 $T5 %IF READCOUNT=1 %THEN _@P(W) $T7 _@P(W) $B0 $T4 _@V(MUTEX1) $T6 %END $B0 $T3 _@V(R) $B0 $T2 _@P(MUTEX3) $B0 %END $B4 %ROUTINE READER EXIT $T6 %ROUTINE WRITER EXIT $B0 $T2 _@P(MUTEX1) $T7 _@V(W) $B0 $T3 READCOUNT=READCOUNT-1 $T7 @P(MUTEX2) $B0 $T3 %IF READCOUNT=0 %THEN _@V(W) $T8 WRITECOUNT=WRITECOUNT-1 $B0 $T2 _@V(MUTEX1) $T8 %IF WRITECOUNT=0 %THEN _@V(R) $B0 %END $T7 @V(MUTEX2) $B0 $T6 %END $B3 $L1 M @FIGURE 4.2-6. $E $A NLS=1 $A TAB=0,3,6,9,12,15,18,21,24,27,30 $B0 %SEMAPHORE MANAGERSEM $B0 %CYCLING %SEMAPHORE MUTEX1, MUTEX3,R,W $B2 %BEGIN %PROCESS $B0 %CAPABILITY .PROCESS $B0 $B0 %CYCLE $B0 $A INDENT=2 READER ENTRY $B0 %CYCLE $A INDENT=3 .PROCESS = NEXT PROCESS( .PROCESS .LIST) $B0 %IF .PROCESS # .NULL %THEN %START $A INDENT=4 $B %IF .PROCESS$_STATUS = 1 %THEN %START $A INDENT=3 TRY AGAIN: $A INDENT=5 .ITS .PROCESS$_STATUS,DOIRE $B0 %EXIT $T10 ;! EXIT THE %CYCLE $A INDENT=3 DOIRE: $A INDENT=5 .IRE .PROCESS$_STATUS,REPEAT $B0 -> TRY AGAIN $A INDENT=3 REPEAT: $A INDENT=5 .PROCESS = .DUMMY $A INDENT=4 %FINISH $A INDENT=3 $B %FINISH $A INDENT=2 %REPEAT %UNTIL .PROCESS # .DUMMY $B0 READER EXIT $B0 %IF %PROCESS # .NULL %THEN %START $A INDENT=3 RESUME-PROCESS( .PROCESS) $A INDENT=2 %FINISH %ELSE %START $B0 $T3 @V(MANAGERSEM) $B0 %FINISH $A INDENT=2 %REPEAT $B %END %PROCESS $B5 $L8 %BEGIN %PROCESS %CYCLE DETERMINE APPROPIATE MODIFICATIONS ON PROCESS LIST WRITER ENTRY UPDATE ( .PROCESS .LIST ) WRITER EXIT %REPEAT %END %PROCESS $B $L1 M @FIGURE @A1 $E