1 / 27

Stateful Data Types

Stateful Data Types. Per Brand. Stateful Data Types I. Oz provides set of stateful data types. These include ports, objects, arrays, and dictionaries (hash tables):

lilly
Download Presentation

Stateful Data Types

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Stateful Data Types Per Brand

  2. Stateful Data Types I • Oz provides set of stateful data types. • These include ports, objects, arrays, and dictionaries (hash tables): • These data types are abstract in the sense that they are characterized only by the set of operations performed on the members of the type. • Their implementation is always hidden, and in fact different implementations exist but their corresponding behavior remains the same. • For example, objects are implemented in a totally different way depending on the optimization level of the compiler. • Each member is always unique by conceptually tagging it with an Oz-name upon creation. • A member is created by an explicit creation operation. A type test operation always exists. • In addition, a member ceases to exist when it is no longer accessible.

  3. Ports • A Port P is an asynchronous communication channel that can be shared among several senders. • A port has a stream associated with it. • The operation: {Port.new S ?P} creates a port P and initially connects it to the variable S taking the role of a stream. • The operation: {Port.send P M} appends the message M to the end of the stream associated with P. The port keeps track of the end of the stream as its next insertion point. • The operation {Port.is P ?B} checks whether P is a port. In order to protect the stream S from being bound by mistake S is actually a future. • Semantics: messages sent by the same thread arrive in the same order, but messages sent by different threads may arrive in any order.

  4. {Port.send P M} Port Port P P S1 S S <F> M M

  5. Example declare S PP = {Port.new S}{Browse S} {Port.send P 1}{Port.send P 2} • If you enter the above statements incrementally you will observe that S gets incrementally more defined. S<Future>1|_<Future>  1|2|_<Future> • Ports are more expressive abstractions than pure stream communication, since they can be shared among multiple threads, and can be embedded in other data structures. • Ports are the main message passing mechanism between threads in Oz.

  6. FIFO within thread Possible a1 a2 b1 b2 a1 b1 a2 b2 b1 a1 a2 b2 • declare S PP = {Port.new S}{Browse S}thread ... {Port.send P a1} ... {Port.send P a2}end... {Port.send P b1}...{Port.send P b2} Impossible a1 a2 b2 b1 b1 a2 a1 b2

  7. Client-Server Communication • Ports are used as a communication entry point to servers. • FIFO queue server: • It has two ports, one for inserting items to the queue using put, and • the other for fetch items out of the queue using get. • The server is insensitive to the relative arrival order of get and put requests. • get requests can arrive even when the queue is empty. • A server is created by {NewQueueServer ?Q}. • This procedure returns back a record Q with features put and get each holding a unary procedure. • A client thread having access to Q can request services by invoking these procedure. Notice how results are returned back through logic variables.

  8. The Program declare fun {NewQueueServer} Given GivePort={Port.new Given} Taken TakePort={Port.new Taken} in thread Given=Taken end queue(put:proc {$ X} {Port.send GivePort X} end get:proc {$ X} {Port.send TakePort X} end) end

  9. Alternative Program declare functor NewQueueServer export put: proc {$ X} {Port.send GivePort X} end get: proc {$ X} {Port.send TakePort X} end define Given GivePort={Port.new Given} Taken TakePort={Port.new Taken} thread Given = Taken end end

  10. Queue Server E1 E2 E3 <Future1> GivePort = X1=E1 X2=E2 TakePort X1 X2 <Future2>

  11. Cells • A cell is a reference to a memory cell with one mutable component. • A cell is a bit like a variable in a conventional language • {NewCell X ?C} a cell is created with the initial content X. • C is bound to a cell. Cell C X

  12. Cells II Operation Description {NewCell X ?C}Creates a cell C with content X. {IsCell +C} Tests if C is a cell {Exchange +C X Y}Swaps atomically the content of C from X to Y {Access +C X} Returns the content of C in X. {Assign +C Y} Modifies the content of C to Y. Note: last two operations can be defined in terms of exchange

  13. Exchange semantics {Exchange Cell Old New} <S> • Cell store (area of mutability) • Old, New and the cell contents are arbitrary language entities • B, C and A B C A Store Cell Store

  14. Exchange semantics -2 A=Old <S> • Exchange results in • cell contents updated • and the task of unifying the old cell contents with Old (third parameter of exchange). B C A Store Cell Store

  15. Exchange semantics-3 A=Old <S> • Exchange results in • The variables A and Oldhave been unified AB C AB Store Cell Store

  16. Cells and Data-Flow • declare S1 S2Cell={NewCell 0}proc{Count} Old New in {Access Cell Old} New=Old+1 % what if thread preempted here?? {Update Cell New}end thread for 1..1000 proc{$} {Count} endS1=unitendfor 1..1000 proc{$} {Count} end{Wait S2}{Wait S}{Show {Access Cell}} %% might not show 2000

  17. Cells and Data-Flow-2 • declare S1 S2Cell={NewCell 0}proc{Count} Old New in {Exchange Cell Old New} New=Old+1end thread for 1..1000 proc{$} {Count} endS1=unitendfor 1..1000 proc{$} {Count} end{Wait S2}{Wait S}{Show {Access Cell}} %% will show 2000

  18. Interleaving semantics {Exchange Cell Old1 New1} %% thread 1 New1=Old1+1 <Continuation> Cell New1 Old1 Old2 New2 3 {Exchange Cell Old2 New2} %% thread 2 New2=Old2+1 <Continuation>

  19. Interleaving - 2 <<3=Old1>> %% thread 1 has done first part of exch New1=Old1+1 <Continuation> New1 Cell Old1 Old2 New2 3 {Exchange Cell Old2 New2} %% thread 2 New2=Old2+1 <Continuation>

  20. Interleaving - 3 <<3=Old1>> %% thread 1 has done part of exch New1=Old1+1 <Continuation> New1 Old1 Cell Old2 New2 3 <<New1=Old2>> %% thread 2 has done part of exch New2=Old2+1 %% thread 2 must suspend here <Continuation>

  21. Interleaving - 4 <<3=Old1>> New1=Old1+1 <Continuation> New1 +1 Old1 +1 Old2 New2 3 <<New1=Old2>> New2=Old2+1 %% New2 is eventually bound to 5 <Continuation>

  22. Example I Cells and higher-order iterators allow conventional assignment-based programming in Oz. The following program accumulates in the cell J Note that the inner procedure contains the cell C in its closure declare C = {NewCell 0}{For 1 10 1proc {$ I} O N in {Exchange C O N} N = O+Iend}{Browse {Access C}} %% we will see 55

  23. Example II • I have the N:ary procedure P that thread 1 provides to thread 2 as a service. Augment to keep track of how many times thread 2 uses P. declare C = {NewCell 0} proc{NewP X1 … XN} O N in {Exchange C O N} N = O+I {P X1 … XN}end

  24. Locks • Locks is a mechanism in Oz to get exclusive access of a critical region (a piece of code) • On entry into a critical region, the lock is secured and the thread is granted exclusive access rights to the resource. • When execution leaves the region, whether normally or through an exception, the lock is released. • A concurrent attempt to obtain the same lock will block until the thread currently holding it has released it. • Locks are reentrant in Oz (as in Java) • Locks are not in kernel Oz, can be implemented using cells

  25. Locks • Locking a critical region S lockLthenSend • L is an expression that evaluates to a lock. • Assume T executes the above statement, if L is free T executes S and the lock L is bus. • Otherwise T is blocked and queued as the last thread waiting for L. • Other threads block until S is executed. • If E is not a lock, then a type error is raised. • {Lock.new ?L} creates a new lock L . • {Lock.is E} returns true iff E is a lock.

  26. Simple Locks • In the case of a simple lock, a nested attempt by the same thread to reacquire the same lock during the dynamic scope of a critical section guarded by the lock will block. • We say reentrancy is not supported. • Simple locks can be modeled in Oz as follows: • Code is a nullary procedure encapsulating the computation to be performed in the critical section. • The lock is represented as a procedure, which when applied to Code it tries to get the lock by waiting until the variable Old gets bound to unit. • Notice that the lock is released upon normal as well as abnormal exit.

  27. Locks (Simple) proc{NewSimpleLock ?Lock} Cell = {NewCell unit}inproc {Lock Code} Old New in try {Exchange Cell Old New} {Wait Old} {Code} finally New=unitendendend

More Related