SLIDE 1
r r tr - - PowerPoint PPT Presentation
r r tr - - PowerPoint PPT Presentation
r r tr r r sr t ts void put(x) Val
SLIDE 2
SLIDE 3
❖✉t❧✐♥❡
s❡r✈✐❝❡
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 4
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ✕ ✶
s❡r✈✐❝❡
❋✐❢♦ ❜♦✉♥❞❡❞ ❜✉✛❡r ♦❢ s✐③❡ N ✐♥♣✉t ❢✉♥❝t✐♦♥s✿ put(x)✱ get()✱ end() ♥♦ ♦✉t♣✉t ❢✉♥❝t✐♦♥s ▼❛✐♥
buff✿ s❡q✉❡♥❝❡ ♦❢ ✐t❡♠s ✐♥ ❜✉✛❡r ending✿ tr✉❡ ✐✛ end() ❤❛s ❜❡❡♥ ❝❛❧❧❡❞ putBusy✿ tr✉❡ ✐✛ put ❝❛❧❧ ♦♥❣♦✐♥❣ getBusy✿ tr✉❡ ✐✛ get ❝❛❧❧ ♦♥❣♦✐♥❣ void mysid.put(x)
✐❝ ④♥♦t ❡♥❞✐♥❣ ❛♥❞ ♥♦ ♦♥❣♦✐♥❣ put ❝❛❧❧⑥ ♦❝ ④buff ❤❛s s♣❛❝❡⑥ ❛♣♣❡♥❞ x t♦ buff❀ r❡t✉r♥
SLIDE 5
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ✕ ✷
s❡r✈✐❝❡
Val mysid.get()
✐❝ ④♥♦t ❡♥❞✐♥❣ ❛♥❞ ♥♦ ♦♥❣♦✐♥❣ get ❝❛❧❧⑥ ♦✉t♣✉t rval ♦❝ ④buff ❤❛s ✐t❡♠✱ rval ✐s buff.head⑥ ❜❡❤❡❛❞ buff❀ r❡t✉r♥ rval
void mysid.end()
✐❝ ④♥♦t ❡♥❞✐♥❣⑥ s❡t ❡♥❞✐♥❣ ♦❝ ④tr✉❡⑥ r❡t✉r♥ Pr♦❣r❡ss ❛ss✉♠♣t✐♦♥
put ❝❛❧❧ r❡t✉r♥s ✐❢ buff ❤❛s s♣❛❝❡
✴✴ ✉s❡s putBusy
get ❝❛❧❧ r❡t✉r♥s ✐❢ buff ❤❛s ✐t❡♠
✴✴ ✉s❡s getBusy
end ❝❛❧❧ r❡t✉r♥s
✴✴ ✉s❡s ✏t❤r❡❛❞ ✐♥ mysid.end✑
SLIDE 6
BoundedBuffer(int N)
✕ ✶
s❡r✈✐❝❡
// main ic {N ≥ 1} buff ← []; ending ← false; putBusy ← false; getBusy ← false; return mysid; input void mysid.put(Val x) ic {not ending and not putBusy} putBusy ← true;
- c {buff.size < N}
buff.append(x); putBusy ← false; return; input Val mysid.get() ic {not ending and not getBusy} getBusy ← true;
- utput(Val rval)
- c {buff.size > 0
and rval = buff[0]} buff.remove(); getBusy ← false; return rval; input void mysid.end() ic {not ending} ending ← true;
- c {true}
return;
SLIDE 7
BoundedBuffer(int N)
✕ ✷
s❡r✈✐❝❡
atomicity assumption {input and output parts} progress assumption { // thread in put returns if buffer has space (putBusy and buff.size < N) ❧❡❛❞s✲t♦ not putBusy; // thread in get returns if buffer has an item (getBusy and buff.size > 0) ❧❡❛❞s✲t♦ not getBusy; // thread in end returns (thread u in mysid.end) ❧❡❛❞s✲t♦ (not u in mysid.end); } }
SLIDE 8
❖✉t❧✐♥❡
s❡r✈✐❝❡ ✐♥✈❡rs❡
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 9
❙❡r✈✐❝❡ ■♥✈❡rs❡ ❖✈❡r✈✐❡✇ ✕ ✶
s❡r✈✐❝❡ ✐♥✈❡rs❡
BoundedBufferInverse(N, bb)
✴✴ bb✿ s✐❞ ♦❢ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ♠❛✐♥✿
buff✱ ending✱ putBusy✱ getBusy
♦✉t♣✉t ❢✉♥❝t✐♦♥s✿ doPut(x)✱ doGet()✱ doEnd()
doPut(x)
♦❝ ④♥♦t ❡♥❞✐♥❣ ❛♥❞ ♥♦ ♦♥❣♦✐♥❣ put ❝❛❧❧⑥
bb.put(x)
✐❝ ④buff ❤❛s s♣❛❝❡⑥ ❛♣♣❡♥❞ x t♦ buff
doGet()
♦❝ ④♥♦t ❡♥❞✐♥❣ ❛♥❞ ♥♦ ♦♥❣♦✐♥❣ get ❝❛❧❧⑥
rval ← bb.get()
✐❝ ④buff ❤❛s ✐t❡♠✱ rval ✐s buff.head⑥ ❜❡❤❡❛❞ buff
SLIDE 10
❙❡r✈✐❝❡ ■♥✈❡rs❡ ❖✈❡r✈✐❡✇ ✕ ✷
s❡r✈✐❝❡ ✐♥✈❡rs❡
doEnd()
♦❝ ④♥♦t ❡♥❞✐♥❣⑥ s❡t ❡♥❞✐♥❣❀ bb.end() ✐❝ ④tr✉❡⑥ r❡t✉r♥ ♣r♦❣r❡ss ❝♦♥❞✐t✐♦♥
put ❝❛❧❧ r❡t✉r♥s ✐❢ buff ❤❛s s♣❛❝❡
✴✴ ✉s❡s putBusy
get ❝❛❧❧ r❡t✉r♥s ✐❢ buff ❤❛s ✐t❡♠
✴✴ ✉s❡s getBusy
end ❝❛❧❧ r❡t✉r♥s
✴✴ ✉s❡s ✏t❤r❡❛❞ ✐♥ bb.end✑
SLIDE 11
BoundedBufferInverse(N, bb)
s❡r✈✐❝❡ ✐♥✈❡rs❡
// main ic {N ≥ 1} buff ← []; putBusy ← false; getBusy ← false; return mysid;
- utput doPut(Val x) {
- c {not end-
ing and not putBusy} putBusy ← true; bb.put(x); ic {buff.size < N} buff.append(x); putBusy ← false;
- utput doGet() {
- c {not ending and not getBusy}
getBusy ← true; Val x ← bb.get(x); ic {buff.size > 0 and x = buff[0]} buff.remove(); getBusy ← false;
- utput doEnd() {
- c {not ending}
ending ← true; lck.end(); ic {true} progress condition {... mysid bb...}
SLIDE 12
❖✉t❧✐♥❡
❛✇❛✐t
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 13
❆✇❛✐t ❝♦♥str✉❝t
❛✇❛✐t
❆✇❛✐t✿ ♣♦✇❡r❢✉❧ s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝t ♥♦t ♣r♦✈✐❞❡❞ ❜② P▲s ❝♦♥✈❡♥✐❡♥t ❢♦r ✇r✐t✐♥❣ ♣r♦❣❛♠s ✐♠♣❧❡♠❡♥t❛❜❧❡ ❜② st❛♥❞❛r❞ s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝ts
await (B) S B ✐s ♣r❡❞✐❝❛t❡✱ S ✐s ♥♦♥✲❜❧♦❝❦✐♥❣ ❝♦❞❡
❛t♦♠✐❝❛❧❧② ❡①❡❝✉t❡ S ♦♥❧② ✐❢ B ❤♦❧❞s✱ ♦t❤❡r✇✐s❡ ✇❛✐t ✇❡❛❦ ♦r str♦♥❣ ❢❛✐r♥❡ss
await (B) S✿ ♠♦r❡ ❣❡♥❡r❛❧ t❤❛♥ oc {B} S S ❝❛♥ ♠❛❦❡ ✭♥♦♥✲❜❧♦❝❦✐♥❣✮ ♦✉t♣✉t ❝❛❧❧s✱ ✉s❡ r❡t✉r♥ ✈❛❧✉❡s atomic S✿ s❤♦rt ❢♦r await (true) S
SLIDE 14
❆✇❛✐t✲str✉❝t✉r❡❞ ♣r♦❣r❛♠s
❛✇❛✐t
❆✇❛✐t✲str✉❝t✉r❡❞ ♣r♦❣r❛♠ ❛✇❛✐ts ❛r❡ t❤❡ ♦♥❧② s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝t ❝♦❞❡ ♦✉ts✐❞❡ ❛✇❛✐ts ❞♦❡s ♥♦t ❝♦♥✢✐❝t ✇✐t❤ ❝♦❞❡ ❡①❡❝✉t❡❞ ❜② ♦t❤❡r t❤r❡❛❞s ❆✇❛✐t✲str✉❝t✉r❡❞ ♣r♦❣r❛♠ ❡❛s✐❡r t♦ ✉♥❞❡rst❛♥❞ t❤❛♥ ❡q✉✐✈❛❧❡♥t ♣r♦❣r❛♠ ✇✐t❤ st❛♥❞❛r❞ s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝ts ❝❛♥ ❜❡ ♠❡❝❤❛♥✐❝❛❧❧② tr❛♥s❢♦r♠❡❞ t♦ ♣r♦❣r❛♠ t❤❛t ✉s❡s st❛♥❞❛r❞ s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝ts
SLIDE 15
❖✉t❧✐♥❡
❛✇❛✐t ❜❜✉✛
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 16
■♠♣❧❡♠❡♥t❛t✐♦♥ BBuffAwait(N)
❛✇❛✐t ❜❜✉✛
program BBuffAwait(int N) { ia {N ≥ 1} Seq buff ← seq(); return mysid; input void mysid.put(Val x)
- await (buff.size < N)
buff.append(x); return; input Val mysid.get()
- await (buff.size > 0) {
Val x ← buff[0]; buff.remove(); return x; input void mysid.end() endSystem(); return; atomicity assumption awaits progress assumption weak fairness for threads
SLIDE 17
BBuffAwait ✐♠♣❧❡♠❡♥ts BoundedBuffer✿ Z
❛✇❛✐t ❜❜✉✛
program Z(int N) { ... bb ← startSystem ( BBuffAwait(N) ); si ← startSystem ( BoundedBufferInverse(N,bb) ); ... atomicity assumption {} progress assumption {weak fairness} }
SLIDE 18
BBuffAwait ✐♠♣❧❡♠❡♥ts BoundedBuffer✿ ❙❛❢❡t②
❛✇❛✐t ❜❜✉✛
❚♦ ♥♦t ✈✐♦❧❛t❡ si.doPut.ic✱ ✇❛♥t ■♥✈ C✵ t♦ ❤♦❧❞ C✵ : ((thread in bb.put) and bb.buff.size < N) ⇒
si.buff.size < N
❚♦ ♥♦t ✈✐♦❧❛t❡ si.doGet.ic✱ ✇❛♥t ■♥✈ C✶ t♦ ❤♦❧❞ C✶ : ((thread at bb.get) and bb.buff.size > 0) ⇒
(si.buff.size > 0 and bb.buff[0] = si.buff[0])
❍♦❧❞ ❜❡❝❛✉s❡ ■♥✈ C✷ ❤♦❧❞s ✭✈✐❛ ✐♥✈❛r✐❛♥❝❡ r✉❧❡✮ C✷ : bb.buff = si.buff
SLIDE 19
BBuffAwait ✐♠♣❧❡♠❡♥ts BoundedBuffer✿ Pr♦❣r❡ss
❛✇❛✐t ❜❜✉✛
❲❛♥t B✷✕B✹ t♦ ❤♦❧❞ B✷ : (putBusy and si.buff.size < N) ❧❡❛❞s✲t♦
not putBusy
B✸ : (getBusy and si.buff.size > 0) ❧❡❛❞s✲t♦
not getBusy
B✹ : (thread u in bb.end) ❧❡❛❞s✲t♦
(not u in bb.end)
B✷ ❤♦❧❞s ✈✐❛ ✇❡❛❦ ❢❛✐r♥❡ss ❛♥❞ ■♥✈ C✷ ♦♥❧② ❛ t❤r❡❛❞ ✐♥ bb.put ❝❛♥ ❢❛❧✐s✐❢② B✷✳❧❤s ♦♥❧② ♦♥❡ s✉❝❤ t❤r❡❛❞ ❛t ❛♥② t✐♠❡ ✴✴ doPut.oc s♦ ✐t ❡✈❡♥t✉❛❧❧② ❡①❡❝✉t❡s✱ ❡st❛❜❧✐s❤✐♥❣ B✷✳r❤s ✴✴ ✇❢❛✐r B✸ ❤♦❧❞s ✈✐❛ ✇❡❛❦ ❢❛✐r♥❡ss ❛♥❞ ■♥✈ C✷ B✸ ❤♦❧❞s ✈✐❛ ✇❡❛❦ ❢❛✐r♥❡ss
SLIDE 20
❖✉t❧✐♥❡
❧♦❝❦✲❝✈
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 21
▲♦❝❦s
❧♦❝❦✲❝✈
❆ ❧♦❝❦ ✐s ❡✐t❤❡r ❛❝q✉✐r❡❞ ❜② ❛ t❤r❡❛❞ ♦r ❢r❡❡
Lock lck✿
✴✴ ✐♥✐t✐❛❧❧② ❢r❡❡
lck.acq()✿
✴✴ ❛❝q✉✐r❡ ❝❛❧❧❡r ♠✉st ♥♦t ❤♦❧❞ ❧♦❝❦ ❛t♦♠✐❝❛❧❧② ❛❝q✉✐r❡ lck ♦♥❧② ✐❢ ❢r❡❡✱ ♦✴✇ ✇❛✐t
lck.rel()✿
✴✴ r❡❧❡❛s❡ ❝❛❧❧❡r ♠✉st ❤♦❧❞ ❧♦❝❦ ❛t♦♠✐❝❛❧❧② ❢r❡❡ lck Pr♦❣r❡ss✿ ❛ t❤r❡❛❞ ❛t lck.acq() ❡✈❡♥t✉❛❧❧② ❣❡ts ♣❛st ✐❢ ❧♦❝❦ ✐s ❢r❡❡ ❝♦♥t✐♥✉♦✉s❧② ✴✴ ✇❢❛✐r❀ ✇❡❛❦ ❧♦❝❦ ❧♦❝❦ ✐s ❢r❡❡ ❝♦♥t✐♥✉♦✉s❧② ♦r r❡♣❡❛t❡❞❧② ✴✴ s❢❛✐r str♦♥❣ ❧♦❝❦
SLIDE 22
❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s
❧♦❝❦✲❝✈
Condition(lck) cv✿
✴✴ ❝♦♥❞ ✈❛r cv ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❧♦❝❦ ❧❝❦
cv.wait()✿
✴✴ ❛❧✇❛②s ❜❧♦❝❦s ❝❛❧❧❡r ♠✉st ❤♦❧❞ lck ❛t♦♠✐❝❛❧❧② r❡❧❡❛s❡ lck ❛♥❞ ✇❛✐t ♦♥ cv❀ ✇❤❡♥ ❛✇❛❦❡♥❡❞✿ ❛❝q✉✐r❡ lck❀ r❡t✉r♥
cv.signal()✿
❝❛❧❧❡r ♠✉st ❤♦❧❞ lck ❛t♦♠✐❝❛❧❧② ❛✇❛❦❡♥ ❛ t❤r❡❛❞ ✭✐❢ ❛♥②✮ ✇❛✐t✐♥❣ ♦♥ ❝✈❀ r❡t✉r♥ Pr♦❣r❡ss✿ ❛ t❤r❡❛❞ ❛t cv.wait() ❡✈❡♥t✉❛❧❧② ❣❡ts ♣❛st ✐❢
cv ✐s s✐❣♥❛❧❧❡❞✱ ❛♥❞ ♥♦ ♦t❤❡r ♣r♦❝❡ss ✐s ✇❛✐t✐♥❣ ♦♥ cv
✴✴ ✇❡❛❦
cv ✐s r❡♣❡❛t❡❞❧② s✐❣♥❛❧❧❡❞
✴✴ str♦♥❣
SLIDE 23
■♠♣❧❡♠❡♥t✐♥❣ ❆✇❛✐t ✇✐t❤ ▲♦❝❦✲❈✈
❧♦❝❦✲❝✈
❆✇❛✐t✲str✉❝t✉r❡❞ ♣r♦❣r❛♠ ✇✐t❤ ❞✐st✐♥❝t ❛✇❛✐t ❣✉❛r❞s B1✱ · · · ✱ BN ✇♦r❦s ❡✈❡♥ ✐❢ ❣✉❛r❞s ❛r❡ ♥♦t ❞✐st✐♥❝t ■♥tr♦❞✉❝❡ lck ❛♥❞ ❛ss♦❝✐❛t❡❞ cv1✱ · · · ✱ cvN ❘❡♣❧❛❝❡ await (Bi) S ❜②
lck.acq() while (not Bi) cvi.wait() S for k in 1, · · · , N if (Bk) cvk.signal() lck.rel()
❋♦r ♠♦r❡ ♣❛r❛❧❧❡❧✐s♠ ♣❛rt✐t✐♦♥ ❛✇❛✐ts ✐♥t♦ ✏♥♦♥✲❝♦♥✢✐❝t✐♥❣✑ ❣r♦✉♣s ✉s❡ s❡♣❛r❛t❡ ❧♦❝❦ ❢♦r ❡❛❝❤ ❣r♦✉♣
SLIDE 24
❖✉t❧✐♥❡
❧♦❝❦✲❝✈ ✐♠♣❧
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 25
Implementation BBuffLockCv
✕ ✶
❧♦❝❦✲❝✈ ✐♠♣❧
program BBuffLockCv(int N) { ia {N ≥ 1} Seq buff ← []; Lock lck; // protects buffer Condition(lck) cvItem; // signaled when buffer not empty Condition(lck) cvSpace; // signaled when buffer not full return mysid; input void mysid.put(Val x) lck.acq(); // Note: no ’•’ while (buff.size = N)
- cvSpace.wait();
buff.append(x); cvItem.signal(); lck.rel(); return;
SLIDE 26
Implementation BBuffLockCv
✕ ✷
❧♦❝❦✲❝✈ ✐♠♣❧
input Val mysid.get() lck.acq(); // Note: no ’•’ while (buff.size = 0)
- cvItem.wait();
Val x ← buff[0]; buff.remove(); cvSpace.signal(); lck.rel(); return x; input void mysid.end() endSystem(); return; atomicity assumption {lck, cvItem, cvSpace} progress assumption {weak fairness for threads} }
SLIDE 27
❖✉t❧✐♥❡
s❡♠❛♣❤♦r❡
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 28
❙❡♠❛♣❤♦r❡s
s❡♠❛♣❤♦r❡
❈♦♠❜✐♥❡s ♠✉t✉❛❧ ❡①❝❧✉s✐♦♥ ✰ ❝♦♥❞✐t✐♦♥❛❧ ✇❛✐t ❈♦✉♥t✐♥❣ s❡♠❛♣❤♦r❡s
Semaphore(N) sem✿ sem ✐♥✐t✐❛❧✐③❡❞ t♦ N ≥ 0 sem.P()✿ ❛t♦♠✐❝❛❧❧② sem − − ♦♥❧② ✐❢ sem > 0✱ ♦✴✇ ✇❛✐t sem.V()✿ ❛t♦♠✐❝❛❧❧② sem + +
❇✐♥❛r② s❡♠❛♣❤♦r❡s
Semaphore(N) sem✿ sem ✐♥✐t✐❛❧✐③❡❞ t♦ N in 0..1 sem.P()✿ ❛t♦♠✐❝❛❧❧② sem ← 0 ♦♥❧② ✐❢ sem = 1✱ ♦✴✇ ✇❛✐t sem.V()✿ ❛t♦♠✐❝❛❧❧② sem ← 1
Pr♦❣r❡ss✿ ❝♦♥❞✐t✐♦♥ ✐♥ ✇❤✐❝❤ ❛ t❤r❡❛❞ ❛t P() ❡✈❡♥t✉❛❧❧② ❣❡ts ♣❛st
sem > 0 ❤♦❧❞s ❝♦♥t✐♥✉♦✉s❧②
✴✴ ✇❢❛✐r❀ ✇❡❛❦ s❡♠
sem > 0 ❝♦♥t✐♥✉♦✉s❧② ♦r ✐♥t❡r♠✐tt❡♥t❧②
✴✴ s❢❛✐r❀ str♦♥❣ s❡♠
SLIDE 29
■♠♣❧❡♠❡♥t✐♥❣ ▲♦❝❦✲❝✈ ✇✐t❤ ❙❡♠❛♣❤♦r❡
s❡♠❛♣❤♦r❡
Pr♦❣r❛♠ ✇✐t❤ ❧♦❝❦s ❛♥❞ ❝♦♥❞✐t✐♦♥ ✈❛r✐❛❜❧❡s ❋♦r ❡✈❡r② ❧♦❝❦ lck ✐♥tr♦❞✉❝❡ ❜✐♥❛r② s❡♠❛♣❤♦r❡✱ s❛② lckMutex✱ ✐♥✐t✐❛❧✐③❡❞ t♦ 1
lck.acq() −
→ lckMutex.P()
lck.rel() −
→ lckMutex.V() ❋♦r ❡✈❡r② ❝♦♥❞✐t✐♦♥ ✈❛r✐❛❜❧❡ cv ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❧♦❝❦ lck ✐♥tr♦❞✉❝❡ ❜✐♥❛r② s❡♠❛♣❤♦r❡✱ s❛② cvGate✱ ✐♥✐t✐❛❧✐③❡❞ t♦ 0
cv.wait() −
→ lckMutex.V(); cvGate.P(); lckMutex.P()
cv.signal() −
→ cvGate.V() ❚♦ ❤❛✈❡ ✇❛✐t✐♥❣ t❤r❡❛❞ ❝♦♠❡ ❜❡❢♦r❡ ❡♥t❡r✐♥❣ t❤r❡❛❞ s❦✐♣ lckMutex.P() ❛❢t❡r cvGate.P() s❦✐♣ lckMutex.V() ❛❢t❡r cvGate.V() · · ·
SLIDE 30
❖✉t❧✐♥❡
s❡♠ ✐♠♣❧
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 31
❖✉t❧✐♥❡
♠♦r❡ ♣❛r❛❧❧❡❧✐s♠
❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ❇♦✉♥❞❡❞✲❇✉✛❡r ❙❡r✈✐❝❡ ■♥✈❡rs❡ ❆✇❛✐ts ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❆✇❛✐ts ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ▲♦❝❦s ❛♥❞ ❈♦♥❞✐t✐♦♥ ❱❛r✐❛❜❧❡s ❙❡♠❛♣❤♦r❡s ❇♦✉♥❞❡❞✲❇✉✛❡r ■♠♣❧❡♠❡♥t❛t✐♦♥ ✉s✐♥❣ ❙❡♠❛♣❤♦r❡s ✴✴ ❙❊❊ ❚❊❳❚ ■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠ ❈❛♥❝❡❧✐♥❣ ❇❧♦❝❦❡❞ ❈❛❧❧s ✴✴ ❙❊❊ ❚❊❳❚
SLIDE 32
■♥❝r❡❛s✐♥❣ P❛r❛❧❧❡❧✐s♠
♠♦r❡ ♣❛r❛❧❧❡❧✐s♠
❈♦♥s✐❞❡r ❛♥ ❛✇❛✐t✲str✉❝t✉r❡❞ ♣r♦❣r❛♠ ❉❡✜♥❡ t✇♦ ❛✇❛✐ts t♦ ❜❡ str♦♥❣❧② ♥♦♥❝♦♥✢✐❝t✐♥❣ ✐❢ t❤❡② ❞♦ ♥♦t ❝♦♥✢✐❝t ❡✈❡♥ ✇✐t❤♦✉t ❛t♦♠✐❝✐t② ♦❢ ❛✇❛✐ts ❚❡❝❤♥✐q✉❡ ✶ t♦ ✐♥❝r❡❛s✐♥❣ ♣❛r❛❧❧❡❧✐s♠ ♣❛rt✐t✐♦♥ ❛✇❛✐ts ✐♥t♦ ♥♦♥✲❝♦♥✢✐❝t✐♥❣ ❣r♦✉♣s ♦❢ ❛✇❛✐ts ✉s❡ s❡♣❛r❛t❡ ❧♦❝❦s ❢♦r t❤❡ ❣r♦✉♣s t♦ ❛✈♦✐❞ ❞❡❛❞❧♦❝❦✱ ♦❜t❛✐♥ ❧♦❝❦s ✐♥ ✐♥❝r❡❛s✐♥❣ ♦r❞❡r ❚❡❝❤♥✐q✉❡ ✷ t♦ ✐♥❝r❡❛s✐♥❣ ♣❛r❛❧❧❡❧✐s♠ ♠♦❞✐❢② ❝♦❞❡ t♦ ✐♥❝r❡❛s❡ ❡①t❡♥t ♦❢ str♦♥❣❧②✲♥♦♥❝♦♥✢✐❝t✐♥❣ ❛✇❛✐ts ❞✉♣❧✐❝❛t❡ ❤♦t s♣♦ts ✐♥t♦ s❡♣❛r❛t❡ ♠❡♠♦r② ❛r❡❛s ❧♦♦s❡♥ ❝♦✉♣❧✐♥❣ ❜❡t✇❡❡♥ ❞✉♣❧✐❝❛t❡s
SLIDE 33
BBuffPar✿ BBuff ✇✐t❤ ❝♦♥❝✉rr❡♥t put ❛♥❞ get
♠♦r❡ ♣❛r❛❧❧❡❧✐s♠
■♠♣❧❡♠❡♥t buff ❛s ❛ ❝✐r❝✉❧❛r ❛rr❛②
buffA[N] in ← 0
✴✴ ♥❡①t put ❝❛❧❧ ❛❝❝❡ss❡s buffA[in]
- ut ← 0
✴✴ ♥❡①t get ❝❛❧❧ ❛❝❝❡ss❡s buffA[out]
cnt ← 0
✴✴ ★ ✐t❡♠s ✐♥ buffA
input void mysid.put(x) p1: •await (cnt < N); p2: •buffA[in] ← x; await (true) cnt ← cnt + 1; in ← mod(in + 1, N); return input Val mysid.get(x) g1: •await (cnt > 0); g2: •x ← buffA[out]; await (true) cnt ← cnt − 1;
- ut ← mod(out + 1, N);
return
■❢ st❛t❡♠❡♥ts p2 ❛♥❞ g2 ❞♦ ♥♦t ❝♦♥✢✐❝t✱ ✇❡ ❝❛♥ r❡♠♦✈❡ t❤❡✐r •✬s
SLIDE 34
Pr♦✈✐♥❣ t❤❛t p2 ❛♥❞ g2 ❞♦ ♥♦t ❝♦♥✢✐❝t
♠♦r❡ ♣❛r❛❧❧❡❧✐s♠
▲❡t X ❜❡ BBuffPar ✇✐t❤ st❛t❡♠❡♥ts p2 ❛♥❞ g2 r❡♣❧❛❝❡❞ ❜② skip ❈❛♥ r❡♠♦✈❡ •✬s ❛t p2 ❛♥❞ g2 ✐❢ X s❛t✐s✜❡s ■♥✈ D✵ D✵ : (thread at p2) and (thread at g2) ⇒ in = out D✶✕D✺ s❛t✐s✜❡s ✐♥✈❛r✐❛♥❝❡ r✉❧❡ ❛♥❞ ✐♠♣❧✐❡s D✵✱ ✴✴ ■♥✈ D✵ ❤♦❧❞s D✶ : (at most one thread in put) D✷ : (at most one thread in get) D✸ : (thread on p2) ⇒ cnt < N D✹ : (thread at g2) ⇒ cnt > 0 D✺ : cnt = mod(in − out, N) ❙♦ •✬s ❛t p2 ❛♥❞ g2 ❝❛♥ ❜❡ r❡♠♦✈❡❞ ❢r♦♠ BBuffPar ◆♦✇ ❡❛s② t♦ s❤♦✇ BBuffPar ✐♠♣❧❡♠❡♥ts BoundedBuffer
SLIDE 35