Table 1 displays the list of the visualization tools. ..... [19] Lu, S., Park, S., Seo, E., and Zhou, Y, âLearning from mistakes: a comprehensive study on real world.
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016), pp. 65-76 http://dx.doi.org/10.14257/ijseia.2016.10.2.06
ConpathView: A Visualization Tool for Debugging Race Conditions in Event Synchronization of ARINC 653 Applications Myeong-sin Kang1, Mun-Hye Kang2, Ok-Kyoon Ha2*, and Yong-Kee Jun2 1
2
Aeromaster Corporation, Republic of Korea Department of Informatics, Gyeongsang National University, Republic of Korea {mskang, kmh, jassmin, jun}@gnu.ac.kr Abstract
ARINC 653 applications using event synchronization may result in behaviors unexpected by the programmers when concurrency errors, such as race conditions, occur due to their non-deterministic executions. The errors can be debugged by means of previous visualization tools, such as System viewer, provided by ARINC 653 IDE. However, these tools do not consider race conditions, which require the programmers to analyze the process state transition considering event synchronization and to ratiocinate the occurrence of accesses to shared resources from source codes. This paper presents a visualization tool, called ConpathView that intuitively shows the aspect of the process execution with race conditions and the accesses to the shared memories based on the event services in ARINC 653 applications. The ConpathView enables to reduce visual complexity as well as to provide effective understanding of the aspect of the process execution. It provides concrete and practical information for debugging ARINC 653 applications by locating the accesses to the shared resources on the source code. Keywords: ARINC 653 Applications, IMA, event synchronization, race conditions, visualization, debugging
1. Introduction ARINC 653 [1-4] is defined as the standard interface for real-time operating systems and applications, with development of the IMA (Integrated Modular Avionics) system. ARINC 653 provides a process execution environment through partitioning, in which each partition is independent in time and space, and defines intra-partition communication services. Event synchronization [1], one of the communication services, is used to synchronize the execution order of processes within a partition. However, if not properly used, this service may cause non-deterministic process executions and cannot guarantee their execution order to shared resources. Since this may cause concurrency errors, such as race conditions [5-7] which lead to unpredictable results, it must be considered for debugging. It is highly difficult to identify race conditions caused by event synchronization, because a huge amount of information should be analyzed in combination including the aspect of non-deterministic executions and accesses to the shared memories. Therefore, it is effective to simplify and visualize the information by using visualization tools. Previous visualization tools for debugging are included in almost every IDE (Integrated Development Environment) [8-13], such as System viewer [14], Time Map Tool [9], Path/Event Analyer [15], SpyKer [16], and System Tracer [12], which support the development of applications for ARINC 653. However, for debugging ARINC 653 applications, the programmers need to analyze the process state transition
*
Corresponding author
ISSN: 1738-9984 IJSEIA Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
considering event synchronization and to ratiocinate the accesses to shared resources from source codes, because these tools do not consider race conditions [17]. This paper presents a visualization tool, called ConpathView that intuitively shows the aspect of the process execution with race conditions and the accesses to the shared memories based on the event services in ARINC 653 applications. The ConpathView enables to reduce visual complexity as well as to provide effective understanding of the aspect of the process executions. Also, by locating the accesses to the shared resources on the source code, it provides concrete and practical information for debugging ARINC 653 applications. The practicality of this tool is evaluated through a test based on the synthetic program in the SIMA (Simulated Integrated Modular Avionics) [18] environment.
2. Background This section introduces event synchronization of ARINC 653 and race conditions caused by the event synchronization, and presents the problems of previous visualization tools. 2.1. Event Synchronization of ARINC 653 Standard ARINC 653 defines four intra-partition communication services: event synchronization, semaphore, buffer, and blackboard [1]. The event synchronization of ARINC 653 guarantees execution order among parallel processes. The event synchronization is performed by referring to an event object that is used to create notifications for process executions to suspend or resume. The event object maintains the following two state values: UP, which indicates that the process execution is in the ready state; and DOWN, which indicates that the process execution is in the waiting state. The event synchronization of ARINC 653 provides the following services:
RESET_EVENT changes the state value of an event with specific ID to DOWN
WAIT_EVENT checks the state value of an event with specific ID, and, if DOWN, stops the current process execution SET_EVENT changes the state value of an event with specific ID to UP. At the same time, all processes suspended due to WAIT_EVENT are moved to the scheduling queue to resume their execution By these synchronization APIs, the code blocks before calling SET_EVNET is always earlier than the code blocks after calling WAIT_EVENT; therefore they have fixed execution order. Figure 1 shows an example of an application using event synchronization. The application repeatedly stores a sensor value acquired from the read_sensor( ) function of process 1 into the local variable cur_val of process 2. In the program, since both processes access to a shared variable sv to deliver the sensor value, the sequence of accesses to sv must be from ① to ④ in order to an intended operation. Thus, the synchronization services for the event object evt is employed in the code lines 07 and 20, while the synchronization services for the event object evt2 is used in the code lines 23 and 09. The synchronization services for the code lines 11 and 12 are initialized event objects for the next synchronization.
66
Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
01: int sv = 0; // shared variable 02: 03: void *process1() { 04: ... 05: while(1) { 06: sv = read_sensor(); ①, ④ 07: SET_EVENT(evt, &rc); 08: 09: WAIT_EVENT(evt2, INTERVAL, &rc); 10: 11: RESET_EVENT(evt, &rc); 12: RESET_EVENT(ev2, &rc); 13: } 14: }
16: void *process2() { 17: int cur_val; 18: ... 19: while(1) { 20: WAIT_EVENT(evt, INTERVAL, &rc); 21: cur_val = sv; ② 22: 23: SET_EVENT(evt2, &rc); 24: sv = 0; ③ 25: } 26: } 27: ...
Figure 1. An Example of Application using Event Synchronization 2.2. Race Conditions in ARINC 653 Applications The basic sequence of event synchronization is as follows: initializing an event object by RESET_EVENT; placing an event on the waiting state by WAIT_EVENT; and requesting an event to be on the ready state by SET_EVENT. The order violation [19] among processes occurs if the sequence of synchronization services is changed due to a scheduling policy or delay in execution time of function, satisfying the following conditions: When a SET_EVENT on the intended process performs with the SET_EVENT on other processes. In this case, a synchronization is implemented with a WAIT_EVENT by a SET_EVENT executed in advance. When a RESET_EVENT break into a couple of SET_EVENT and WAIT_EVENT. In this case, WAIT_EVENT may be affected by the other SET_EVNET. Thus, using the synchronization services, such as event service in ARINC 653, should consider the order violations for locating race conditions because it may lead to nondeterministic execution of processes and does not guarantee synchronization order. Race conditions may occur when two or more parallel processes access to a shared memory without explicit synchronization, and at least one of the accesses is write. Race conditions must be debugged because they may result in behaviors unexpected by the programmers. For example, in Figure 1, two write accesses to a shared memory, 3 and 4, involve a race condition by the implicit synchronization of the program execution. 2.3. Visualization Tools for Debugging Race Conditions The IDE (Integrated Development Environment) for the operating systems supporting ARINC 653 includes Workbench [8], DDS [9], MULTI [10], Luminosity [11], CODEO [12], and ESTO-AIR [13]. They all provide visualization tools for debugging such as System viewer [14], Time Map Tool [9], Path/Event Analyer [15], SpyKer [16], and System Tracer [12]. Table 1 displays the list of the visualization tools.
Copyright ⓒ 2016 SERSC
67
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
Figure 2. The System Viewer of Workbench 653 Figure 2 shows System Viewer [14], which is a representative visualization tool for the analysis of ARINC 653 applications. System Viewer provides debugging information by symbolizing information regarding interrupt, semaphore, and event and displaying them on the timeline designed to represent execution flows among tasks. Other visualization tools also have similar structures for providing debugging information. Previous tools provide only the information regarding the aspect of process execution and the occurrence of synchronization event and do not consider race conditions as shown in Table 1. Thus, they need to analyze manually the process state transition considering event synchronization and to ratiocinate the accesses to shared resources from source codes for debugging race conditions. Table 1. Visualization Tools of IDE for ARINC 653 Compliant RTOS Operating System VxWorks 653 Deos INTEGRITY-178B LynxOS-178 PikeOS Qplus-AIR
IDE Workbench DDS MULTI Luminosity CODEO ESTO-AIR
Visualization Tool
Race Report
System Viewer Time Map Tool Path/Event Analyzer SpyKer System Tracer (Under development...)
n/a n/a n/a n/a n/a n/a
3. Design of Visualization for ARINC 653 Applications This section defines visualization symbols, and explains how to visualize the execution of event synchronization and confirm race conditions through these symbols, so that race condition can be debugged in ARINC 653 using event synchronization. 3.1. Visualization Symbols We employ several symbols to indicate effectively the aspect of processes changed by event synchronization, the accesses to shared memories, and the racy information of these accesses occurred during an execution of ARINC 653 applications. The symbols appear in
68
Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
Table 2. We classify the symbols into event synchronization symbols, shared memory access symbols, and process execution symbols. The event synchronization symbols indicate the callings of RESET_EVNET, WAIT_EVENT, and SET_EVENT. Each symbol has its own color depending on the ID of an event object. Shared memory access symbols are the signs for read/write accesses to shared resources. The line number in the source code is placed next to the symbols. Process execution symbols represent process execution flows and synchronization order. The synchronization order is divided into “synchronization without the risk of order violation” and “synchronization order with the risk of order violation”. In the case of the latter, another symbol is used to locate synchronization event. Table 2. Symbols for Visualizing the Execution of ARINC 653 Applications Category
Symbol
meaning RESET_EVENT
Event Synchronization
WAIT_EVENT SET_EVENT Read access
Shared Memory Access Write access Process execution order
Process Execution
Synchronization without risk of order violation Synchronization with risk of order violation Cause of order violation
The process execution symbols consider order violations as the implicit and the explicit event synchronization to locate race conditions. The detail view of each symbol is as follows: A Set Event Symbol defines that a specified event was requested to set, and means that all processes waiting on that event was moved from the waiting state to the ready state. A Reset Event Symbol indicates an event was requested to change the EVENT STATUS from the up state to down state. A Wait Event Symbol indicates that an event was requested to move the current process from the running state to waiting state when the event was placed in down state. Read/Write Access Symbol indicates that a process was accessed to a shared resource in a partition to read/write any data.
Copyright ⓒ 2016 SERSC
69
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
A Process Execution Order Symbol indicates a temporal execution flow of a process. A Synchronization without Order Violation Symbol indicates that a solid arrow from a set event symbol to a wait event symbol. A Synchronization with Order Violation Symbol indicates that a dashed arrow from a set event symbol to a wait event symbol. A Cause of Order Violation Symbol indicates an event was nested one or more order violations. 3.2. Abstraction of Process Execution and Visualization of Race Conditions Figure 3 is an example of visualizing part of the process execution of the application in Figure 1 by using visualization symbols. In Figure (a), the process1 and process2 implement synchronization by using two kinds of event objects. Also it is intuitively confirmed that four synchronization operations are created during the execution of the application. Now we can easily find that the execution of the program shown in Figure 3 (a) includes the risk of an order violation by the synchronization without order violation symbols. It is important to identify such risk because the synchronization may not occur when the second WAIT_EVENT of process 2 is called before the RESET_EVENT of process 1 as shown in the Figure 3 (b). Classifying synchronization order based on the symbols with risk of order violation can be helpful for debugging because it shows the actual synchronization sequence during the execution of an application and provides the intuitiveness and useful information that the current synchronization order may be changed in the next execution. Moreover, we can easily identify race conditions more practically with our visualization method. For example, in Figure 3 (a), any race condition does not occur between the Ⓦ #7 and the Ⓡ #23 because there is a synchronized path by a couple of SET_EVENT and WAIT_EVENT operations. However, we see that the two concurrent accesses potentially involve a race condition although there is an execution order between them by the synchronization without order violation symbols. Then, we can predict that a race condition will be appear when the programs has the changed priority of processes as shown in Figure 3 (b).
70
Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
Figure 3. Examples of Visualization using Designed Symbols For the visualization technique, we defined two kinds of special data structure: process history (PH) and synchronization history (SH). A PH stores process ID, event synchronizations, and accesses to shared memories to analyze order relations for events that happened on a process, while a SH is employed to analyze order relations of synchronization operations for an event object.
4. Implementation and Evaluation In this section, we develop a tool by using the visualization technique of the Section 3 and evaluate the tool’s practicality with synthetic programs. 4.1. Development of a Visualization Tool We developed a visualization tool, called ConpathView that intuitively shows the aspect of the process execution with race conditions and the accesses to the shared memories based on the event services in ARINC 653 applications. For the implementation, we used Java and C++ program languages with the SWT (Standard widget toolkit) [20]. ConpathView consists of two main components: Tracer that dynamically collects event synchronization and accesses to the shared memories, and Visualizer module that analyzes the information collected by trace part to present the visualized results. We employed a Pin dynamic binary instrumentation framework [21] and Pin APIs for the tracer component. Figure 4 shows the implemented visualization tool which consists of three views: Visualization View is an actual visualization panel to display an execution of an ARINC 653 application with the designed symbols (① in Figure 4) Access List displays all shared memory IDs used in the application to highlight the accesses to a selected shared memory on the visualization view (② in Figure 4) Source Code View provides the original source code to display where a race condition ran with the execution by indicating each of two lines that related to the racy pair of accesses (③ in Figure 4)
Copyright ⓒ 2016 SERSC
71
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
Our tool reduces visual complexity by displaying the information that users want to have, and helps confirm instantly the concrete information needed for debugging. 1
Visualization view 2
Access list
3
Source code view
Figure 4. The Interface of ConpathView 4.2. Evaluation We evaluated the practicality of the developed tool using synthetic programs under SIMA (Simulated Integrated Modular Avionics) [18] environment. The SIMA simulates ARINC 653 applications in the GNU/Linux operating system. We developed synthetic programs considering the Event service for ARINC 653 applications and designed them to use two or three processes in each execution. We categorized the synthesis into three models: Ex_a which is intended for synchronization direction without risk of order violation, Ex_b which is intended for synchronization direction with risk of order violation, and Ex_c which is a program for synchronizations both with and without risk of order violation. In our experimentation, we ran the synthesis with changing the priority of processes to force order violations, and analyzed event synchronization and racing pairs through the results of visualization by the implemented tool. Figure 5 shows the visualized execution results of a synthetic program through the tool. In the figure, the visualization results before and after changes in priority are located on the left and right sides of the visualization view respectively.
72
Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
Visualtization results of Ex_c
Figure 5. The Results of Visualization for a Synthetic Program (Ex_c) Table 3 displays the results of the experiment. In the table, “>” means that the process on the left has higher priority than the process on the right . From the table, we see that the Ex_a does not happen any race condition since the program has two synchronization paths and is not subject to change in the priority of processes. In case of Ex_b, we found no race conditions with a synchronization path when the priority of two processes is P1 > P2, whereas we found a race condition with a new synchronization path for priority P2 > P1. The Ex_c has three synchronization paths with a race condition when the priority of processes is P3 > P2. However, inversed case, there are two race conditions because a synchronization path was disappeared by the changed priority of processes. Figure 8 depicts well two cases for Ex_c. The ex_b has one synchronization direction, but its synchronization direction has changed after priorities are changed. In this case, a race condition does not exist before the change in priorities but appears with the relation between Ⓡ#27 and Ⓦ #73 after the change in priorities. The ex_c has three synchronization directions, but there are only two after the change in priorities. A race condition previously exist only between the relation of Ⓦ#35 and Ⓡ#117, but a race condition between Ⓦ#35 and Ⓡ#128 is newly added after the change in priorities. Table 3. The Analysis Results of Synthetic Programs using ConpathView Application ex_a ex_b
Copyright ⓒ 2016 SERSC
Priority
# of Synchronization
Race Conditions
P1 > P2
2
X
P2 > P1
2
X
P1 > P2
1
X
73
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
ex_c
P2 > P1
1
Ⓡ#27-Ⓦ#73
P2 > P3
2
Ⓦ#35-Ⓡ#117, Ⓦ#35-Ⓡ#128
P3 > P2
3
Ⓦ#35-Ⓡ#117
The results of the experiments show that the developed visualization tool exactly locates the directions of synchronization without risk of order violation and with risk of order violation on the process execution. Therefore, ConpathView provides reduced visual complexity to effectively understand the executions of ARINC 653 applications due to the fact that it provides the aspect of process synchronization and confirms whether the race conditions run in the applications.
5. Conclusion ARINC 653 applications using event synchronization may cause to concurrency errors such as race conditions due to nondeterministic executions of processes. This may lead to behaviors unexpected by programmers, so it must be considered for debugging. It is effective way to use visualization tools provided by the IDE for ARINC 653 applications, because detecting race conditions requires analysis of a lot of information. However, these tools do not consider race conditions, which require the programmers to analyze the process state transition considering event synchronization and to ratiocinate the occurrence of accesses to shared resources from source codes. This paper presented a visualization tool, called ConpathView that intuitively shows the aspect of the process execution with race conditions by analyzing the accesses to the shared memory based on the event services in ARINC 653 applications. The tool provides reduced visual complexity to effectively understand the executions of ARINC 653 applications due to the fact that it provides the aspect of process synchronization and confirms whether the race conditions run in the applications.
Acknowledgments This work was supported by the Basic Science Research Program through the National Research Foundation of Korea (NRF) funded by the Ministry of Education (NRF2014R1A1A2060082), and also was supported by Research fund, Gyeongsang National University, 2015 and the BK21 Plus Program (Research Team for Software Platform on Unmanned Aerial Vehicle, 21A20131600012) through the National Research Foundation of Korea (NRF) funded by the Ministry of Education.
References [1] [2]
[3] [4] [5] [6] [7]
74
Airlines electronic engineering committee (AEEC), “Avionics Application Software Standard Interface ARINC Specification 653 – part 1. (Supplement 3 - Required Services)”, ARINC inc., (2010). G. M. Tchamgoue, O.-K. Ha, K.-H. Kim and Y.-K. Jun, “A Framework for On-the-fly Race Healing in ARINC 653 Applications”, International Journal of Hybrid Information Technology, vol. 4, no. 2, (2011), pp. 1-12. S. H. VanderLeest, “ARINC 653 hypervisor”, Proceedings of the 29th Digital Avionics Systems Conference, Salt Lake city, UT, (2010) October 3-7. S. Han and H. Jin, “Full virtualization based ARINC 653 partitioning”, Proceedings of the 30th Digital Avionics Systems Conference, Seattle, WA, (2011) October 16-20. J. Kim, and Y. Jun, “Scalable On-the-fly Detection of the First Races in Parallel Programs”, 12nd Int'l Conf. on Supercomputing, ACM, Melbourne, Australia, (1998) July. Netzer, R. H. B., and B. P. Miller, “What are Race Conditions? Some Issues and Formalizations”, Letters of Programming Languages and Systems (LOPLAS), ACM, vol. 1, (1992), pp. 74-88. O.-K. Ha and Y.-K. Jun, “An Efficient Algorithm for On-the-Fly Data Race Detection Using an EpochBased Technique”, Scientific Programming, Vol. 2015, (2009), pp. 1-14.
Copyright ⓒ 2016 SERSC
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
[8] [9] [10] [11] [12] [13]
[14] [15] [16] [17]
[18]
[19]
[20] [21]
Wind River, Workbench, http://www.windriver.com/products/workbench/, (2013). DDC-I, DDC-I Development Suite (DDS), http://www.ddci.com/products_deos.php/, (2014). Green Hills, Multi, http://www.ghs.com/products/MULTI_IDE.html/, (2013). Lynux Works, Luminosity, http://www.lynuxworks.com/products/eclipse/luminosity.php/, (2013). Sysgo, CODEO, http://www.sysgo.com/products/pikeos-rtos-and-virtualization-concept/eclipse-basedcodeo/, (2014). Tae-Ho Kim, Dong-Hwan Son, Chang-Min Shin, Sa-Choun Park, Dong-Hyouk Lim, Hwa-Young Lee, Byeong-Ho Gim, and Chae-Deok Lim, “Qplus/Esto-AIR: DO-178B Level A Certified RTOS and IDE for Supporting ARINC 653”, Communications of the Korean Institute of Information Scientists and Engineer, vol. 30, no. 9, (2012), pp. 65-70. Paul Parkinson, Larry Kinnan, “Safety-Critical Software Development for Integrated Modular Aviionics”, White Paper, Wind River Systems, (2010). Green Hills, TimeMachine Debugging Suite, http://www.ghs.com/products/timemachine.html/, (2014). Lynx Software, SpyKer Embedded System Trace Tool, http://www.lynx.com/products/developmenttools/spyker-embedded-system-trace-tool/, (2014). M.-S. Kang, O.-K. Ha, and Y.-K. Jun, “Visualization Tool for Debugging Data Races in Structured Fork-join Parallel Programs,” International Journal of Software Engineering and Its Applications (IJSEIA), Vol. 8, No. 4, (2014), pp.157-168 Engel, C., E. Jenn, P. H. Schmitt, R. Coutinho, and T. Schoofs, “Enhanced Dispatchability of Aircraft using Multi-static Configurations”, Embedded Real Time Software and Systems, Toulouse, France, (2010), May. Lu, S., Park, S., Seo, E., and Zhou, Y, “Learning from mistakes: a comprehensive study on real world concurrency bug characteristics”, In ASPLOS 08: Architectural Support for Programming Languages and Operating Systems, Seattle, WA, (2008) March 1-5. Eclipse, The Standard Widget Toolkit, http://www.eclipse.org/swt/, (2013). Luk, C.-K., R Coh, R. Muth, H. Patil, A. Kaluser, G. Lowney, S. Wallace, V. J. Reddi, and K. Hazelwood, “Pin: building customized program analysis tools with dynamic instrumentation”, In Proceedings of the 2005 ACM SIGPLAN conference on Programming language design and implementation (PLDI'05), Chicago, IL, (2005) Jun 12-15.
Authors Myeong-Sin Kang, He received the BS degree in Computer Science, and the MS degree in Informatics from Gyeongsang National University (GNU), South Korea. He worked as an engineer of IT department in Korea industry for several years. He is now a software engineer for avionics in Aero Master Corporation, South Korea. His research interests including distributed programming and its debugging, embedded system programs for avionics, and dependable systems. Mun-Hye Jun, She received the BS degree in Computer Science from Gyeongsang National University, and the MS and PhD degree in Computer Engineering from Gyeongsang National University (GNU). She is now a part-time professor in the Department of Computer Science, GNU. She has interests including parallel/distributed computing, embedded systems, and systems software.
Ok-Kyoon Ha, He received the BS degree in Computer Science under the Bachelor’s Degree Examination Law for Self-Education from National Institute for Lifelong Education, and the MS and PhD degree in Informatics from Gyeongsang National University (GNU), South Korea. He is now a research professor in GNU. He worked as the manager of IT department in Korea industry for several years. His research interests including parallel/distributed programming, software testing and debugging, embedded system programs, dependable software, and software development activities for
Copyright ⓒ 2016 SERSC
75
International Journal of Software Engineering and Its Applications Vol. 10, No. 2 (2016)
avionics. Dr. Ha is a member of Korean Institute of Information Technology (KIIT) and Korea Institute of Information Scientist and Engineers (KIISE). Yong-Kee Jun, He received the BS degree in Computer Engineering from Kyungpook National University, and the MS and PhD degree in Computer Science from Seoul National University. He is now a full professor in the Department of Informatics, Gyeongsang National University, where he had served as the first director of GNU Research Institute of Computer and Information Communication (RICIC), and as the first operating director of GNU Virtual College. He is now the head of GNU Computer Science Division and the director of the GNU Embedded Software Center for Avionics (GESCA), a national IT Research Center (ITRC) in South Korea. As a scholar, he has produced both domestic and international publications developed by some professional interests including parallel/distributed computing, embedded systems, and systems software. Prof. Jun is a member of Association for Computing Machinery (ACM) and IEEE Computer Society.
76
Copyright ⓒ 2016 SERSC