Platform-wide Deadlock Immunity for Mobile Phones
|
|
|
- Shon Lloyd
- 9 years ago
- Views:
Transcription
1 Platform-wide Deadlock Immunity for Mobile Phones Horatiu Jula, Thomas Rensch, George Candea School of Computer and Communication Sciences École Polytechnique Fédérale de Lausanne (EPFL), Switzerland Abstract We present an implementation of our deadlock immunity system, Dimmunix, for mobile phone software. Within Android 2.2 OS, we modified Dalvik VM, the JVM running all the Android applications, to provide platform-wide deadlock immunity. We successfully ran the Dimmunix-enabled Android 2.2 OS on a Nexus One phone. On the phone, we reproduced a real deadlock involving Android s NotificationManagerService and StatusBarService classes, which froze the entire phone s interface. Android Dimmunix successfully detected the deadlock, and subsequently prevented its reoccurrence, with no user intervention. Our tests show that Android Dimmunix incurs 4-5% performance overhead and 4% memory overhead. Therefore, Android Dimmunix is a practical and efficient solution to cope with deadlocks on mobile phones. To the best of our knowledge, Android Dimmunix is the first failure immunity system for mobile phones, and the first one to provide platform-wide failure immunity. 1 Introduction Having deadlock immunity for mobile applications is useful; we describe below a real deadlock that we reproduced on an Android phone. The deadlock involves Android s NotificationManagerService and StatusBarService classes, and freezes the entire phone s interface. Without deadlock immunity, the phone may freeze whenever the user expands the status bar while notifications are sent to the status bar. With deadlock immunity, the phone hangs just once, then the deadlock is deterministically avoided. We enhanced Android OS, to provide deadlock immunity to all the applications running on an Android phone, i.e., platform-wide deadlock immunity. The users (or the application vendors) do not have to do anything to install (or provide) deadlock immunity for Android applications. All the applications installed on an Android phone automatically run with deadlock immunity. We call the extension of Android OS with deadlock immunity Android Dimmunix. The main contribution of our work is providing platform-wide deadlock immunity for mobile phones, with low performance and memory overheads. There are two key distinctions between Android Dimmunix and the previous Dimmunix implementations [1]. First, Android Dimmunix provides platform-wide deadlock immunity, while the previous Dimmunix implementations provide application-level deadlock immunity. Second, Android Dimmunix is designed for mobile platforms, while the previous implementations are designed for applications running on desktop/server machines; mobile applications have more strict performance/memory constraints compared to desktop/server applications. There are tools that provide immunity against failures like deadlocks [1, 2], data races and atomicity violations [3, 4, 5], and buffer overruns [6]; however, to the best of our knowledge, Android Dimmunix is (1) the first system that provides platform-wide failure immunity, and (2) the first system providing failure immunity to mobile phone applications. For a system that provides deadlock immunity to mobile platforms, it is essential to have low performance and memory overheads, because mobile phones have less CPU power and RAM memory available, compared to desktop computers or laptops. We show in 5 that Android Dimmunix incurs small performance and memory overheads, while protecting against deadlocks all the applications running on an Android phone. The paper is structured as follows. In 2, we provide background information about deadlock immunity and Dimmunix. In 3, we discuss aspects related to platformwide deadlock immunity and the design of Android Dimmunix. In 4, we provide details about the implementation of Android Dimmunix. In 5, we evaluate our implementation. In 6, we conclude. 2 Background In this section, we first define the deadlock immunity property ( 2.1), then we provide background information about Dimmunix ( 2.2). 2.1 Deadlock Immunity We define in this section the deadlock immunity prop- Appears in Proc. 7th Workshop on Hot Topics in System Dependability (HotDep), Hong Kong, China, June 2011
2 erty provided by Dimmunix. Dimmunix enables applications to develop antibodies for observed execution flows that led to deadlocks; we call these antibodies deadlock signatures. Having the signatures of previously encountered deadlocks in a persistent deadlock history, Dimmunix prevents reoccurrences of these deadlocks, by preventing execution flows matching signatures from the history. With every new signature discovered by Dimmunix, the program s resilience to deadlocks is improved. A deadlock signature is an approximation of the execution flow that led to deadlock. It consists of (1) the call stacks the deadlocked threads had when they acquired the locks involved in the deadlock, and (2) the call stacks of the deadlocked threads at the moment of the deadlock. We call the former outer call stacks and the latter inner call stacks. A frame in a call stack represents a position (location) in the program. We denote by outer (inner) lock statement, or simply outer (inner) position, the top frame of an outer (inner) call stack. A deadlock bug is uniquely delimited by the outer and inner positions of its signature; if a deadlock happens at different outer and/or inner positions, then it is a different deadlock bug. For a deadlock to occur, its signature must be instantiated, i.e., the program execution must match the signature ( 2.2). Therefore, by avoiding instantiations of the signature, Dimmunix avoids the deadlock. 2.2 Dimmunix Dimmunix is a tool for gaining immunity against deadlocks with no assistance from programmers or users. Dimmunix runs within the address space of the target program. Dimmunix can be used by customers to defend against deadlocks while waiting for a vendor patch, and by software vendors as a safety net. Dimmunix handles only mutex deadlocks, i.e., deadlocks involving mutex (monitor) acquisitions. Therefore, in this paper we refer only to mutex deadlocks. The Dimmunix architecture consists of two parts: (1) a module that detects deadlocks and adds their signatures to a persistent deadlock history, and (2) an avoidance module that prevents reoccurrences of previously encountered deadlocks, by avoiding instantiations of signatures from history. The code that calls into Dimmunix can be directly instrumented into the target binary or can reside in a synchronization library. This code intercepts the lock/unlock operations in the target programs and transfers the control to Dimmunix each time a lock/unlock operation is performed. To detect deadlocks, Dimmunix maintains the synchronization state in a resource allocation graph (RAG). The interception code informs Dimmunix each time a thread is about to request a lock, just acquired a lock, or is about to release a lock. Based on these events, Dimmunix updates the RAG accordingly. Every time a thread t requests a lock, Dimmunix looks for cycles containing t. If a cycle is found, it means that a deadlock involving thread t is about to occur. Imagine a deadlock involving threads t 1 and t 2, and locks l 1 and l 2 ; in the RAG, it CS appears as the cycle l out 1 CS 1 t in 1 CS 1 l out 2 CS 2 t in 2 2 l 1, annotated with the outer call stacks CS1 out and CS2 out, and inner call stacks CS1 in and CSin 2. The signature of the deadlock consists of the pairs of outer and inner call stacks, i.e., {(CS1 out,csin 1 ),(CSout 2,CSin 2 ). Dimmunix saves the signature to a persistent history, to avoid all future occurrences of this deadlock. The inner call stacks are available at the time of the deadlock. To obtain the outer call stacks, Dimmunix has to keep track, for each lock acquisition, of the call stack the owner thread had when it acquired the lock. Avoiding deadlocks consists of anticipating whether the acquisition of a lock would lead to the instantiation of a signature from the deadlock history. Only the outer call stacks are relevant for the avoidance; the inner call stacks are kept just to offer more information about the deadlock. For a signature with outer call stacks CS1 out,...,csout n to be instantiated, there must exist threads t 1,...,t n that either hold or are allowed to wait for locks l 1,...,l n while having call stacks CS1 out,...,csout n. Assume signature S with outer call stacks CS1 out and CS2 out, and a thread t 1 attempting to acquire a lock l 1 with call stack. To avoid instantiations of S, Dimmunix first pretends that it allows t 1 to acquire l 1, i.e., it does not allow t 1 to proceed, but it updates the internal state as if it did. Then, Dimmunix checks if instantiations of S are possible; if yes, Dimmunix suspends t 1 until no instantiations of S (or any other signature from the history) are possible. Dimmunix handles avoidance-induced deadlocks (i.e., CS1 out starvation): when starvation occurs, Dimmunix saves the signature of the avoidance-induced deadlock, and resumes the suspended thread. Dimmunix will subsequently avoid entering the same starvation condition again, just like it does for a normal deadlock. 3 Design In this section, we discuss aspects related to platformwide deadlock immunity ( 3.1), and present the most important design choices we took, to efficiently provide deadlock immunity for Android OS ( 3.2). 3.1 Platform-wide Deadlock Immunity We first explain the notions of platform-wide and application-level deadlock immunity, from the user s perspective. Platform-wide immunity means that all applications are immunized against deadlocks by default, without having to be launched in a special way. Applicationlevel immunity means that the applications are not immunized by default against deadlocks, and have to be executed in a special way to run with Dimmunix. 2
3 We discuss three aspects concerning platform-wide deadlock immunity: First, we show that it cannot be implemented in the kernel space; it has to be implemented in the user space, i.e., in the synchronization library. Second, we compare application-level to platform-wide deadlock immunity. Third, we explain what needs to be done to have an efficient platform-wide Dimmunix. Platform-wide deadlock immunity has to be implemented in the user space, i.e., in the synchronization library. All the modern platforms/libraries providing synchronization routines (e.g., JVM, POSIX threads) first attempt to acquire a lock in the user space. Dimmunix must intercept all the lock acquisitions. Since a lock may be acquired in the user space, the interception must be done in the user space. Since platform-wide Dimmunix has to run in userspace, there is a different instance of Dimmunix running within each process. Dimmunix s avoidance and detection mechanisms are application-local, i.e., deadlocks are detected and avoided locally in each application, in isolation from the other applications. We compare now application-level to platform-wide deadlock immunity systems. Application-level Dimmunix can be instrumentation-based or interception-based, i.e., it can instrument the synchronization statements in the program binary (e.g., by using AspectJ bytecode instrumentation framework [7]), or it can intercept the synchronization operations through a preloadable library (e.g., by using LD_PPRELOAD). An instrumentationbased implementation has the possibility to instrument only the synchronization statements previously involved in deadlocks (e.g., Java Dimmunix), in order to minimize the performance overhead and the intrusiveness. An interception-based implementation (e.g., POSIX Threads Dimmunix) does not have this possibility, because intercepting the synchronization operations involves overriding the synchronization routines. For platform-wide deadlock immunity, an interception-based implementation is the most natural choice; Android Dimmunix is interception-based. The only drawback of an interception-based implementation is that it cannot selectively instrument synchronization statements, while an instrumentation-based implementation can. However, an instrumentation-based implementation is more complicated, because it would have to dynamically modify the binary of every application, before executing it. Moreover, the binary instrumentation/analysis frameworks are not mature enough to allow a robust implementation. In future however, such an implementation may be feasible. An efficient platform-wide Dimmunix needs small CPU and memory consumptions, because all the applications run with Dimmunix. It is important to satisfy these requirements, especially for mobile platforms, which are designed to optimize the CPU and memory consumptions. To achieve computational efficiency, the code on the critical path must be optimized, i.e., the look-up of RAG nodes and the call stack retrieval. For memory efficiency, we dynamically allocate and reuse memory. In 4, we give more details about how we achieved an efficient implementation of Android Dimmunix. 3.2 Deadlock Immunity for Android OS In this section we explain the design choices we took in the implementation of Android Dimmunix. First, we explain our choice of implementing Dimmunix within Android s Dalvik VM. Second, we explain our decision to store only the top frames in the outer call stacks; we also show that, for synchronized blocks/methods, it is safe to use outer call stacks of depth 1. We implemented Android Dimmunix within the Dalvik VM. More precisely, we changed the code of Dalvik VM s synchronization routines to call into Dimmunix, as we illustrate in Figure 1. Dalvik VM is a customized JVM, in which Android OS runs all the applications. Since platform-wide deadlock immunity cannot be implemented in the kernel space ( 3.1), an implementation within the Dalvik VM is the natural choice. APP1 Dimmunix data Dalvik VM... Synchronization Routines Android OS APPn Dimmunix data Figure 1. The Architecture of Android Dimmunix. Such an implementation allows Android Dimmunix to detect and avoid deadlocks caused by lock inversions due to wait() calls. We show how such an inversion can lead to a deadlock, in the Java code below: Thread t1: Thread t2: synchronized(x) { synchronized(x) { synchronized(y) { synchronized(y) { x.wait(); If thread t 1 is executing x.wait() and thread t 2 just acquired monitor x, the two threads are going to deadlock: when thread t 1 finishes waiting on x, it will attempt to reacquire x, while holding monitor y; thread t 2 waits for y, while holding x. To detect and avoid such deadlocks, we changed the code of the Object.wait() native method: for each x.wait() call, Dimmunix is called before and after the reacquisition of x, at the end of the wait function. An instrumentation-based Dimmunix for Java cannot handle such deadlocks caused by wait() calls. For each x.wait() call, the reacquisition of x at the end of the wait 3
4 call has to be intercepted; therefore, the code of the Object.wait() native method has to be changed. In order to obtain the outer call stacks, Android Dimmunix needs to retrieve, for each lock acquisition, the call stack the owner thread had when it acquired the lock. For each lock l, Dimmunix stores in l.acqpos the call stack corresponding to the last acquisition of l. In the signature of a deadlock involving threads t 1 and t 2, and locks l 1 and l 2, the outer call stacks are l 1.acqPos and l 2.acqPos. Android Dimmunix uses outer call stacks of depth 1 in the signatures. Retrieving the call stack of each lock acquisition is expensive; therefore, we decided to retrieve only 1 frame, at the cost of a higher false positives rate in the deadlock avoidance. Using outer call stacks of depth 1 can be harmful, if a program uses mostly custom synchronization implemented with explicit lock/unlock operations; Dimmunix would serialize most of the synchronizations, as soon as the first deadlock occurs. Consider a Java program that uses the following wrapper of the RentrantLock class: public class MyLock { private ReentrantLock l; public void lock() { l.lock(); public void unlock() { l.unlock(); If any deadlock happens in the program, the outer call stacks will indicate the position p of the l.lock() statement within the MyLock class. Dimmunix would serialize all the synchronizations performed via objects of type MyLock, because they are all performed at position p. For synchronized blocks, it is safe to use outer call stacks of depth 1, because the synchronized blocks that appear in wrappers cannot be outer lock statements in a deadlock signature. Synchronized methods are essentially synchronized blocks, therefore we only discuss about synchronized blocks. Synchronized blocks are intra-procedural, i.e., a monitorexit(l) statement has to execute in the same method as the corresponding monitorenter(l) statement, like in the wrapper below: public void lock() { synchronized(l) { //update state Typically, the synchronized blocks from synchronization wrappers are not nested; therefore, they cannot be the outer positions of a deadlock signature, because the program cannot deadlock inside them. If somehow these synchronized blocks are nested, they are normally deadlock-free, otherwise a program that heavily uses the wrapper is likely to deadlock often; if such a program exists, it deserves to be entirely serialized. Android Dimmunix handles only synchronized blocks/methods. However, this is not a major shortcoming; there are 1,050 synchronized blocks/methods and only 15 explicit lock/unlock operations in Android 2.2 essential applications. 4 Implementation We implemented Dimmunix in Android OS 2.2, within the Dalvik VM, which runs all the Android applications. We modified Dalvik VM, to call Dimmunix upon each monitor acquisition/release. Android Dimmunix has two components: the Dimmunix core, which implements the deadlock immunity, and the integration code, which (1) obtains the information needed to call the Dimmunix core, (2) extends existing Dalvik VM data structures, to provide instant access to per-thread/monitor Dimmunix-related information, and (3) calls the Dimmunix core. The core has 661 lines of code (LOC), and the integration code has 155 LOC. Android Dimmunix uses the following data structures: The struct Node stores a RAG node corresponding to a thread/monitor object. The struct Position stores the program location of a monitorenter operation and the set of threads that hold (or are allowed by Dimmunix to acquire) locks at that location. To achieve zero-overhead look-up of the RAG node corresponding to a thread/monitor object, we added a node field in Dalvik s Thread and Monitor structs. We also added a stackbuffer field in struct Thread, where Dimmunix retrieves the call stack. We illustrate these changes in the code below: typedef struct Thread {... Node node;//rag node char* stackbuffer;//call stack buffer Thread; struct Monitor {... Node node;//rag node ; We describe now how Dimmunix s data structures are initialized. Whenever the Dalvik VM forks a new process, the initdimmunix routine is called, to initialize Dimmunix s global data for that process, e.g., the deadlock history, and the positions global map that associates a unique Position object to each program location. Remember that Android Dimmunix runs in user-space, therefore this global data is per-process. We modified the routines that fork Dalvik processes, i.e., Dalvik_dalvik_system_Zygote_fork and forkandspecializecommon, to initialize Dimmunix as soon as the child process starts. Each time a thread (monitor) object t (mon) is created by Dalvik s allocthread (dvmcreatemonitor(object* obj)) function, the integration code calls initnode(&t->node, t, T_THREAD) (initnode(&mon->node, obj, T_MONITOR)), to initialize the RAG node corresponding to t (mon), and allocate memory for t->stackbuffer. 4
5 The Dimmunix core is called by three routines, upon each monitorenter/monitorexit statement: The Request() routine executes before a monitorenter statement; it performs deadlock detection and returns whether a deadlock signature would be instantiated if the lock acquisition would be approved. The Acquired() routine runs immediately after a monitorenter statement, and the Release() routine runs right before a monitorexit statement; these two routines perform only RAG updates. For threadsafety, Dimmunix uses a global lock within these methods. As we show in 5, Dimmunix is efficient, even in the presence of this global lock, because the calls to the three methods are cheap. The Dalvik VM implements the monitorenter, monitorexit, and Object.wait() statements in the routines lock- Monitor, unlockmonitor, and waitmonitor. We changed lockmonitor to invoke the Request and Acquired Dimmunix routines: void lockmonitor(thread* t, Monitor* mon){ //monitorenter(mon), before acquiring mon dvmgetcallstack(t); Position* pos=getposition(t->stackbuffer); int sigid;//matched sig in history do { sigid = Request(&t->node,&mon->node,pos); //if instantiation found, yield and retry if (sigid >= 0) wait(history[sigid]); while (sigid >= 0); //t is allowed to acquire mon... //after acquiring mon Acquired(&t->node, &mon->node); We implemented the dvmgetcallstack routine that retrieves the top frame of a thread t s call stack into the t->stackbuffer buffer. As long as there is a signature S in history that is instantiated, Dimmunix makes the caller thread wait on a condition variable associated to S. We changed the unlockmonitor and waitmonitor routines, to call Dimmunix Release function, right before the monitor is released. If the released monitor was acquired with a call stack in the history, Dimmunix resumes all the threads waiting on signatures containing that call stack, as we illustrate in the code below: //thread t, before releasing mon Position* pos = mon->node.acqpos; if (pos->inhistory) { int sigid; for (sigid=0; sigid<histsize; sigid++) { if (history[sigid].contains(pos)) notifyall(history[sigid]); Release(&t->node, &mon->node); //release mon Dimmunix turns the thin lock associated to an object x into a fat lock, i.e., a Monitor object, as soon as a monitorenter(x) statement is called. The reason is that a RAG lock node is encapsulated in a Monitor object; the thin lock is a simple integer field, which cannot accommodate a RAG node. To make sure that each monitorenter statement is executed on a fat lock, we added the code below before calls to lockmonitor: //if the lock is thin if (LW_MONITOR(obj->lock) == NULL) { pthread_mutex_lock(&globallock); //if still thin, fatten the lock if (LW_MONITOR(obj->lock) == NULL) { Monitor* mon = dvmcreatemonitor(obj); obj->lock = (u4)mon LW_SHAPE_FAT; pthread_mutex_unlock(&globallock); Most of the CPU and memory consumptions are due to the computations related to the call stacks. Dimmunix allocates a unique Position object for each call stack of a synchronization operation. Using call stacks of depth 1 minimizes the number of Position objects. The Thread.stackBuffer field makes the call stack retrieval more efficient; the field is thread-local, and the dvmget- CallStack routine does not need to allocate memory for storing the current call stack. To eliminate the overhead incurred by the call stack retrieval, the compiler could produce a unique id for each synchronization statement, based on the location of that statement. The ids would be constant in all the executions of the application, because every id is bound to a program location. Dimmunix can use the ids instead of the call stacks, to identify synchronization statements. The compiler can pass the id as a parameter to the lockmonitor, unlockmonitor, and waitmonitor routines; this way, retrieving the id would not incur any performance penalty. If the deadlock signatures are on the critical path, Dimmunix may incur significant performance overhead, due to the computations performed in the avoidance code. More precisely, the Request routine looks for signatures in the history that are instantiated. For signature matching, Dimmunix maintains for each Position object p a queue that stores the threads holding (or allowed to acquire) locks with position (call stack) p. To reduce the number of memory allocations, Dimmunix uses a second queue, where the elements deleted from the main queue are stored. Whenever a thread t needs to be added to the main queue and the second queue is non-empty, Dimmunix pops an element from the second queue, makes it point to t, and adds it to the main queue. Android Dimmunix does not handle deadlocks involving native code (i.e., using Android NDK). However, it is possible to handle such deadlocks, by intercepting the synchronization operations within the POSIX 5
6 Threads library. This must be done carefully, because the Dalvik VM already uses this library to implement the synchronization operations in Java. Therefore, Android OS should allow Dimmunix to intercept the calls to the POSIX Threads synchronization routines only when native code executes. 5 Evaluation We installed a Dimmunix-enabled Android 2.2 OS on a Nexus One phone, equipped with a 1-core 1GHz CPU, and 512 MB of RAM memory. While using the applications installed on the phone, we noticed no slowdown, compared to the vanilla Android 2.2 OS installation. We reproduced a real deadlock involving Android s NotificationManagerService and StatusBarService classes (issue id: 7986), which froze the entire phone s interface. We made a small Android application in which one thread issues a notification, and a second thread expands the status bar, in the same time. The two threads called concurrently the methods NotificationManagerService.enqueueNotificationWithTag and StatusBarService$H.handleMessage, which made the two services deadlock. This deadlock made the whole phone s interface hang. Dimmunix detected the deadlock and saved its signature in the persistent history. After rebooting the phone, Dimmunix successfully avoided any reoccurrence of the deadlock. We profiled the synchronization behavior of 8 Android applications, with Dimmunix disabled. The results are shown in Table 1. For each application, we profiled its synchronization behavior during several minutes of intensive usage; then, we selected the 30 seconds interval with the highest average synchronization throughput. In these time intervals, the 8 applications perform synchronizations per second, using threads. Table 1. Statistics about various Android applications. Application Threads Syncs/sec Memory consumption Dimmunix: 52% Vanilla: 50% 46 1, MB 15.0 MB Browser 61 1, MB 37.9 MB Maps 119 1, MB 22.9 MB Market MB 17.3 MB Calendar MB 14.0 MB Talk MB 10.7 MB Angry Birds MB 29.3 MB Camera MB 11.4 MB To measure the performance overhead, we reproduced in a microbenchmark the most intensive synchronization behavior that we observed in the 8 applications we studied. The microbenchmark runs threads, that execute synchronized blocks on random lock objects, to avoid contention; lock contention has the undesired effect of hiding the performance overhead. We do not use sleeps, because they hide the performance overhead; we use busy waits instead, to simulate computation inside and outside the critical sections. We use a history of synthetic signatures, to simulate the scenario in which many synchronization statements are involved in deadlock bugs. The microbenchmark executes synchronizations per second, with Dimmunix disabled; this is similar to the synchronization throughput of the most lock-intensive applications that we studied (i.e., and Browser). On the Dimmunix-enabled Android OS, the microbenchmark runs synchronizations per second. This means 4-5% performance overhead. Most of the overhead is due to the call stack retrieval, i.e., the calls to dvmgetcallstack. We also measured the power consumption after an intensive usage. With and without Dimmunix, Android OS reported that the Android applications and the OS are responsible for 14% of the power consumption. Therefore, Dimmunix does not increase the power consumption. We evaluated the memory overhead incurred by Android Dimmunix; the results are shown in Table 1. Dimmunix incurs % memory overhead in the 8 applications we studied. Overall, for all the running applications, the memory overhead is 4%; the overall memory consumption is 52% for the Dimmunix-enabled Android OS, and 50% for the vanilla Android OS. 6 Conclusion We implemented Dimmunix for Android OS, within the Dalvik VM. Android Dimmunix provides deadlock immunity to all the applications running on an Android phone, with small performance and memory overheads, i.e., 4-5% and 4%, respectively. Therefore, Android Dimmunix is a practical solution for protecting mobile applications against deadlock bugs. References [1] H. Jula, D. Tralamazza, C. Zamfir, and G. Candea, Deadlock immunity: Enabling systems to defend against deadlocks, in Symp. on Operating Sys. Design and Implem., [2] Y. Nir-Buchbinder, R. Tzoref, and S. Ur, Deadlocks: From exhibiting to healing, in Workshop on Runtime Verification, [3] Z. Letko, T. Vojnar, and B. Krena, Atomrace: Data race and atomicity violation detector and healer, in Workshop on Parallel and Distributed Systems: Testing, Analysis, and Debugging, [4] B. Krena, Z. Letko, R. Tzoref, S. Ur, and T. Vojnar, Healing data races on-the-fly, in Workshop on Parallel and Distributed Systems: Testing, Analysis, and Debugging (PAD- TAD), [5] L. Chew and D. Lie, Kivati: fast detection and prevention of atomicity violations, in ACM EuroSys European Conf. on Computer Systems, [6] M. Costa, M. Castro, L. Zhou, L. Zhang, and M. Peinado, Bouncer: Securing software by blocking bad input, in Symp. on Operating Systems Principles, [7] AspectJ, 6
An Easier Way for Cross-Platform Data Acquisition Application Development
An Easier Way for Cross-Platform Data Acquisition Application Development For industrial automation and measurement system developers, software technology continues making rapid progress. Software engineers
Last Class: OS and Computer Architecture. Last Class: OS and Computer Architecture
Last Class: OS and Computer Architecture System bus Network card CPU, memory, I/O devices, network card, system bus Lecture 3, page 1 Last Class: OS and Computer Architecture OS Service Protection Interrupts
Chapter 6, The Operating System Machine Level
Chapter 6, The Operating System Machine Level 6.1 Virtual Memory 6.2 Virtual I/O Instructions 6.3 Virtual Instructions For Parallel Processing 6.4 Example Operating Systems 6.5 Summary Virtual Memory General
Monitors, Java, Threads and Processes
Monitors, Java, Threads and Processes 185 An object-oriented view of shared memory A semaphore can be seen as a shared object accessible through two methods: wait and signal. The idea behind the concept
RTOS Debugger for ecos
RTOS Debugger for ecos TRACE32 Online Help TRACE32 Directory TRACE32 Index TRACE32 Documents... RTOS Debugger... RTOS Debugger for ecos... 1 Overview... 2 Brief Overview of Documents for New Users... 3
Why Threads Are A Bad Idea (for most purposes)
Why Threads Are A Bad Idea (for most purposes) John Ousterhout Sun Microsystems Laboratories [email protected] http://www.sunlabs.com/~ouster Introduction Threads: Grew up in OS world (processes).
QUIRE: : Lightweight Provenance for Smart Phone Operating Systems
QUIRE: : Lightweight Provenance for Smart Phone Operating Systems Dan S. Wallach Rice University Joint work with Mike Dietz, Yuliy Pisetsky, Shashi Shekhar, and Anhei Shu Android's security is awesome
Zing Vision. Answering your toughest production Java performance questions
Zing Vision Answering your toughest production Java performance questions Outline What is Zing Vision? Where does Zing Vision fit in your Java environment? Key features How it works Using ZVRobot Q & A
Java Virtual Machine Locks
Java Virtual Machine Locks SS 2008 Synchronized Gerald SCHARITZER (e0127228) 2008-05-27 Synchronized 1 / 13 Table of Contents 1 Scope...3 1.1 Constraints...3 1.2 In Scope...3 1.3 Out of Scope...3 2 Logical
Objectives. Chapter 2: Operating-System Structures. Operating System Services (Cont.) Operating System Services. Operating System Services (Cont.
Objectives To describe the services an operating system provides to users, processes, and other systems To discuss the various ways of structuring an operating system Chapter 2: Operating-System Structures
Chapter 2: OS Overview
Chapter 2: OS Overview CmSc 335 Operating Systems 1. Operating system objectives and functions Operating systems control and support the usage of computer systems. a. usage users of a computer system:
Performance Evaluation and Optimization of A Custom Native Linux Threads Library
Center for Embedded Computer Systems University of California, Irvine Performance Evaluation and Optimization of A Custom Native Linux Threads Library Guantao Liu and Rainer Dömer Technical Report CECS-12-11
11.1 inspectit. 11.1. inspectit
11.1. inspectit Figure 11.1. Overview on the inspectit components [Siegl and Bouillet 2011] 11.1 inspectit The inspectit monitoring tool (website: http://www.inspectit.eu/) has been developed by NovaTec.
Example of Standard API
16 Example of Standard API System Call Implementation Typically, a number associated with each system call System call interface maintains a table indexed according to these numbers The system call interface
Lecture 17: Mobile Computing Platforms: Android. Mythili Vutukuru CS 653 Spring 2014 March 24, Monday
Lecture 17: Mobile Computing Platforms: Android Mythili Vutukuru CS 653 Spring 2014 March 24, Monday Mobile applications vs. traditional applications Traditional model of computing: an OS (Linux / Windows),
CS414 SP 2007 Assignment 1
CS414 SP 2007 Assignment 1 Due Feb. 07 at 11:59pm Submit your assignment using CMS 1. Which of the following should NOT be allowed in user mode? Briefly explain. a) Disable all interrupts. b) Read the
Object Instance Profiling
Object Instance Profiling Lubomír Bulej 1,2, Lukáš Marek 1, Petr Tůma 1 Technical report No. 2009/7, November 2009 Version 1.0, November 2009 1 Distributed Systems Research Group, Department of Software
SYSTEM ecos Embedded Configurable Operating System
BELONGS TO THE CYGNUS SOLUTIONS founded about 1989 initiative connected with an idea of free software ( commercial support for the free software ). Recently merged with RedHat. CYGNUS was also the original
RTI Monitoring Library Getting Started Guide
RTI Monitoring Library Getting Started Guide Version 5.1.0 2011-2013 Real-Time Innovations, Inc. All rights reserved. Printed in U.S.A. First printing. December 2013. Trademarks Real-Time Innovations,
ANDROID BASED MOBILE APPLICATION DEVELOPMENT and its SECURITY
ANDROID BASED MOBILE APPLICATION DEVELOPMENT and its SECURITY Suhas Holla #1, Mahima M Katti #2 # Department of Information Science & Engg, R V College of Engineering Bangalore, India Abstract In the advancing
ODROID Multithreading in Android
Multithreading in Android 1 Index Android Overview Android Stack Android Development Tools Main Building Blocks(Activity Life Cycle) Threading in Android Multithreading via AsyncTask Class Multithreading
Real Time Programming: Concepts
Real Time Programming: Concepts Radek Pelánek Plan at first we will study basic concepts related to real time programming then we will have a look at specific programming languages and study how they realize
General Introduction
Managed Runtime Technology: General Introduction Xiao-Feng Li ([email protected]) 2012-10-10 Agenda Virtual machines Managed runtime systems EE and MM (JIT and GC) Summary 10/10/2012 Managed Runtime
ITG Software Engineering
Basic Android Development Course ID: Page 1 Last Updated 12/15/2014 Basic Android Development ITG Software Engineering Course Overview: This 5 day course gives students the fundamental basics of Android
Last Class: OS and Computer Architecture. Last Class: OS and Computer Architecture
Last Class: OS and Computer Architecture System bus Network card CPU, memory, I/O devices, network card, system bus Lecture 3, page 1 Last Class: OS and Computer Architecture OS Service Protection Interrupts
BlackBerry Enterprise Service 10. Secure Work Space for ios and Android Version: 10.1.1. Security Note
BlackBerry Enterprise Service 10 Secure Work Space for ios and Android Version: 10.1.1 Security Note Published: 2013-06-21 SWD-20130621110651069 Contents 1 About this guide...4 2 What is BlackBerry Enterprise
Overview of CS 282 & Android
Overview of CS 282 & Android Douglas C. Schmidt [email protected] www.dre.vanderbilt.edu/~schmidt Institute for Software Integrated Systems Vanderbilt University Nashville, Tennessee, USA CS 282
Replication on Virtual Machines
Replication on Virtual Machines Siggi Cherem CS 717 November 23rd, 2004 Outline 1 Introduction The Java Virtual Machine 2 Napper, Alvisi, Vin - DSN 2003 Introduction JVM as state machine Addressing non-determinism
Topics. Producing Production Quality Software. Concurrent Environments. Why Use Concurrency? Models of concurrency Concurrency in Java
Topics Producing Production Quality Software Models of concurrency Concurrency in Java Lecture 12: Concurrent and Distributed Programming Prof. Arthur P. Goldberg Fall, 2005 2 Why Use Concurrency? Concurrent
It is the thinnest layer in the OSI model. At the time the model was formulated, it was not clear that a session layer was needed.
Session Layer The session layer resides above the transport layer, and provides value added services to the underlying transport layer services. The session layer (along with the presentation layer) add
OMPT and OMPD: OpenMP Tools Application Programming Interfaces for Performance Analysis and Debugging
OMPT and OMPD: OpenMP Tools Application Programming Interfaces for Performance Analysis and Debugging Alexandre Eichenberger, John Mellor-Crummey, Martin Schulz, Nawal Copty, John DelSignore, Robert Dietrich,
Last Class: Semaphores
Last Class: Semaphores A semaphore S supports two atomic operations: S Wait(): get a semaphore, wait if busy semaphore S is available. S Signal(): release the semaphore, wake up a process if one is waiting
CS11 Java. Fall 2014-2015 Lecture 7
CS11 Java Fall 2014-2015 Lecture 7 Today s Topics! All about Java Threads! Some Lab 7 tips Java Threading Recap! A program can use multiple threads to do several things at once " A thread can have local
Overview. CMSC 330: Organization of Programming Languages. Synchronization Example (Java 1.5) Lock Interface (Java 1.5) ReentrantLock Class (Java 1.
CMSC 330: Organization of Programming Languages Java 1.5, Ruby, and MapReduce Overview Java 1.5 ReentrantLock class Condition interface - await( ), signalall( ) Ruby multithreading Concurrent programming
Java Coding Practices for Improved Application Performance
1 Java Coding Practices for Improved Application Performance Lloyd Hagemo Senior Director Application Infrastructure Management Group Candle Corporation In the beginning, Java became the language of the
GETTING STARTED WITH ANDROID DEVELOPMENT FOR EMBEDDED SYSTEMS
Embedded Systems White Paper GETTING STARTED WITH ANDROID DEVELOPMENT FOR EMBEDDED SYSTEMS September 2009 ABSTRACT Android is an open source platform built by Google that includes an operating system,
Stream Processing on GPUs Using Distributed Multimedia Middleware
Stream Processing on GPUs Using Distributed Multimedia Middleware Michael Repplinger 1,2, and Philipp Slusallek 1,2 1 Computer Graphics Lab, Saarland University, Saarbrücken, Germany 2 German Research
Virtual Private Systems for FreeBSD
Virtual Private Systems for FreeBSD Klaus P. Ohrhallinger 06. June 2010 Abstract Virtual Private Systems for FreeBSD (VPS) is a novel virtualization implementation which is based on the operating system
Overview Motivating Examples Interleaving Model Semantics of Correctness Testing, Debugging, and Verification
Introduction Overview Motivating Examples Interleaving Model Semantics of Correctness Testing, Debugging, and Verification Advanced Topics in Software Engineering 1 Concurrent Programs Characterized by
Full System Emulation:
Full System Emulation: Achieving Successful Automated Dynamic Analysis of Evasive Malware Christopher Kruegel Lastline, Inc. [email protected] 1 Introduction Automated malware analysis systems (or sandboxes)
Monitoring Java enviroment / applications
Monitoring Java enviroment / applications Uroš Majcen [email protected] Java is Everywhere You Can Expect More. Java in Mars Rover With the help of Java Technology, and the Jet Propulsion Laboratory (JPL),
Tasks Schedule Analysis in RTAI/Linux-GPL
Tasks Schedule Analysis in RTAI/Linux-GPL Claudio Aciti and Nelson Acosta INTIA - Depto de Computación y Sistemas - Facultad de Ciencias Exactas Universidad Nacional del Centro de la Provincia de Buenos
First-class User Level Threads
First-class User Level Threads based on paper: First-Class User Level Threads by Marsh, Scott, LeBlanc, and Markatos research paper, not merely an implementation report User-level Threads Threads managed
Progress Report Aspect Oriented Programming meets Design Patterns. Academic Programme MSc in Advanced Computer Science. Guillermo Antonio Toro Bayona
Progress Report Aspect Oriented Programming meets Design Patterns Academic Programme MSc in Advanced Computer Science Guillermo Antonio Toro Bayona Supervisor Dr. John Sargeant The University of Manchester
Built-in Concurrency Primitives in Java Programming Language. by Yourii Martiak and Mahir Atmis
Built-in Concurrency Primitives in Java Programming Language by Yourii Martiak and Mahir Atmis Overview One of the many strengths of Java is the built into the programming language support for concurrency
Multithreading and Java Native Interface (JNI)!
SERE 2013 Secure Android Programming: Best Practices for Data Safety & Reliability Multithreading and Java Native Interface (JNI) Rahul Murmuria, Prof. Angelos Stavrou [email protected], [email protected]
HeapStats: Your Dependable Helper for Java Applications, from Development to Operation
: Technologies for Promoting Use of Open Source Software that Contribute to Reducing TCO of IT Platform HeapStats: Your Dependable Helper for Java Applications, from Development to Operation Shinji Takao,
Effective Java Programming. measurement as the basis
Effective Java Programming measurement as the basis Structure measurement as the basis benchmarking micro macro profiling why you should do this? profiling tools Motto "We should forget about small efficiencies,
Java Memory Model: Content
Java Memory Model: Content Memory Models Double Checked Locking Problem Java Memory Model: Happens Before Relation Volatile: in depth 16 March 2012 1 Java Memory Model JMM specifies guarantees given by
NetBeans Profiler is an
NetBeans Profiler Exploring the NetBeans Profiler From Installation to a Practical Profiling Example* Gregg Sporar* NetBeans Profiler is an optional feature of the NetBeans IDE. It is a powerful tool that
Software and the Concurrency Revolution
Software and the Concurrency Revolution A: The world s fastest supercomputer, with up to 4 processors, 128MB RAM, 942 MFLOPS (peak). 2 Q: What is a 1984 Cray X-MP? (Or a fractional 2005 vintage Xbox )
CS423 Spring 2015 MP4: Dynamic Load Balancer Due April 27 th at 9:00 am 2015
CS423 Spring 2015 MP4: Dynamic Load Balancer Due April 27 th at 9:00 am 2015 1. Goals and Overview 1. In this MP you will design a Dynamic Load Balancer architecture for a Distributed System 2. You will
OPERATING SYSTEM SERVICES
OPERATING SYSTEM SERVICES USER INTERFACE Command line interface(cli):uses text commands and a method for entering them Batch interface(bi):commands and directives to control those commands are entered
Lecture 1 Introduction to Android
These slides are by Dr. Jaerock Kwon at. The original URL is http://kettering.jrkwon.com/sites/default/files/2011-2/ce-491/lecture/alecture-01.pdf so please use that instead of pointing to this local copy
PART IV Performance oriented design, Performance testing, Performance tuning & Performance solutions. Outline. Performance oriented design
PART IV Performance oriented design, Performance testing, Performance tuning & Performance solutions Slide 1 Outline Principles for performance oriented design Performance testing Performance tuning General
Mobile Application Development Android
Mobile Application Development Android MTAT.03.262 Satish Srirama [email protected] Goal Give you an idea of how to start developing Android applications Introduce major Android application concepts
Real-Time Systems Prof. Dr. Rajib Mall Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur
Real-Time Systems Prof. Dr. Rajib Mall Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur Lecture No. # 26 Real - Time POSIX. (Contd.) Ok Good morning, so let us get
Compute Cluster Server Lab 3: Debugging the parallel MPI programs in Microsoft Visual Studio 2005
Compute Cluster Server Lab 3: Debugging the parallel MPI programs in Microsoft Visual Studio 2005 Compute Cluster Server Lab 3: Debugging the parallel MPI programs in Microsoft Visual Studio 2005... 1
ELEC 377. Operating Systems. Week 1 Class 3
Operating Systems Week 1 Class 3 Last Class! Computer System Structure, Controllers! Interrupts & Traps! I/O structure and device queues.! Storage Structure & Caching! Hardware Protection! Dual Mode Operation
Java Mission Control
Java Mission Control Harald Bräuning Resources Main Resource: Java Mission Control Tutorial by Marcus Hirt http://hirt.se/downloads/oracle/jmc_tutorial.zip includes sample projects! Local copy: /common/fesa/jmcexamples/jmc_tutorial.zip
Review from last time. CS 537 Lecture 3 OS Structure. OS structure. What you should learn from this lecture
Review from last time CS 537 Lecture 3 OS Structure What HW structures are used by the OS? What is a system call? Michael Swift Remzi Arpaci-Dussea, Michael Swift 1 Remzi Arpaci-Dussea, Michael Swift 2
Configuring Apache Derby for Performance and Durability Olav Sandstå
Configuring Apache Derby for Performance and Durability Olav Sandstå Database Technology Group Sun Microsystems Trondheim, Norway Overview Background > Transactions, Failure Classes, Derby Architecture
Thesis Proposal: Improving the Performance of Synchronization in Concurrent Haskell
Thesis Proposal: Improving the Performance of Synchronization in Concurrent Haskell Ryan Yates 5-5-2014 1/21 Introduction Outline Thesis Why Haskell? Preliminary work Hybrid TM for GHC Obstacles to Performance
COLO: COarse-grain LOck-stepping Virtual Machine for Non-stop Service
COLO: COarse-grain LOck-stepping Virtual Machine for Non-stop Service Eddie Dong, Yunhong Jiang 1 Legal Disclaimer INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE,
Performance Tools for Parallel Java Environments
Performance Tools for Parallel Java Environments Sameer Shende and Allen D. Malony Department of Computer and Information Science, University of Oregon {sameer,malony}@cs.uoregon.edu http://www.cs.uoregon.edu/research/paracomp/tau
Semaphores and Monitors: High-level Synchronization Constructs
Semaphores and Monitors: High-level Synchronization Constructs 1 Synchronization Constructs Synchronization Coordinating execution of multiple threads that share data structures Past few lectures: Locks:
Debugging with TotalView
Tim Cramer 17.03.2015 IT Center der RWTH Aachen University Why to use a Debugger? If your program goes haywire, you may... ( wand (... buy a magic... read the source code again and again and...... enrich
! Past few lectures: Ø Locks: provide mutual exclusion Ø Condition variables: provide conditional synchronization
1 Synchronization Constructs! Synchronization Ø Coordinating execution of multiple threads that share data structures Semaphores and Monitors: High-level Synchronization Constructs! Past few lectures:
Frameworks & Android. Programmeertechnieken, Tim Cocx
Frameworks & Android Programmeertechnieken, Tim Cocx Discover thediscover world atthe Leiden world University at Leiden University Software maken is hergebruiken The majority of programming activities
Multi-core Programming System Overview
Multi-core Programming System Overview Based on slides from Intel Software College and Multi-Core Programming increasing performance through software multi-threading by Shameem Akhter and Jason Roberts,
Chapter 3 Operating-System Structures
Contents 1. Introduction 2. Computer-System Structures 3. Operating-System Structures 4. Processes 5. Threads 6. CPU Scheduling 7. Process Synchronization 8. Deadlocks 9. Memory Management 10. Virtual
Understanding Hardware Transactional Memory
Understanding Hardware Transactional Memory Gil Tene, CTO & co-founder, Azul Systems @giltene 2015 Azul Systems, Inc. Agenda Brief introduction What is Hardware Transactional Memory (HTM)? Cache coherence
Lecture 6: Semaphores and Monitors
HW 2 Due Tuesday 10/18 Lecture 6: Semaphores and Monitors CSE 120: Principles of Operating Systems Alex C. Snoeren Higher-Level Synchronization We looked at using locks to provide mutual exclusion Locks
Debugging Java performance problems. Ryan Matteson [email protected] http://prefetch.net
Debugging Java performance problems Ryan Matteson [email protected] http://prefetch.net Overview Tonight I am going to discuss Java performance, and how opensource tools can be used to debug performance
Concurrency Control. Module 6, Lectures 1 and 2
Concurrency Control Module 6, Lectures 1 and 2 The controlling intelligence understands its own nature, and what it does, and whereon it works. -- Marcus Aurelius Antoninus, 121-180 A. D. Database Management
Research and Design of Universal and Open Software Development Platform for Digital Home
Research and Design of Universal and Open Software Development Platform for Digital Home CaiFeng Cao School of Computer Wuyi University, Jiangmen 529020, China [email protected] Abstract. With the development
OMPT: OpenMP Tools Application Programming Interfaces for Performance Analysis
OMPT: OpenMP Tools Application Programming Interfaces for Performance Analysis Alexandre Eichenberger, John Mellor-Crummey, Martin Schulz, Michael Wong, Nawal Copty, John DelSignore, Robert Dietrich, Xu
MASSACHUSETTS INSTITUTE OF TECHNOLOGY. 6.033 Computer Systems Engineering: Spring 2013. Quiz I Solutions
Department of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY 6.033 Computer Systems Engineering: Spring 2013 Quiz I Solutions There are 11 questions and 8 pages in this
10.04.2008. Thomas Fahrig Senior Developer Hypervisor Team. Hypervisor Architecture Terminology Goals Basics Details
Thomas Fahrig Senior Developer Hypervisor Team Hypervisor Architecture Terminology Goals Basics Details Scheduling Interval External Interrupt Handling Reserves, Weights and Caps Context Switch Waiting
System Structures. Services Interface Structure
System Structures Services Interface Structure Operating system services (1) Operating system services (2) Functions that are helpful to the user User interface Command line interpreter Batch interface
Resource Utilization of Middleware Components in Embedded Systems
Resource Utilization of Middleware Components in Embedded Systems 3 Introduction System memory, CPU, and network resources are critical to the operation and performance of any software system. These system
VIRTUALIZATION AND CPU WAIT TIMES IN A LINUX GUEST ENVIRONMENT
VIRTUALIZATION AND CPU WAIT TIMES IN A LINUX GUEST ENVIRONMENT James F Brady Capacity Planner for the State Of Nevada [email protected] The virtualization environment presents the opportunity to better
The EMSX Platform. A Modular, Scalable, Efficient, Adaptable Platform to Manage Multi-technology Networks. A White Paper.
The EMSX Platform A Modular, Scalable, Efficient, Adaptable Platform to Manage Multi-technology Networks A White Paper November 2002 Abstract: The EMSX Platform is a set of components that together provide
Multiprocessor Scheduling and Scheduling in Linux Kernel 2.6
Multiprocessor Scheduling and Scheduling in Linux Kernel 2.6 Winter Term 2008 / 2009 Jun.-Prof. Dr. André Brinkmann [email protected] Universität Paderborn PC² Agenda Multiprocessor and
A Look through the Android Stack
A Look through the Android Stack A Look through the Android Stack Free Electrons Maxime Ripard Free Electrons Embedded Linux Developers c Copyright 2004-2012, Free Electrons. Creative Commons BY-SA 3.0
An Oracle White Paper September 2013. Advanced Java Diagnostics and Monitoring Without Performance Overhead
An Oracle White Paper September 2013 Advanced Java Diagnostics and Monitoring Without Performance Overhead Introduction... 1 Non-Intrusive Profiling and Diagnostics... 2 JMX Console... 2 Java Flight Recorder...
Audit Trails in the Aeolus Distributed Security Platform. Victoria Popic
Audit Trails in the Aeolus Distributed Security Platform by Victoria Popic B.S., C.S. and Math MIT (2009) Submitted to the Department of Electrical Engineering and Computer Science in Partial Fulfillment
Android Operating System:
Android Operating System: An in depth introduction CS423 Project Mohammad Alian, Shuomeng Guang, Bo Teng Outline 1. What is Android 2. History 3. Android architecture 4. Android vs Linux 5. Process Management
Oracle JRockit Mission Control Overview
Oracle JRockit Mission Control Overview An Oracle White Paper June 2008 JROCKIT Oracle JRockit Mission Control Overview Oracle JRockit Mission Control Overview...3 Introduction...3 Non-intrusive profiling
Performance Optimization Guide
Performance Optimization Guide Publication Date: July 06, 2016 Copyright Metalogix International GmbH, 2001-2016. All Rights Reserved. This software is protected by copyright law and international treaties.
Frysk The Systems Monitoring and Debugging Tool. Andrew Cagney
Frysk The Systems Monitoring and Debugging Tool Andrew Cagney Agenda Two Use Cases Motivation Comparison with Existing Free Technologies The Frysk Architecture and GUI Command Line Utilities Current Status
What s Cool in the SAP JVM (CON3243)
What s Cool in the SAP JVM (CON3243) Volker Simonis, SAP SE September, 2014 Public Agenda SAP JVM Supportability SAP JVM Profiler SAP JVM Debugger 2014 SAP SE. All rights reserved. Public 2 SAP JVM SAP
Operating Systems and Networks
recap Operating Systems and Networks How OS manages multiple tasks Virtual memory Brief Linux demo Lecture 04: Introduction to OS-part 3 Behzad Bordbar 47 48 Contents Dual mode API to wrap system calls
Language Based Virtual Machines... or why speed matters. by Lars Bak, Google Inc
Language Based Virtual Machines... or why speed matters by Lars Bak, Google Inc Agenda Motivation for virtual machines HotSpot V8 Dart What I ve learned Background 25+ years optimizing implementations
x64 Servers: Do you want 64 or 32 bit apps with that server?
TMurgent Technologies x64 Servers: Do you want 64 or 32 bit apps with that server? White Paper by Tim Mangan TMurgent Technologies February, 2006 Introduction New servers based on what is generally called
