------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Spring 2007 Homework 1 Solution ------------------------------------------------------------------------------- 1. (3 Points): process c const n, s var avail : array[0..s-1] of 0..3 {initially 3 at each index} rqstd : array[0..n-1, 0..s-1] of boolean k : 0..n-1 par j : 0..n-1 {corresponding to the clients} r : 0..s-1 {corresponding to the resources} begin rcv rqst(r) from u[j] -> if avail[r] > 0 -> avail[r] := avail[r]-1; send grant(r) to u[j]; [] avail[r] = 0 -> rqstd[r,j] := true; fi [] rls(r) from u[j] -> k := (j + 1) mod n; do k!=j ^ ~rqstd[r,k] -> k := (k + 1) mod n od; if rqstd[r,k] -> rqstd[r,k] := false; send grant(r) to u[k] [] ~rqstd[r,k] -> avail[r] := avail[r] + 1; fi end ------------------------------------------------------------------------------- 2. (3 Points): process p const n var ready : boolean, {initially true} i : 0..n-1 begin ready -> i := 0; do ready -> send rqst to q[i]; if i i := i+1 [] i=n-1 -> ready := false fi od; i := 0 [] rcv rply from q[i] -> if i < n-1 -> i := i+1 [] i = n-1 -> ready := true fi [] timeout ~ready ^ (#ch.p.q[i] + #ch.q[i].p = 0) -> if i < n-1 -> i := i+1 [] i = n-1 -> ready := true fi end Specification of process q was not required for the homework but is given below for reference: process q[i:0..n-1] begin rcv rqst from p -> send rply to p end ------------------------------------------------------------------------------- 3. 4 points process p[i:..m-1] const n var ready : boolean {initially true} j : 0..n-1 begin ready -> j := any; send rqst(j) to r; ready := false [] rcv rply from r -> ready := true end --- process q[j:0..n-1] const m var i : 0..m-1 begin rcv rqst(i) from r -> send rply(i) to r end --- process r const m,n var x: 0..m-1 y: 0..n-1 par i: 0..m-1 j: 0..n-1 begin rcv rqst(y) from p[i] -> send rqst(i) to q[y] [] rcv rply(x) from q[j] -> send rply(j) to p[x] end