r r tr - - PowerPoint PPT Presentation

r
SMART_READER_LITE
LIVE PREVIEW

r r tr - - PowerPoint PPT Presentation

r r tr r r sr t ts void put(x) Val


slide-1
SLIDE 1

❇♦✉♥❞❡❞ ❇✉✛❡r

❙❤❛♥❦❛r ❙❡♣t❡♠❜❡r ✶✽✱ ✷✵✶✹

slide-2
SLIDE 2

❖✈❡r✈✐❡✇

❇♦✉♥❞❡❞✲❜✉✛❡r s❡r✈✐❝❡ ✐♥♣✉t ❢✉♥❝t✐♦♥s✿ void put(x)✱ Val get()✱ void end() ♥♦ ♦✉t♣✉t ❢✉♥❝t✐♦♥s ■♠♣❧❡♠❡♥t❛t✐♦♥s ✉s✐♥❣ st❛♥❞❛r❞ s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝ts ❧♦❝❦s✱ ❝♦♥❞✐t✐♦♥ ✈❛r✐❛❜❧❡s s❡♠❛♣❤♦r❡s ■♠♣❧❡♠❡♥t❛t✐♦♥s ✉s✐♥❣ ❛✇❛✐t s②♥❝❤r♦♥✐③❛t✐♦♥ ❝♦♥str✉❝ts ♠♦r❡ ♣♦✇❡r❢✉❧✱ ❝♦♥✈❡♥✐❡♥t ♠❡❝❤❛♥✐❝❛❧ tr❛♥s❢♦r♠❛t✐♦♥ t♦ st❛♥❞❛r❞ s②♥❝❤ ❝♦♥str✉❝ts ❘❡❞✉❝❡ ❜❧♦❝❦✐♥❣ ✭✐♥❝r❡❛s❡ ♣❛r❛❧❧❡❧✐s♠✮ ✐♥ ✐♠♣❧❡♠❡♥t❛t✐♦♥s ❈❛♥❝❡❧❧✐♥❣ ❜❧♦❝❦❡❞ ❝❛❧❧s t♦ r❡♠♦t❡ s②st❡♠s ❛❧❧♦✇s ❛ ❝❛❧❧❡r ♥♦ ❧♦♥❣❡r ✐♥t❡r❡st❡❞ ✐♥ ❝❛❧❧ t♦ r❡tr✐❡✈❡ ✐ts❡❧❢

slide-3
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
SLIDE 35

❖✉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 ✴✴ ❙❊❊ ❚❊❳❚