concurrent programming
play

Concurrent Programming Threads of execution: Thread objects running - PowerPoint PPT Presentation

T RANSPARENT P ROXIES FOR J AVA F UTURES Polyvios Pratikakis Jaime Spacco Michael Hicks University of Maryland, College Park Transparent Proxies for Java Futures p. 1/51 Concurrent Programming Threads of execution: Thread objects


  1. T RANSPARENT P ROXIES FOR J AVA F UTURES Polyvios Pratikakis Jaime Spacco Michael Hicks University of Maryland, College Park Transparent Proxies for Java Futures – p. 1/51

  2. Concurrent Programming � Threads of execution: Thread objects running in parallel � Asynchronous method invocations: Methods can be called asynchronously � e.g: Main thread: o = new O(); o.m(); //async Transparent Proxies for Java Futures – p. 2/51

  3. Concurrent Programming � Threads of execution: Thread objects running in parallel � Asynchronous method invocations: Methods can be called asynchronously � e.g: Main thread: Child thread: o = new O(); ⇒ o.m(); //async o.m(); Transparent Proxies for Java Futures – p. 2/51

  4. Concurrent Programming � Threads of execution: Thread objects running in parallel � Asynchronous method invocations: Methods can be called asynchronously � e.g: Main thread: Child thread: o = new O(); ⇒ o.m(); //async o.m(); ... Transparent Proxies for Java Futures – p. 2/51

  5. Futures � What happens with returned value? � “Future” or “promise”: a placeholder for the result � “Claim” a future: If the result is not available, wait for it � Futures are proxies . Other examples: � Suspensions (lazy invocation) � Remote objects � Other wrappers Transparent Proxies for Java Futures – p. 3/51

  6. Java Transparent Proxy Framework � Static analysis and program transformation � Based on qualifier inference system � Formalization and proof of soundness � Implementation of Futures via async methods � Also lazy invocations, other applications � Benefits � Simple programming model � Can improve application performance Transparent Proxies for Java Futures – p. 4/51

  7. MultiLISP futures � (future e ) means e executes in parallel � Lisp is functional and dynamically typed � No need for the programmer to insert claims: The runtime system checks every access. If it is a future, claim before access � Programmer only inserts future notations � Futures are transparent Transparent Proxies for Java Futures – p. 5/51

  8. Java Futures not Transparent � Java is statically typed � Futures in JSR166 must be claimed explicitly: public interface Future< V > { V get(); V get(long timeout, TimeUnit unit); ... } Transparent Proxies for Java Futures – p. 6/51

  9. Programming Overhead To convert a method invocation to asynchronous: � Change the call site to be asynchronous � Change the type of the result to Future � Change the type of variables to which the result flows � Insert claims It is usual to claim early to avoid rewriting a lot of code Question: can we do this automatically? Transparent Proxies for Java Futures – p. 7/51

  10. Type Qualifiers � Qualifiers refine the meaning of types � final Integer is to Integer like Future<String> is to String � “Proxyness” is a type qualifier: proxy or nonproxy . If x has type � proxy String then x could be a proxy � nonproxy String then x is not a proxy � nonproxy ≤ proxy Transparent Proxies for Java Futures – p. 8/51

  11. Automatic Transformation � Use qualifier inference to determine where proxies flow � Transform program based on results � Rewrite proxy types � Insert claims whenever a proxy is used concretely Transparent Proxies for Java Futures – p. 9/51

  12. Example: Initial Program procRequest(Socket sock) { Buffer in = readBuf(sock); Request req = translate(in); Buffer out = process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 10/51

  13. Example: Async Calls procRequest(Socket sock) { Buffer in = @readBuf(sock); Request req = @translate(in); Buffer out = @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 11/51

  14. Example: Qualified Types procRequest(Socket sock) { Buffer in = proxy @readBuf(sock); Request req = proxy @translate(in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 12/51

  15. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); Request req = proxy @translate(in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 13/51

  16. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); Request req = proxy @translate(in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 14/51

  17. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); Request req = proxy @translate(proxy in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 15/51

  18. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); Request req = proxy @translate(proxy in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 16/51

  19. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 17/51

  20. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 18/51

  21. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); Buffer out = proxy @process(proxy req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 19/51

  22. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); Buffer out = proxy @process(proxy req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 20/51

  23. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); proxy Buffer out = proxy @process(proxy req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 21/51

  24. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); proxy Buffer out = proxy @process(proxy req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 22/51

  25. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); proxy Buffer out = proxy @process(proxy req); writeBuf(sock,proxy out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 23/51

  26. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); proxy Buffer out = proxy @process(proxy req); writeBuf(sock,proxy out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 24/51

  27. Example: Qualified Types procRequest(Socket sock) { proxy Buffer in = proxy @readBuf(sock); proxy Request req = proxy @translate(proxy in); proxy Buffer out = proxy @process(proxy req); writeBuf(sock,proxy out); } Request translate(proxy Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 25/51

  28. Example: Future Transformation procRequest(Socket sock) { Buffer in = @readBuf(sock); Request req = proxy @translate(in); Buffer out = proxy @process(req); writeBuf(sock,out); } Request translate(Buffer in) { Request result; ... in.foo() ... return result; } Transparent Proxies for Java Futures – p. 26/51

  29. Example: Future Transformation procRequest(Socket sock) { Object in = new Proxy{ private Object result; public void run() { result = readBuf(sock); } public synchronized Object get(){ return result; } ... }(); Executor.run((Runnable)in); Request req = @translate(in); Buffer out = @process(req); writeBuf(sock,out); } Transparent Proxies for Java Futures – p. 27/51

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend