0
C++ Network Programming with Patterns,           Frameworks, and ACE                         Douglas C. Schmidt          P...
Advanced ACE Tutorial                                                          Douglas C. Schmidt                    Roadm...
Advanced ACE Tutorial                                                                Douglas C. Schmidt                   ...
Advanced ACE Tutorial                                                                      Douglas C. Schmidt             ...
Advanced ACE Tutorial                                     Douglas C. Schmidt                        Challenges and Solutio...
Advanced ACE Tutorial                                    Douglas C. Schmidt                              Caveats    OO is ...
Advanced ACE Tutorial                                   Douglas C. Schmidt                           Tutorial Outline    B...
Advanced ACE Tutorial                                      Douglas C. Schmidt                  Software Development Enviro...
Advanced ACE Tutorial                                                                 Douglas C. Schmidt                  ...
Advanced ACE Tutorial                                         Douglas C. Schmidt                        Sources of Inheren...
Advanced ACE Tutorial                                      Douglas C. Schmidt                    Sources of Accidental Com...
Advanced ACE Tutorial                                     Douglas C. Schmidt                        OO Contributions to Co...
Advanced ACE Tutorial                                       Douglas C. Schmidt                        Overview of Patterns...
Advanced ACE Tutorial                                                  Do           Example: the Proxy Pattern            ...
Advanced ACE Tutorial                                       Douglas C. Schmidt           Overview of Frameworks and Compon...
Advanced ACE Tutorial                                                                   Douglas C. Schmidt                ...
Advanced ACE Tutorial                                                                                              Douglas...
Advanced ACE Tutorial                                Douglas C. Schmidt                           ACE Statistics        AC...
Advanced ACE Tutorial                                     Douglas C. Schmidt                        The Key Frameworks in ...
Advanced ACE Tutorial                                                               Douglas C. Schmidt              Patter...
Advanced ACE Tutorial                                                                Douglas C. Schmidt                   ...
Advanced ACE Tutorial                                 Douglas C. Schmidt                          TAO Statistics        TA...
Advanced ACE Tutorial                                                      Douglas C. Schmidt                            J...
Advanced ACE Tutorial                                                                         Douglas C. Schmidt          ...
Advanced ACE Tutorial                                                                   Do              Networked Logging ...
Advanced ACE Tutorial                             Douglas C. Schmidt        Networked Logging Service Programming APIThe l...
Advanced ACE Tutorial                              Douglas C. Schmidt                 Conventional Logging Server DesignTy...
Advanced ACE Tutorial                                         Do  The select()-based Logging Server           Implementati...
Advanced ACE Tutorial                             Do         Conventional Logging Server              ImplementationNote t...
Advanced ACE Tutorial                               Do    Main Event Loop of Logging Serverint main (int argc, char *argv[...
Advanced ACE Tutorial                                  Do             Initialize Acceptor Socketstatic void initialize_acc...
Advanced ACE Tutorial                                 Do              Handle Data Processingstatic void handle_data (void)...
Advanced ACE Tutorial                                DoReceive and Process Logging Recordsstatic ssize_t handle_log_record...
Advanced ACE Tutorial                                  Do       Handle Connection Acceptancestatic void handle_connections...
Advanced ACE Tutorial                               Do          Conventional Client Logging           Daemon Implementatio...
Advanced ACE Tutorial                               Do      Client Connection Establishmentstatic HANDLE initialize_stream...
Advanced ACE Tutorial                                      Douglas C. Schmidt          Limitations with Algorithmic Decomp...
Advanced ACE Tutorial                                     Douglas C. Schmidt                        Overcoming Limitations...
Advanced ACE Tutorial                                       Douglas C. Schmidt                        OO Contributions to ...
Advanced ACE Tutorial                                                    Douglas C. Schmidt            Patterns in the Net...
Advanced ACE Tutorial                                      Douglas C. Schmidt                        Summary of Pattern In...
Advanced ACE Tutorial                                      Douglas C. Schmidt               Components in the OO Logging S...
Advanced ACE Tutorial                                                           Do  Class Diagram for OO Logging Server   ...
Advanced ACE Tutorial                                      Douglas C. Schmidt                  Addressing Robustness, Port...
Advanced ACE Tutorial                                             Douglas C. Schmidt                        The Wrapper Fa...
Advanced ACE Tutorial                                DoMotivating the Wrapper Facade Pattern:             the Socket API  ...
Advanced ACE Tutorial                              Douglas C. Schmidt           Problem with Sockets: Lack of Type-safetyi...
Advanced ACE Tutorial                                     Douglas C. Schmidt         Problem with Sockets: Steep Learning ...
Advanced ACE Tutorial                                       Douglas C. Schmidt                    Problem with Sockets: Po...
Advanced ACE Tutorial                               Douglas C. Schmidt             Problem with Sockets: Poorly Structured...
Advanced ACE Tutorial                                                                                                     ...
Advanced ACE Tutorial                                                                              DoSolution: ACE Socket ...
Advanced ACE Tutorial                                                 Do         The ACE Connection-Oriented           Soc...
Advanced ACE Tutorial                                        Douglas C. Schmidt                The ACE Connection-Oriented...
Advanced ACE Tutorial                                    Douglas C. Schmidt    ACE Connection-Oriented Socket Wrapper Faca...
Advanced ACE Tutorial                                    Douglas C. Schmidt                     Design Interlude: Motivati...
Advanced ACE Tutorial                         Do      An Echo Server Written using    ACE C++ Socket Wrapper Facadesint ec...
Advanced ACE Tutorial                         Do    A Generic Version of the Echo Servertemplate class ACCEPTORint echo_se...
Advanced ACE Tutorial                                                  Douglas C. Schmidt              Scope of the ACE IP...
Advanced ACE Tutorial                               Do     Using the Wrapper Facade Pattern          for the Logging Serve...
Advanced ACE Tutorial                                Do    Main Event Loop of Logging Serverint main (int argc, char *argv...
Advanced ACE Tutorial                                 Do            Handling Connections and                Data Processin...
Advanced ACE Tutorial                               DoReceive and Process Logging Recordsstatic ssize_t handle_log_record ...
Advanced ACE Tutorial                             Do                OO Client Logging              Daemon Implementationin...
Advanced ACE Tutorial                                   Douglas C. Schmidt              Evaluating the Wrapper Facade Solu...
Advanced ACE Tutorial                                     Douglas C. Schmidt                         ACE C++ Wrapper Facad...
Advanced ACE Tutorial                                     Douglas C. Schmidt                 Enforce Typesafety at Compile...
Advanced ACE Tutorial                                      Douglas C. Schmidt             Allow Controlled Violations of T...
Advanced ACE Tutorial                                  Douglas C. Schmidt                        Supply Default Parameters...
Advanced ACE Tutorial                              Do       Define Parsimonious Interfacese.g., use LSOCK to pass socket ha...
Advanced ACE Tutorial                                   Douglas C. Schmidt     Combine Multiple Operations into One Operat...
Advanced ACE Tutorial                                               Douglas C. Schmidt                 Create Hierarchical...
Advanced ACE Tutorial                                                               Douglas C. Schmidt        Enhance Port...
Advanced ACE Tutorial                                    Douglas C. Schmidt                  Inline Performance Critical M...
Advanced ACE Tutorial                                    Douglas C. Schmidt  Define Auxiliary Classes to Hide Error-Prone D...
Advanced ACE Tutorial                                       Douglas C. Schmidt              Demultiplexing and Dispatching...
Advanced ACE Tutorial                                                             Douglas C. Schmidt                      ...
Advanced ACE Tutorial                                                           Douglas C. Schmidt                        ...
Advanced ACE Tutorial                                                           Do        Structure and Implementations   ...
Advanced ACE Tutorial                                                           Do      Using the ACE Reactor Framework   ...
Advanced ACE Tutorial                                     Douglas C. Schmidt           Addressing Acceptor Endpoint Connec...
Advanced ACE Tutorial                                         Do      The Acceptor-Connector Pattern             (Acceptor...
Advanced ACE Tutorial                                                            Do            Structure of the ACE       ...
Advanced ACE Tutorial                                           Do             Using the ACE_Acceptor              in the ...
Advanced ACE Tutorial                               Do  ACE_Acceptor Class Public Interfacetemplate class SVC_HANDLER, // ...
Advanced ACE Tutorial                               Do    ACE_Acceptor Class Implementation// Shorthand names.#define SH S...
Advanced ACE Tutorial                                                 Douglas C. Schmidt                        The Templa...
Advanced ACE Tutorial                                              Douglas C. Schmidt                Using the Template Me...
Advanced ACE Tutorial                                                      Douglas C. Schmidt                             ...
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Ace tutorial c
Upcoming SlideShare
Loading in...5
×

Ace tutorial c

2,543

Published on

Published in: Career
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,543
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
29
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Ace tutorial c"

  1. 1. C++ Network Programming with Patterns, Frameworks, and ACE Douglas C. Schmidt Professor Department of EECS d.schmidt@vanderbilt.edu Vanderbilt University www.cs.wustl.edu/schmidt/ (615) 343-8197 Sponsors NSF, DARPA, ATD, BBN, Boeing, Cisco, Comverse, GDIS, Experian, Global MT,Hughes, Kodak, Krones, Lockheed, Lucent, Microsoft, Mitre, Motorola, NASA, Nokia, Nortel, OCI, Oresis, OTI, QNX, Raytheon, SAIC, Siemens SCR, Siemens MED, Siemens ZT, Sprint, Telcordia, USENIX
  2. 2. Advanced ACE Tutorial Douglas C. Schmidt Roadmap to Levels of Middleware APPLICATIONS Observations DOMAIN-SPECIFIC MIDDLEWARE SERVICES HUD WTS AVIONICS REPLICATION – Historically, apps Nav SERVICE built atop OS COMMON MIDDLEWARE SERVICES EVENT CHANNEL Cons Cons – Today, apps built Cons atop middleware DISTRIBUTION MIDDLEWARE – Middleware has multiple layers HOST INFRASTRUCTURE MIDDLEWARE Just like network OPERATING SYSTEMS PROTOCOLS protocol stacks HARDWARE DEVICES www.cs.wustl.edu/˜schmidt/PDF/ middleware-chapter.pdfVanderbilt University 1
  3. 3. Advanced ACE Tutorial Douglas C. Schmidt Motivation for Concurrency SERVER maxfdp1 Leverage hardware/software read_fds CLIENT WORK REQUEST – e.g., multi-processors and OS WORK WORK WORK thread support CLIENT REQUEST REQUEST REQUEST CLIENT CLIENT Increase performance (1) ITERATIVE SERVER – e.g., overlap computation and SERVER communication CLIENT Improve response-time WORK REQUEST – e.g., GUIs and network servers WORK WORK WORK CLIENT REQUEST REQUEST REQUEST Simplify program structure CLIENT CLIENT – e.g., sync vs. async (2) CONCURRENT SERVERVanderbilt University 2
  4. 4. Advanced ACE Tutorial Douglas C. Schmidt Motivation for Distribution PRINTER Collaboration ! connectivity and COMPUTER interworking CD ROM FILE SYSTEM Performance ! multi-processing and locality ! (1) STAND-ALONE APPLICATION ARCHITECTURE Reliability and availability TIME NAME SERVICE SERVICE CYCLE replication SERVICE DISPLAY SERVICE Scalability and portability ! FI LE modularity NETWORK ! SERVICE PRINT Extensibility dynamic SERVICE configuration and reconfiguration CD ROM PRINTER FILE SYSTEM Cost effectiveness ! open (2) DISTRIBUTED APPLICATION ARCHITECTURE systems and resource sharingVanderbilt University 3
  5. 5. Advanced ACE Tutorial Douglas C. Schmidt Challenges and Solutions Developing efficient, robust, and extensible concurrent networking applications is hard – e.g., must address complex topics that are less problematic or not relevant for non-concurrent, stand-alone applications OO techniques and OO language features help to enhance software quality factors – Key OO techniques include patterns and frameworks – Key OO language features include classes, inheritance, dynamic binding, and parameterized types – Key software quality factors include modularity, extensibility, portability, reusability, and correctnessVanderbilt University 4
  6. 6. Advanced ACE Tutorial Douglas C. Schmidt Caveats OO is not a panacea – Though when used properly it helps minimize “accidental” complexity and improve software quality factors It’s also essential to understand advanced OS features to enhance functionality and performance, e.g., – Multi-threading – Multi-processing – Synchronization – Shared memory – Explicit dynamic linking – Communication protocols and IPC mechanismsVanderbilt University 5
  7. 7. Advanced ACE Tutorial Douglas C. Schmidt Tutorial Outline Brief overview of key OO networking and concurrency concepts and OS platform mechanisms – Emphasis is on practical solutions Examine a range of examples in detail – Networked Logging Service – Concurrent Web Server – Application-level Telecom Gateway – Call Center Manager Event Server Discuss general concurrent programming strategies Provide URLs for further reading on the topicVanderbilt University 6
  8. 8. Advanced ACE Tutorial Douglas C. Schmidt Software Development Environment The topics discussed here are largely independent of OS, network, and programming language – Currently used successfully on UNIX/POSIX, Windows, and RTOS platforms, running on TCP/IP networks using C++ Examples are illustrated using freely available ADAPTIVE Communication Environment (ACE) OO framework components – Although ACE is written in C++, the principles covered in this tutorial apply to other OO languages – e.g., Java, Eiffel, Smalltalk, etc. In addition, other networks and backplanes can be used, as wellVanderbilt University 7
  9. 9. Advanced ACE Tutorial Douglas C. Schmidt Sources of Complexity PRINTER Inherent complexity COMPUTER – Latency FILE CD ROM SYSTEM – Reliability – Synchronization (1) STAND-ALONE APPLICATION ARCHITECTURE – Deadlock TIME NAME CYCLE SERVICE SERVICE SERVICE Accidental Complexity DISPLAY SERVICE – Low-level APIs FI LE NETWORK SERVICE – Poor debugging tools PRINT – Algorithmic SERVICE CD ROM decomposition PRINTER FILE SYSTEM – Continuous (2) DISTRIBUTED APPLICATION ARCHITECTURE re-inventionVanderbilt University 8
  10. 10. Advanced ACE Tutorial Douglas C. Schmidt Sources of Inherent Complexity Inherent complexity results from fundamental domain challenges,e.g.: Concurrent programming Distributed programming Eliminating “race conditions” Addressing the impact of latency Deadlock avoidance Fault tolerance and high availability Fair scheduling Load balancing and service partitioning Performance optimization and tuning Consistent ordering of distributed eventsVanderbilt University 9
  11. 11. Advanced ACE Tutorial Douglas C. Schmidt Sources of Accidental ComplexityAccidental complexity results from limitations with tools and techniquesused to develop concurrent applications, e.g., Lack of portable, reentrant, type-safe and extensible system call interfaces and component libraries Inadequate debugging support and lack of concurrent and distributed program analysis tools Widespread use of algorithmic decomposition – Fine for explaining concurrent programming concepts and algorithms but inadequate for developing large-scale concurrent network applications Continuous rediscovery and reinvention of core concepts and componentsVanderbilt University 10
  12. 12. Advanced ACE Tutorial Douglas C. Schmidt OO Contributions to Concurrent and Distributed Applications Concurrent network programming is Patterns and frameworks elevate traditionally performed using development level to focus on low-level OS mechanisms, e.g., application concerns, e.g., fork/exec Service functionality and policies Shared memory and semaphores Service configuration Memory-mapped files Concurrent event Signals demultiplexing and event sockets/select handler dispatching Low-level thread APIs Service concurrency and synchronizationVanderbilt University 11
  13. 13. Advanced ACE Tutorial Douglas C. Schmidt Overview of Patterns Patterns represent solutions to problems that arise when developing software within a particular context – i.e., “Patterns == problem/solution pairs within a context” Patterns capture the static and dynamic structure and collaboration among key participants in software designs – They are particularly useful for articulating how and why to resolve non-functional forces Patterns facilitate reuse of successful software architectures and designsVanderbilt University 12
  14. 14. Advanced ACE Tutorial Do Example: the Proxy Pattern 1: METHOD CALL : BROKER : QUOTER PROXY 4: METHOD RETURN 2: FORWARD REQUEST 3: RESPONSE CLIENT NETWORK : QUOTER SERVERIntent: Provide a surrogate for another object thatcontrols access to itVanderbilt University
  15. 15. Advanced ACE Tutorial Douglas C. Schmidt Overview of Frameworks and Components A framework is: – “An integrated collection of components that collaborate to produce a reusable architecture for a family of related applications” Frameworks differ from conventional class libraries: 1. Frameworks are “semi-complete” applications 2. Frameworks address a particular application domain 3. Frameworks provide “inversion of control” Frameworks facilitate reuse of successful networked application software designs and implementations – Applications inherit from and instantiate framework componentsVanderbilt University 14
  16. 16. Advanced ACE Tutorial Douglas C. Schmidt Class Libraries versus Frameworks APPLICATION- LOCAL SPECIFIC INVOCATIONS MATH CLASSES Key distinctions FUNCTIONALITY ADT CLASSES DATABASE Class libraries CLASSES EVENT GLUE GUI NETWORK – Reusable building blocks CLASSES CODE IPC LOOP CLASSES – Domain-independent (A) CLASS LIBRARY ARCHITECTURE – Limited in scope – Passive EVENT NETWORKING LOOP ADT Frameworks CLASSES GUI APPLICATION- CALL – Reusable, “semi-complete” INVOKES SPECIFIC BACKS FUNCTIONALITY EVENT applications MATH LOOP CLASSES – Domain-specific DATABASE EVENT LOOP – Broader in scope (B) FRAMEWORK ARCHITECTURE – ActiveVanderbilt University 15
  17. 17. Advanced ACE Tutorial Douglas C. Schmidt The ADAPTIVE Communication Environment (ACE) - JAWS ADAPTIVE STANDARDS BASED MIDDLEWARE NETWORKED WEB SERVER THE ACE ORB SERVICE TOKEN GATEWAY COMPONENTS (TAO) SERVER SERVER LAYER LOGGING NAME TIME SERVER SERVER SERVER SERVICE CORBA FRAMEWORK ACCEPTOR CONNECTOR HANDLER HANDLER LAYER PROCESS/ STREAMS C++ THREAD LOG SHARED SERVICE WRAPPER MANAGERS MSG CONFIG- MALLOC FACADE REACTOR/ PROACTOR URATOR LAYER SYNCH SPIPE SOCK SAP/ FIFO MEM FILE WRAPPERS SAP TLI SAP SAP MAP SAP OS ADAPTATION LAYER C PROCESSES/ WIN32 NAMED SOCKETS/ UNIX SELECT/ DYNAMIC SHARED FILE SYS PIPES UNIX APIS THREADS STREAM PIPES TLI FIFOS IO COMP LINKING MEMORY APIS PROCESS/THREAD COMMUNICATION VIRTUAL MEMORY FILE SUBSYSTEM SUBSYSTEM SUBSYSTEM GENERAL OPERATING SYSTEM SERVICES www.cs.wustl.edu/˜schmidt/ACE.htmlVanderbilt University 16
  18. 18. Advanced ACE Tutorial Douglas C. Schmidt ACE Statistics ACE library contains 250,000 Currently used by lines of C++ dozens of companies – Over 40 person-years of effort – Bellcore, BBN, Boeing, Ericsson, Ported to UNIX, Windows, MVS, and Hughes, Kodak, RT/embedded platforms Lockheed, Lucent, – e.g., VxWorks, LynxOS, Chorus Motorola, Nokia, Nortel, Raytheon, Large user and open-source SAIC, Siemens, etc. developer community Supported commercially – ˜schmidt/ACE-users.html by Riverace – www.riverace.comVanderbilt University 17
  19. 19. Advanced ACE Tutorial Douglas C. Schmidt The Key Frameworks in ACE Acceptor- Reactor Proactor Connector Service Streams Task Configurator ACE contains a number of frameworks that can be used separately or together This design permits fine-grained subsetting of ACE components – Subsetting helps minimize ACE’s memory footprint – $ACE_ROOT/doc/ACE-subsets.htmlVanderbilt University 18
  20. 20. Advanced ACE Tutorial Douglas C. Schmidt Patterns for Communication Middleware Thread-per Active Acceptor Observation Request Object Thread-per Connector Failures rarely result from Session Half-Sync/ unknown scientific Thread Half-Async Component Pool Configurator principles, but from failing Thread Leader/ to apply proven Object Specific Followers Lifetime engineering practices and Storage Manager patterns Asynchronous Reactor Completion Double Thread- Token Checked Safe Benefits of Patterns Proactor Locking Interface Facilitate design reuse External Wrapper Scoped Strategized Polymorphism Facade Locking Locking Preserve crucial design Concurrency Event Initialization Synchronization information Patterns Patterns Patterns Patterns Guide design choicesVanderbilt University 19
  21. 21. Advanced ACE Tutorial Douglas C. Schmidt The ACE ORB (TAO) in args TAO Overview ! CLIENT OBJ operation() OBJECT REF out args + return (SERVANT) A real-time, value high-performance IDL SKELETON REAL-TIME ORB IDL ORB RUN-TIME STUBS SCHEDULER OBJECT ADAPTER Leverages ACE REAL-TIME ORB CORE – Runs on POSIX, IOP IOP PLUGGABLE ORB XPORT PLUGGABLE ORB XPORT Windows, PROTOCOLS PROTOCOLS RTOSs OS KERNEL OS KERNEL REAL-TIME I/O ACE REAL-TIME I/O Related efforts ! SUBSYSTEM COMPONENTS SUBSYSTEM HIGH-SPEED HIGH-SPEED NETWORK INTERFACE NETWORK NETWORK INTERFACE QuO at BBN MIC/GME at www.cs.wustl.edu/˜schmidt/TAO. Vanderbilt html XOTSVanderbilt University 20
  22. 22. Advanced ACE Tutorial Douglas C. Schmidt TAO Statistics TAO order of magnitude 50 person-years of effort – Core ORB 300,000 LOC Currently used by many – IDL compiler 200,000 companies LOC – e.g., Boeing, BBN, Lockheed, – CORBA Object Services Lucent, Motorola, Raytheon, 250,000 LOC SAIC, Siemens, etc. – Leverages ACE heavily Supported commercially by OCI Ported to UNIX, Windows, and PrismTech RT/embedded platforms – www.ociweb.com – e.g., VxWorks, LynxOS, – www.prismtechnologies.com Chorus, WinCEVanderbilt University 21
  23. 23. Advanced ACE Tutorial Douglas C. Schmidt JAWS Adaptive Web Server 1: GET ~schmidt JAWS Overview WWW HTTP/1.0 WWW CLIENT SERVER 2: index.html – A high-performance PROTOCOL HANDLERS Web server HTML PARSER Flexible concurrency GUI DISPATCHER and dispatching REQUESTER mechanisms – Leverages the ACE COMMUNICATION PROTOCOL GRAPHICS ADAPTER (E.G., HTTP) framework Ported to most OS OS KERNEL OS KERNEL platforms OS I/O SUBSYSTEM OS I/O SUBSYSTEM – Used commercially by NETWORK ADAPTERS NETWORK ADAPTERS CacheFlow NETWORK www.cacheflow.com www.cs.wustl.edu/˜jxh/ research/Vanderbilt University 22
  24. 24. Advanced ACE Tutorial Douglas C. Schmidt Java ACE DISTRIBUTED SERVICES AND Java ACE TOKEN LOGGING NAME TIME COMPONENTS SERVER SERVER SERVER SERVER Overview FRAMEWORKS AND CLASS SERVICE A Java version ACCEPTOR CONNECTOR CATEGORIES HANDLER of ACE ADAPTIVE SERVICE EXECUTIVE (ASX) JAVA SYNCH SOCK_SAP THREAD LOG TIMER SERVICE – Used for WRAPPERS WRAPPERS MANAGER CONFIGURATOR MSG QUEUE medical JAVA VIRTUAL MACHINE (JVM) imaging www.cs.wustl.edu/˜schmidt/JACE.html prototype www.cs.wustl.edu/˜schmidt/C++2java. html www.cs.wustl.edu/˜schmidt/PDF/ MedJava.pdfVanderbilt University 23
  25. 25. Advanced ACE Tutorial Do Networked Logging Service PRINTER P1 CONSOLE CLIENT LOCAL IPC LOGGING P2 DAEMON RE MO P3 TE IPC SERVER LOGGING DAEMON HA A OST B HOST B HOST CLIENT SERVER A IPC TE MO NETWORK RE STORAGE DEVICE HOST P1 CLIENT B CLIENT LOCAL IPC LOGGING P2 DAEMON P3Intent: Server logging daemon collects, formats,and outputs logging records forwarded from clientlogging daemons residing throughout a network orInternetVanderbilt University
  26. 26. Advanced ACE Tutorial Douglas C. Schmidt Networked Logging Service Programming APIThe logging API is similar to printf(), e.g.:ACE_ERROR ((LM_ERROR, (%t) fork failed));Generates on logging server host:Oct 31 14:50:13 1992@tango.ics.uci.edu@2766@LM_ERROR@client::(4) fork failedandACE_DEBUG ((LM_DEBUG, (%t) sending to server %s, server_host));generates on logging server host:Oct 31 14:50:28 1992@zola.ics.uci.edu@18352@LM_DEBUG@drwho::(6) sending to server bastilleVanderbilt University 25
  27. 27. Advanced ACE Tutorial Douglas C. Schmidt Conventional Logging Server DesignTypical algorithmic pseudo-code for The “grand mistake:”networked logging server: Avoid the temptation tovoid logging_server (void) { “step-wise refine” this initialize acceptor endpoint algorithmically decomposed loop forever { pseudo-code directly into wait for events the detailed design and handle data events implementation of the handle connection events logging server! }}Vanderbilt University 26
  28. 28. Advanced ACE Tutorial Do The select()-based Logging Server Implementation SERVER SERVER LOGGING DAEMON maxhandlep1 acceptor NETWORK read_handles CLIENT CONNECTION REQUEST LOGGING RECORDS LOGGING LOGGING RECORDS RECORDS CLIENT CLIENT CLIENTSerializes server processing at select()demuxing levelVanderbilt University
  29. 29. Advanced ACE Tutorial Do Conventional Logging Server ImplementationNote the excessive amount of detail required toprogram at the socket level...// Main programstatic const int PORT = 10000;typedef u_long COUNTER;typedef int HANDLE;// Counts the # of logging records processedstatic COUNTER request_count;// Acceptor-mode socket handlestatic HANDLE acceptor;// Highest active handle number, plus 1static HANDLE maxhp1;// Set of currently active handlesstatic fd_set activity_handles;// Scratch copy of activity_handlesstatic fd_set ready_handles;Vanderbilt University
  30. 30. Advanced ACE Tutorial Do Main Event Loop of Logging Serverint main (int argc, char *argv[]){ initialize_acceptor (argc 1 ? atoi (argv[1]) : PORT); // Loop forever performing logging // server processing. for (;;) { // struct assignment. ready_handles = activity_handles; // Wait for client I/O events. select (maxhp1, ready_handles, 0, 0, 0); // First receive pending logging records. handle_data (); // Then accept pending connections. handle_connections (); }}Vanderbilt University
  31. 31. Advanced ACE Tutorial Do Initialize Acceptor Socketstatic void initialize_acceptor (u_short port){ struct sockaddr_in saddr; // Create a local endpoint of communication. acceptor = socket (PF_INET, SOCK_STREAM, 0); // Set up the address info. to become server. memset ((void *) saddr, 0, sizeof saddr); saddr.sin_family = AF_INET; saddr.sin_port = htons (port); saddr.sin_addr.s_addr = htonl (INADDR_ANY); // Associate address with endpoint bind (acceptor, (struct sockaddr *) saddr, sizeof saddr); // Make endpoint listen for connection requests. listen (acceptor, 5); // Initialize handle sets. FD_ZERO (ready_handles); FD_ZERO (activity_handles); FD_SET (acceptor, activity_handles); maxhp1 = acceptor + 1;}Vanderbilt University
  32. 32. Advanced ACE Tutorial Do Handle Data Processingstatic void handle_data (void) { // acceptor + 1 is the lowest client handle for (HANDLE h = acceptor + 1; h maxhp1; h++) if (FD_ISSET (h, ready_handles)) { ssize_t n = handle_log_record (h, 1); // Guaranteed not to block in this case! if (n 0) ++request_count; // Count the # of logging records else if (n == 0) { // Handle connection shutdown. FD_CLR (h, activity_handles); close (h); if (h + 1 == maxhp1) { // Skip past unused handles while (!FD_ISSET (--h, activity_handles)) continue; maxhp1 = h + 1; } } }}Vanderbilt University
  33. 33. Advanced ACE Tutorial DoReceive and Process Logging Recordsstatic ssize_t handle_log_record (HANDLE in_h, HANDLE out_h) { ssize_t n; size_t len; Log_Record lr; // The first recv reads the length (stored as a // fixed-size integer) of adjacent logging record. n = recv (in_h, (char *) len, sizeof len, 0); if (n = 0) return n; len = ntohl (len); // Convert byte-ordering // The second recv then reads len bytes to // obtain the actual record. for (size_t nread = 0; nread len; nread += n n = recv (in_h, ((char *) lr) + nread, len - nread, 0); // Decode and print record. decode_log_record (lr); if (write (out_h, lr.buf, lr.size) == -1) return -1; else return 0;}Vanderbilt University
  34. 34. Advanced ACE Tutorial Do Handle Connection Acceptancestatic void handle_connections (void){ if (FD_ISSET (acceptor, ready_handles)) { static struct timeval poll_tv = {0, 0}; HANDLE h; // Handle all pending connection requests // (note use of select’s polling feature) do { // Beware of subtle bug(s) here... h = accept (acceptor, 0, 0); FD_SET (h, activity_handles); // Grow max. socket handle if necessary. if (h = maxhp1) maxhp1 = h + 1; } while (select (acceptor + 1, ready_handles, 0, 0, poll_tv) == 1);}Vanderbilt University
  35. 35. Advanced ACE Tutorial Do Conventional Client Logging Daemon ImplementationThe main() method receives logging records fromclient applications and forwards them on to thelogging serverint main (int argc, char *argv[]){ HANDLE stream = initialize_stream_endpoint (argc 1 ? atoi (argv[1]) : PORT); Log_Record lr; // Loop forever performing client // logging daemon processing. for (;;) { // ... get logging records from client // application processes ... size_t size = htonl (lr.size); send (stream, size, sizeof size); encode_log_record (lr); send (stream, ((char *) lr), sizeof lr); }}Vanderbilt University
  36. 36. Advanced ACE Tutorial Do Client Connection Establishmentstatic HANDLE initialize_stream_endpoint (const char *host, u_short port){ struct sockaddr_in saddr; // Create a local endpoint of communication. HANDLE stream = socket (PF_INET, SOCK_STREAM, 0); // Set up the address info. to become client. memset ((void *) saddr, 0, sizeof saddr); saddr.sin_family = AF_INET; saddr.sin_port = htons (port); hostent *hp = gethostbyname (host); memcpy ((void *) saddr, htonl (hp-h_addr), hp-h_length); // Associate address with endpoint connect (stream, (struct sockaddr *) saddr, sizeof saddr); return stream;}Vanderbilt University
  37. 37. Advanced ACE Tutorial Douglas C. Schmidt Limitations with Algorithmic DecompositionAlgorithmic decomposition tightly couples application-specificfunctionality and the following configuration-related characteristics: Application Structure – The number of services per process – Time when services are configured into a process Communication and Demultiplexing Mechanisms – The underlying IPC mechanisms that communicate with other participating clients and servers – Event demultiplexing and event handler dispatching mechanisms Concurrency and Synchronization Model – The process and/or thread architecture that executes service(s) at run-timeVanderbilt University 36
  38. 38. Advanced ACE Tutorial Douglas C. Schmidt Overcoming Limitations via OO The algorithmic decomposition illustrated above specifies many low-level details – Moreover, the excessive coupling impedes reusability, extensibility, and portability... In contrast, OO focuses on application-specific behavior, e.g., int Logging_Handler::handle_input (void) { ssize_t n = handle_log_record (peer ().get_handle (), ACE_STDOUT); if (n 0) ++request_count; // Count the # of logging records return n = 0 ? -1 : 0; }Vanderbilt University 37
  39. 39. Advanced ACE Tutorial Douglas C. Schmidt OO Contributions to Software Patterns facilitate the large-scale reuse of software architecture – Even when reuse of algorithms, detailed designs, and implementations is not feasible Frameworks achieve large-scale design and code reuse – In contrast, traditional techniques focus on the functions and algorithms that solve particular requirements Note that patterns and frameworks are not unique to OO! – However, objects and classes are useful abstraction mechanismsVanderbilt University 38
  40. 40. Advanced ACE Tutorial Douglas C. Schmidt Patterns in the Networked Logging Server Active Object Component Configurator Acceptor STRATEGIC Reactor PATTERNS TACTICAL PATTERNS Adapter Iterator Factory Template Wrapper Method Method Facade Strategic and tactical are relative to the context and abstraction levelVanderbilt University 39
  41. 41. Advanced ACE Tutorial Douglas C. Schmidt Summary of Pattern Intents Wrapper Facade ! “Encapsulates the functions and data provided by existing non-OO APIs within more concise, robust, portable, maintainable, and cohesive OO class interfaces” Reactor ! “Demultiplexes and dispatches requests that are delivered concurrently to an application by one or more clients” Acceptor ! “Decouple the passive connection and initialization of a peer service in a distributed system from the processing performed once the peer service is connected and initialized” Component Configurator ! “Decouples the implementation of services from the time when they are configured” Active Object ! “Decouples method execution from method invocation to enhance concurrency and simplify synchronized access to an object that resides in its own thread of control”Vanderbilt University 40
  42. 42. Advanced ACE Tutorial Douglas C. Schmidt Components in the OO Logging Server Application-specific components – Process logging records received from clients Connection-oriented application components – ACE_Svc_Handler (service handler) Performs I/O-related tasks with clients – ACE_Acceptor factory Passively accepts connection requests Dynamically creates a service handler for each client and “activates” it Application-independent ACE framework components – Perform IPC, explicit dynamic linking, event demultiplexing, event handler dispatching, multi-threading, etc.Vanderbilt University 41
  43. 43. Advanced ACE Tutorial Do Class Diagram for OO Logging Server Logging_Handler SOCK_StreamCOMPONENTSAPPLICATION- SOCK_Acceptor Null_Synch SPECIFIC 1 Logging n Logging Acceptor activates HandlerCOMPONENTSCONNECTION- SVC_HANDLER PEER_STREAM ORIENTED PEER_ACCEPTOR SYNCH_STRAT Acceptor Svc Handler PEER PEER ACCEPTOR STREAMCOMPONENTSFRAMEWORK Stream Connection ACE IPC_SAP Service Configurator Concurrency ReactorVanderbilt University
  44. 44. Advanced ACE Tutorial Douglas C. Schmidt Addressing Robustness, Portability, and Maintainability Challenges Problem – Building distributed applications using low-level APIs is hard Forces – Low-level APIs are verbose, tedious, and error-prone to program – Low-level APIs are non-portable and non-maintainable Solution – Apply the Wrapper Facade pattern to encapsulate low-level functions and data structuresVanderbilt University 43
  45. 45. Advanced ACE Tutorial Douglas C. Schmidt The Wrapper Facade PatternIntent client Encapsulates the functions and data provided by 1: method_k() existing lower-level, Wrapper 2: function_k() non-OO APIs within more Facade concise, robust, portable, Functions method_1() function_1() maintainable, and cohesive ... ... higher-level OO class method_m() function_n() interfaces POSA2 (www.cs.wustl.edu/ ˜schmidt/POSA/)Forces Resolved Avoid tedious, error-prone, and non-portable system APIs Create cohesive abstractionsVanderbilt University 44
  46. 46. Advanced ACE Tutorial DoMotivating the Wrapper Facade Pattern: the Socket API 2: ACTIVE ROLE 1: PASSIVE ROLE socket() bind() socket() (optional) bind() connect() listen() send()/recv() accept() 3: SERVICE send()/recv() close() PROCESSING close() CLIENT NETWORK SERVERSockets are the most common networkprogramming API and are available on most OSplatformsVanderbilt University
  47. 47. Advanced ACE Tutorial Douglas C. Schmidt Problem with Sockets: Lack of Type-safetyint buggy_echo_server (u_short port_num) I/O handles are{ // Error checking omitted. not amenable to sockaddr_in s_addr; strong type int acceptor = socket (PF_UNIX, SOCK_DGRAM, 0); checking at s_addr.sin_family = AF_INET; compile-time s_addr.sin_port = port_num; s_addr.sin_addr.s_addr = INADDR_ANY; The adjacent bind (acceptor, (sockaddr *) s_addr, code contains sizeof s_addr); many subtle, int handle = accept (acceptor, 0, 0); for (;;) { common bugs char buf[BUFSIZ]; ssize_t n = read (acceptor, buf, sizeof buf); if (n = 0) break; write (handle, buf, n); }}Vanderbilt University 46
  48. 48. Advanced ACE Tutorial Douglas C. Schmidt Problem with Sockets: Steep Learning CurveMany socket/TLI API functions have complex semantics, e.g.: Multiple protocol families and address families – e.g., TCP, UNIX domain, OSI, XNS, etc. Infrequently used features, e.g.: – Broadcasting/multicasting – Passing open file handles – Urgent data delivery and reception – Asynch I/O, non-blocking I/O, I/O-based and timer-based event multiplexingVanderbilt University 47
  49. 49. Advanced ACE Tutorial Douglas C. Schmidt Problem with Sockets: Portability Having multiple “standards,” i.e., sockets and TLI, makes portability difficult, e.g., – May require conditional compilation – In addition, related functions are not included in POSIX standards e.g., select(), WaitForMultipleObjects(), and poll() Portability between UNIX and Windows Sockets is problematic, e.g.: – Header files – Error numbers – Handle vs. descriptor types – Shutdown semantics – I/O controls and socket optionsVanderbilt University 48
  50. 50. Advanced ACE Tutorial Douglas C. Schmidt Problem with Sockets: Poorly Structured gethostbyname() getservbyname() getsockname() getpeername() getsockopt() setsockopt() sendmsg() recvfrom() recvmsg() connect() sendto() socket() accept() writev() readv() listen() write() send() bind() read() recv()Limitations Socket API is linear rather than hierarchical There is no consistency among names... Non-portableVanderbilt University 49
  51. 51. Advanced ACE Tutorial Do Socket Taxonomy N/ COMMUNICATION DOMAIN TIO ION EC AT E LOCAL LOCAL/REMOTE NN NIC SIV CO MU LE PA S M RO CO ER XF IVE A CT TYPE OF COMMUNICATION SERVICE socket(PF_UNIX)/bind() socket(PF_INET)/bind() GRAM DATA sendto()/recvfrom() sendto()/recvfrom() socket(PF_UNIX)/bind() socket(PF_INET)/bind() STREAM CONNECTED DATAGRAM socket(PF_UNIX) socket(PF_INET) bind()/connect() bind()/connect() send()/recv() send()/recv() socket(PF_UNIX) socket(PF_INET) bind()/connect() bind()/connect() socket(PF_UNIX) socket(PF_INET) bind()/listen()/accept() bind()/listen()/accept() send()/recv() send()/recv() socket(PF_UNIX) socket(PF_INET) bind()/connect() bind()/connect()The Socket API can be classified along threedimensions1. Connection role2. Communication domain3. Type of serviceVanderbilt University
  52. 52. Advanced ACE Tutorial DoSolution: ACE Socket Wrapper Facades N/ COMMUNICATION DOMAIN IO ION CT T LOCAL/REMOTE NE ICA E LOCAL N N SIV CO MU LE PA S M RO ER CO XF E TIV ACTYPE OF COMMUNICATION SERVICE m gra ram _D GRAM CK DATA _Dg SO OCK SOCK_Dgram_Bcast LS SOCK_Dgram_Mcast CONNECTED DATAGRAM LSOCK_Dgram SOCK_Dgram LSOCK_CODgram SOCK_CODgram LSOCK_Acceptor SOCK_Acceptor STREAM LSOCK_Stream SOCK_Stream LSOCK_Connector SOCK_ConnectorThe ACE C++ wrapper facades more explicitlymodel the key socket components using OOclassesVanderbilt University
  53. 53. Advanced ACE Tutorial Do The ACE Connection-Oriented Socket Wrapper Facades ACE_IPC_SAP ACE_Addr ACE_SOCK_IO ACE_SOCK ACE_SOCK_Acceptor ACE_INET_Addr ACE_SOCK_Stream ACE_SOCK_ConnectorParticipants Passive and active connection factories – ACE_SOCK_Acceptor and ACE_SOCK_Connector Streaming classes – ACE_SOCK_Stream and ACE_SOCK_IO Addressing classes – ACE_Addr and ACE_INET_AddrVanderbilt University
  54. 54. Advanced ACE Tutorial Douglas C. Schmidt The ACE Connection-Oriented Socket Wrapper Facade Factoriesclass ACE_SOCK_Connector class ACE_SOCK_Acceptor{ : public ACE_SOCKpublic: { // Traits public: typedef ACE_INET_Addr PEER_ADDR; // Traits typedef ACE_SOCK_Stream PEER_STREAM; typedef ACE_INET_Addr PEER_ADDR; typedef ACE_SOCK_Stream PEER_STREAM; int connect (ACE_SOCK_Stream new_sap, ACE_SOCK_Acceptor (const ACE_INET_Addr ); const ACE_INET_Addr raddr, int open (const ACE_INET_Addr addr); ACE_Time_Value *timeout, int accept const ACE_INET_Addr laddr); (ACE_SOCK_Stream new_sap, // ... ACE_INET_Addr *,}; ACE_Time_Value *); //... };Vanderbilt University 53
  55. 55. Advanced ACE Tutorial Douglas C. Schmidt ACE Connection-Oriented Socket Wrapper Facade Streaming and Addressing Classesclass ACE_SOCK_Stream class ACE_INET_Addr : public ACE_SOCK { : public ACE_Addrpublic: { // Trait. public: typedef ACE_INET_Addr PEER_ADDR; ACE_INET_Addr (u_short port, ssize_t send (const void *buf, const char host[]); int n); u_short get_port_number (void); ssize_t recv (void *buf, ACE_UINT_32 get_ip_addr (void); int n); // ... ssize_t send_n (const void *buf, }; int n); ssize_t sendv_n (const iovec *iov, int n); ssize_t recv_n (void *buf, int n); int close (void); // ...};Vanderbilt University 54
  56. 56. Advanced ACE Tutorial Douglas C. Schmidt Design Interlude: Motivating the Socket Wrapper Facade Structure Q: Why decouple the ACE_SOCK_Acceptor and the ACE_SOCK_Connector from ACE_SOCK_Stream? A: For the same reasons that ACE_Acceptor and ACE_Connector are decoupled from ACE_Svc_Handler, e.g., – An ACE_SOCK_Stream is only responsible for data transfer Regardless of whether the connection is established passively or actively – This ensures that the ACE_SOCK* components aren’t used incorrectly... e.g., you can’t accidentally read() or write() on ACE_SOCK_Connectors or ACE_SOCK_Acceptors, etc.Vanderbilt University 55
  57. 57. Advanced ACE Tutorial Do An Echo Server Written using ACE C++ Socket Wrapper Facadesint echo_server (u_short port_num){ // Local server address. ACE_INET_Addr my_addr (port_num); // Initialize the acceptor mode server. ACE_SOCK_Acceptor acceptor (my_addr); // Data transfer object. ACE_SOCK_Stream new_stream; // Accept a new connection. acceptor.accept (new_stream); for (;;) { char buf[BUFSIZ]; // Error caught at compile time! ssize_t n = acceptor.recv (buf, sizeof buf); new_stream.send_n (buf, n); }}Vanderbilt University
  58. 58. Advanced ACE Tutorial Do A Generic Version of the Echo Servertemplate class ACCEPTORint echo_server (u_short port){ // Local server address (note traits). typename ACCEPTOR::PEER_ADDR my_addr (port); // Initialize the acceptor mode server. ACCEPTOR acceptor (my_addr); // Data transfer object (note traits). typename ACCEPTOR::PEER_STREAM stream; // Accept a new connection. acceptor.accept (stream); for (;;) { char buf[BUFSIZ]; ssize_t n = stream.recv (buf, sizeof buf); stream.send_n (buf, n); }}Vanderbilt University
  59. 59. Advanced ACE Tutorial Douglas C. Schmidt Scope of the ACE IPC Wrapper Facades A ACE IPC SAP SOCK TLI SPIPE SSL FIFO MEM SysV SAP SAP SAP SAP SAP SAP IPC SOCKET TLI STREAM SSL NAMED MMAP SYSTEM V API API PIPE API API PIPE API API IPC API C++NPv1 (www.cs.wustl.edu/˜schmidt/ACE/book1/)Vanderbilt University 58
  60. 60. Advanced ACE Tutorial Do Using the Wrapper Facade Pattern for the Logging ServerNote we haven’t improved the overall design (yet)// ... Same as before ...// Acceptor-mode socket handle.static ACE_SOCK_Acceptor acceptor;// Set of currently active handlesstatic ACE_Handle_Set activity_handles;// Scratch copy of activity_handlesstatic ACE_Handle_Set ready_handles;static void initialize_acceptor (u_short port){ // Set up address info. to become server. ACE_INET_Addr saddr (port); // Create a local endpoint of communication. acceptor.open (saddr); // Set the SOCK_Acceptor into non-blocking mode. acceptor.enable (ACE_NONBLOCK); activity_handles.set_bit (acceptor.get_handle ());}Vanderbilt University
  61. 61. Advanced ACE Tutorial Do Main Event Loop of Logging Serverint main (int argc, char *argv[]){ initialize_acceptor (argc 1 ? atoi (argv[1]) : PORT); // Loop forever performing logging // server processing. for (;;) { // object assignment. ready_handles = activity_handles; // Wait for client I/O events. ACE::select (int (maxhp1), // calls operator fd_set *(). ready_handles); // First receive pending logging records. handle_data (); // Then accept pending connections. handle_connections (); }}Vanderbilt University
  62. 62. Advanced ACE Tutorial Do Handling Connections and Data Processingstatic void handle_connections (void) { if (ready_handles.is_set (acceptor.get_handle ())) ACE_SOCK_Stream str; // Handle all pending connection requests. while (acceptor.accept (str) != -1) activity_handles.set_bit (str.get_handle ()); }}static void handle_data (void) { ACE_HANDLE h; ACE_Handle_Set_Iterator iter (ready_handles); while ((h = iter ()) != ACE_INVALID_HANDLE) { ACE_SOCK_Stream str (h); ssize_t n = handle_log_record (str, ACE_STDOUT); if (n 0) // Count # of logging records. ++request_count; else if (n == 0) { // Handle connection shutdown. activity_handles.clr_bit (h); s.close (); }}Vanderbilt University
  63. 63. Advanced ACE Tutorial DoReceive and Process Logging Recordsstatic ssize_t handle_log_record (ACE_SOCK_Stream s, ACE_HANDLE out_h) ACE_UINT_32 len; ACE_Log_Record lr; // The first recv reads the length (stored as a // fixed-size integer) of adjacent logging record. ssize_t n = s.recv_n ((char *) len, sizeof len); if (n = 0) return n; len = ntohl (len); // Convert byte-ordering // Perform sanity check! if (len sizeof (lr)) return -1; // The second recv then reads len bytes to // obtain the actual record. s.recv_n ((char *) lr, sizeof lr); // Decode and print record. decode_log_record (lr); if (ACE_OS::write (out_h, lr.buf, lr.size) == -1) return -1; else return 0;}Vanderbilt University
  64. 64. Advanced ACE Tutorial Do OO Client Logging Daemon Implementationint main (int argc, char *argv[]){ ACE_SOCK_Stream stream; ACE_SOCK_Connector con; // Establish connection. con.connect (stream, ACE_INET_Addr (argc 1 ? atoi (argv[1]) : PORT)); ACE_Log_Record lr; // Loop forever performing client // logging daemon processing. for (;;) { // ... get logging records from client // application processes ... ACE_UINT_32 size = lr.size; lr.size = htonl (lr.size); encode_log_record (lr); iovec iov[2]; iov[0].iov_len = sizeof (ACE_UINT_32); iov[0].iov_base = lr.size; iov[1].iov_len = size; iov[1].iov_base = lr; // Uses writev(2); stream.sendv_n (iov, 2); }}Vanderbilt University
  65. 65. Advanced ACE Tutorial Douglas C. Schmidt Evaluating the Wrapper Facade SolutionBenefits Liabilities More concise Potentially more indirection More robust Additional learning curve More portable Still haven’t solved the overall design problem More maintainable – i.e., the overall design is More efficient still based on step-wise refinement of functionsVanderbilt University 64
  66. 66. Advanced ACE Tutorial Douglas C. Schmidt ACE C++ Wrapper Facade Design Refactoring Principles Enforce typesafety at compile-time Allow controlled violations of typesafety Simplify for the common case Replace one-dimensional interfaces with hierarchical class categories Enhance portability with parameterized types Inline performance critical methods Define auxiliary classes to hide error-prone detailsVanderbilt University 65
  67. 67. Advanced ACE Tutorial Douglas C. Schmidt Enforce Typesafety at Compile-TimeSockets cannot detect certain errors at compile-time, e.g.,int acceptor = socket (PF_INET, SOCK_STREAM, 0);// ...bind (acceptor, ...); // Bind address.listen (acceptor); // Make a acceptor-mode socket.HANDLE n_sd = accept (acceptor, 0, 0);// Error not detected until run-time.read (acceptor, buf, sizeof buf);ACE enforces type-safety at compile-time via factories, e.g.:ACE_SOCK_Acceptor acceptor (port);// Error: recv() not a method of ACE_SOCK_Acceptor.acceptor.recv (buf, sizeof buf);Vanderbilt University 66
  68. 68. Advanced ACE Tutorial Douglas C. Schmidt Allow Controlled Violations of TypesafetyMake it easy to use the C++ Socket wrapper facades correctly, hard touse it incorrectly, but not impossible to use it in ways the classdesigners did not anticipate e.g., it may be necessary to retrieve the underlying socket handle: ACE_SOCK_Acceptor acceptor; // ... ACE_Handle_Set ready_handles; // ... if (ready_handles.is_set (acceptor.get_handle ()) ACE::select (acceptor.get_handle () + 1, ready_handles);Vanderbilt University 67
  69. 69. Advanced ACE Tutorial Douglas C. Schmidt Supply Default ParametersACE_SOCK_Connector (ACE_SOCK_Stream new_stream, const ACE_Addr remote_sap, ACE_Time_Value *timeout = 0, const ACE_Addr local_sap = ACE_Addr::sap_any, int protocol_family = PF_INET, int protocol = 0);The result is extremely concise for the common case:ACE_SOCK_Stream stream;// Compiler supplies default values.ACE_SOCK_Connector con (stream, ACE_INET_Addr (port, host));Vanderbilt University 68
  70. 70. Advanced ACE Tutorial Do Define Parsimonious Interfacese.g., use LSOCK to pass socket handles:ACE_LSOCK_Stream stream;ACE_LSOCK_Acceptor acceptor (/tmp/foo);acceptor.accept (stream);stream.send_handle (stream.get_handle ());versus the less parsimonious BSD 4.3 socket codeACE_LSOCK::send_handle (const ACE_HANDLE sd) const { u_char a[2]; iovec iov; msghdr send_msg; a[0] = 0xab, a[1] = 0xcd; iov.iov_base = (char *) a; iov.iov_len = sizeof a; send_msg.msg_iov = iov; send_msg.msg_iovlen = 1; send_msg.msg_name = (char *) 0; send_msg.msg_namelen = 0; send_msg.msg_accrights = (char *) sd; send_msg.msg_accrightslen = sizeof sd; return sendmsg (this-get_handle (), send_msg, 0);Note that SVR4 and BSD 4.4 APIs are differentthan BSD 4.3!Vanderbilt University
  71. 71. Advanced ACE Tutorial Douglas C. Schmidt Combine Multiple Operations into One OperationCreating a conventional acceptor-mode socket requires multiple calls:int acceptor = socket (PF_INET, SOCK_STREAM, 0);sockaddr_in addr;memset (addr, 0, sizeof addr);addr.sin_family = AF_INET;addr.sin_port = htons (port);addr.sin_addr.s_addr = INADDR_ANY;bind (acceptor, addr, addr_len);listen (acceptor);// ...ACE_SOCK_Acceptor combines this into a single operation:ACE_SOCK_Acceptor acceptor ((ACE_INET_Addr) port);Vanderbilt University 70
  72. 72. Advanced ACE Tutorial Douglas C. Schmidt Create Hierarchical Class Categories ACE ACE IPC SOCK SAP ACE ACE ACE ACE ACE ACE SOCK SOCK SOCK SOCK SOCK SOCK Dgram Dgram CODgram Stream Connector Acceptor Bcast ACE SOCK ACE ACE ACE ACE ACE Dgram LSOCK LSOCK LSOCK LSOCK LSOCK Mcast Dgram CODgram Stream Connector Acceptor GROUP DATAGRAM ACE STREAM CONNECTION COMM COMM LSOCK COMM ESTABLISHMENTVanderbilt University 71
  73. 73. Advanced ACE Tutorial Douglas C. Schmidt Enhance Portability with Parameterized Types // Conditionally select IPC mechanism. DISTRIBUTED 1 APPLICATION DISTRIBUTED 2 APPLICATION DISTRIBUTED 3 APPLICATION #if defined (USE_SOCKETS) APPLICATION1 APPLICATION2 APPLICATION3 typedef ACE_SOCK_Acceptor PEER_ACCEPTOR; COMMON INTERFACE #elif defined (USE_TLI) (PARAMETERIZED TYPES) typedef ACE_TLI_Acceptor PEER_ACCEPTOR; SOCK_SAP TLI_SAP #endif // USE_SOCKETS. USER SOCKET BSDSOCKET SYSTEM V BSDSOCKET int main (void) SPACE API API TLI API API { // ... OS KERNEL KERNEL // Invoke with appropriate PROTOCOL MECHANISMS SPACE // network programming interface. (TCP/IP, OSI, ETC.) echo_serverPEER_ACCEPTOR (port); NETWORK INTERFACE }Switching wholesale between sockets and TLI simply requiresinstantiating a different ACE C++ wrapper facadeVanderbilt University 72
  74. 74. Advanced ACE Tutorial Douglas C. Schmidt Inline Performance Critical MethodsInlining is time and space efficient since key methods are very short:class ACE_SOCK_Stream : public ACE_SOCK{public: ssize_t send (const void *buf, size_t n) { return ACE_OS::send (this-get_handle (), buf, n); } ssize_t recv (void *buf, size_t n) { return ACE_OS::recv (this-get_handle (), buf, n); }};Vanderbilt University 73
  75. 75. Advanced ACE Tutorial Douglas C. Schmidt Define Auxiliary Classes to Hide Error-Prone DetailsStandard C socket addressing is awkward and error-prone e.g., easy to neglect to zero-out a sockaddr_in or convert port numbers to network byte-order, etc.ACE C++ Socket wrapper facades define classes to handle detailsclass ACE_INET_Addr : public ACE_Addr { public: ACE_INET_Addr (u_short port, long ip_addr = 0) { memset (this-inet_addr_, 0, sizeof this-inet_addr_); this-inet_addr_.sin_family = AF_INET; this-inet_addr_.sin_port = htons (port); memcpy (this-inet_addr_.sin_addr, ip_addr, sizeof ip_addr); } // ...private: sockaddr_in inet_addr_;};Vanderbilt University 74
  76. 76. Advanced ACE Tutorial Douglas C. Schmidt Demultiplexing and Dispatching Events Problem – The logging server must process several different types of events simultaneously from different sources of events Forces – Multi-threading is not always available – Multi-threading is not always efficient – Multi-threading can be error-prone – Tightly coupling event demuxing with server-specific logic is inflexible Solution – Use the Reactor pattern to decouple event demuxing/dispatching from server-specific processingVanderbilt University 75
  77. 77. Advanced ACE Tutorial Douglas C. Schmidt The Reactor Pattern Reactor select (handles); Intent foreach h in handles loophandle_events() table[h].handle_event(type)register_handler(h) end loop Demuxes dispatchesremove_handler(h) handlers 1 Event Handler requests that are Nuses Handle owns handle_event(type) delievered concurrency get_handle() to an application by one notifies or more clientsSynchronous Event Concrete Demultiplexer Event Forces Resolved select() Handler Serially demux events www.cs.wustl.edu/˜schmidt/ synchronously POSA/ efficiently Extend applications without changing demuxing codeVanderbilt University 76
  78. 78. Advanced ACE Tutorial Douglas C. Schmidt Collaboration in the Reactor Pattern callback : main Concrete Reactor Note inversion of program Event_Handler Reactor() controlINITIALIZATION INITIALIZE register_handler(callback) Also note how MODE REGISTER HANDLER get_handle() long-running EXTRACT HANDLE handle_events() event handlers START EVENT LOOP select() can degrade FOREACH EVENT DO handle_input() quality of serviceEVENT HANDLING DATA ARRIVES since callbacks handle_output() OK TO SEND “steal” Reactor’s MODE handle_signal() thread of SIGNAL ARRIVES handle_timeout() control... TIMER EXPIRES remove_handler(callback) REMOVE HANDLER CLEANUP handle_close()Vanderbilt University 77
  79. 79. Advanced ACE Tutorial Do Structure and Implementations of the ACE Reactor FrameworkReactor framework participants ACE_Timer_Queue ACE_Event_Handler 0..1 ACE_Reactor Application Event ACE_Time_Value HandlerCommon Reactor implementations in ACE 1 ACE_Reactor ACE_Reactor_Impl ACE_WFMO_Reactor TOKEN ACE_Select_Reactor_Impl ACE_Select_Reactor_T «bind» ACE_Select_Reactor_Token ACE_TP_Reactor ACE_Select_ReactorVanderbilt University
  80. 80. Advanced ACE Tutorial Do Using the ACE Reactor Framework in the Logging Server REGISTERED APPLICATION 2: sh = new Logging_Handler : Logging OBJECTS 3: accept (sh-peer()) LEVEL : Logging Handler Handler 4: sh-open() : Logging : Event : Event Acceptor 5: handle_input() Handler Handler 6: recv(msg) 7:process(msg) : Event Handler 1: handle_input() FRAMEWORK LEVEL :Timer : Handle Queue Table : Reactor OS EVENT DEMULTIPLEXING INTERFACE KERNEL LEVELBenefits Liabilities Straightforward to Callbacks are “brittle” program Can’t leverage Concurrency control multi-processors is easyVanderbilt University
  81. 81. Advanced ACE Tutorial Douglas C. Schmidt Addressing Acceptor Endpoint Connection and Initialization Challenges Problem – The communication protocol used between applications is often orthogonal to its connection establishment and service handler initialization protocols Forces – Low-level connection APIs are error-prone and non-portable – Separating initialization from processing increases software reuse Solution – Use the Acceptor pattern to decouple passive connection establishment and connection handler initialization from the subsequent logging protocolVanderbilt University 80
  82. 82. Advanced ACE Tutorial Do The Acceptor-Connector Pattern (Acceptor Role) Svc Svc Handler Handler Acceptor peer_stream_ ACTIVATES peer_acceptor_ open() accept() APPLICATION- DEFINED APPLICATION- INDEPENDENT Reactor www.cs.wustl.edu/˜schmidt/POSA/Intent of Acceptor Role Forces resolved Decouple the passive Reuse passive connection and connection setup initialization of a peer and service service in a distributed initialization code system from the Ensure that processing performed acceptor-mode once the peer service is handles aren’t used connected and to read/write data initializedVanderbilt University
  83. 83. Advanced ACE Tutorial Do Structure of the ACE Acceptor-Connector Framework ACE_Event_Handler SYNCH_STRATEGY SVC_HANDLER, PEER_CONNECTOR ACE_Task ACE_Connector PEER_STREAM, SYNCH_STRATEGY SVC_HANDLER, PEER_ACCEPTOR ACE_Svc_Handler ACE_Acceptor «bind» Application ServiceFramework characteristics Uses C++ parameterized types to strategize IPC and service aspects Uses Template Method pattern to strategize creation, connection establishment, and concurrency policiesVanderbilt University
  84. 84. Advanced ACE Tutorial Do Using the ACE_Acceptor in the Logging Server : Logging : Logging Handler Handler : Logging : Logging Handler Acceptor : Svc : Svc Handler Handler : Svc : Acceptor Handler : Logging PASSIVE ACTIVE Handler LISTENER CONNECTIONS1: handle_input() : Svc2: sh = make_svc_handler() Handler3: accept_svc_handler(sh) : Reactor4: activate_svc_handler(sh) The ACE_Acceptor is a factory – i.e., it creates, connects, and activates an ACE_Svc_Handler There’s often one ACE_Acceptor per-service/per-portVanderbilt University
  85. 85. Advanced ACE Tutorial Do ACE_Acceptor Class Public Interfacetemplate class SVC_HANDLER, // Service aspect class PEER_ACCEPTOR // IPC aspectclass ACE_Acceptor : public ACE_Service_Object{ // Inherits indirectly from ACE_Event_Handlerpublic: // Initialization. virtual int open (typename const PEER_ACCEPTOR::PEER_ADDR , ACE_Reactor * = ACE_Reactor::instance ()); // Template Method. virtual int handle_input (ACE_HANDLE);protected: // Factory method creates a service handler. virtual SVC_HANDLER *make_svc_handler (void); // Accept a new connection. virtual int accept_svc_handler (SVC_HANDLER *); // Activate a service handler. virtual int activate_svc_handler (SVC_HANDLER *);private: // Acceptor IPC connection strategy. PEER_ACCEPTOR peer_acceptor_;};Vanderbilt University
  86. 86. Advanced ACE Tutorial Do ACE_Acceptor Class Implementation// Shorthand names.#define SH SVC_HANDLER#define PA PEER_ACCEPTOR// Template Method that creates, connects,// and activates service handlers.template class SH, class PA intACE_AcceptorSH, PA::handle_input (ACE_HANDLE){ // Factory method that makes a service handler. SH *svc_handler = make_svc_handler (); // Accept the connection. accept_svc_handler (svc_handler); // Delegate control to the service handler. activate_svc_handler (svc_handler);}Vanderbilt University
  87. 87. Advanced ACE Tutorial Douglas C. Schmidt The Template Method Pattern Intent Abstract Class Define the skeleton oftemplate_method() ... primitive_operation1() an algorithm in anprimitive_operation1()primitive_operation2() ... operation, deferring primitive_operation2() ... some steps to subclasses Concrete Class Gamma et al., Design primitive_operation1() Patterns: Elements of primitive_operation2() Reusable Object-Oriented Software AW, ’94Vanderbilt University 86
  88. 88. Advanced ACE Tutorial Douglas C. Schmidt Using the Template Method Pattern in the ACE Acceptor Implementation Benefits Acceptor handle_input() ... Straightforward to make_svc_handler() make_svc_handler() program via inheritance accept_svc_handler() ... activate_svc_handler() accept_svc_handler() and dynamic binding ... activate_svc_handler() Liabilities My Acceptor Design is “brittle” and make_svc_handler() can cause “explosion” of activate_svc_handler() subclasses due to “whitebox” designVanderbilt University 87
  89. 89. Advanced ACE Tutorial Douglas C. Schmidt The Strategy Pattern Intent STRATEGY Define a family of Context Strategycontext_interface() algorithm_interface() algorithms, encapsulate each one, and make them interchangeable Gamma et al., Design Concrete Concrete Patterns: Elements of Strategy A Strategy C Reusable Object-Oriented algorithm_interface() algorithm_interface() Software AW, ’94 Concrete Strategy B algorithm_interface()Vanderbilt University 88
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×