BRUMM:A Case for Predictable Memory Reclamation
Abstract
Edge data centers process latency-sensitive workloads of nearby Internet-of-Things devices. These security-critical, multi-tenant environments are equipped with comparatively limited compute resources. Consequently, resource management must be fast and predictable even in the presence of malicious tenants because there is no surplus of resources to compensate for performance attacks. In particular, there is a need to constrain the time it takes to reclaim memory from applications. Existing accounting mechanisms in operating systems focus on limiting memory or scheduling-time usage; they provide no guarantees about the latency of resource reclamation, which can vary greatly and is a potential vector for performance attacks.
To solve this standing issue, we introduce Brumm (Bounded Reclamation of User-space Memory Mappings): This accounting-driven mechanism predicts and tracks how long it will take to reclaim memory allocated to applications, enforcing an upper limit via a configurable latency budget. As a case study, we extended the L4Re microkernel to add a quota object for reclamation latency and enforce its limit. Our evaluation demonstrates that this implementation of Brumm achieves a consistent overestimation of reclamation latency, staying within the same order of magnitude to real, measured latencies. The implementation only shows modest performance overhead on kernel operations, ranging from % overhead for simple system calls to % in synthetic worst-case scenarios. Brumm makes reclamation latency a first-class resource that can be accounted for, thereby improving isolation and reliability in edge clouds.
Keywords and phrases:
Resource Reclamation, Main Memory, Accounting, Operating System, Microkernel, Capability, L4ReCopyright and License:
Horst Schirmeier; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Computer systems organization Real-time operating systems ; Security and privacy Operating systems security ; Security and privacy Intrusion/anomaly detection and malware mitigation ; Software and its engineering Memory management ; Computer systems organization AvailabilityAcknowledgements:
We would like to thank Till Miemietz for his suggestions and help in improving this work. Till Miemietz is co-funded by the European Union and by budget adopted by the Saxon State Parliament under project MikroRZ.Supplementary Material:
Software (ECRTS 2026 Artifact Evaluation approved artifact): https://doi.org/10.4230/DARTS.12.2.3Editor:
Angeliki KritikakouSeries and Publisher:
Leibniz International Proceedings in Informatics, Schloss Dagstuhl – Leibniz-Zentrum für Informatik
1 Introduction
The rapid proliferation of Internet-of-Things (IoT) devices – often low-powered and under tight energy budgets – necessitates offloading computations and performing remote monitoring and control tasks. However, sending these workloads to traditional, centralized data centers, which may be distant and separated by many network hops, can easily exceed the tight timing constraints of many IoT use cases. Edge computing [23, 24, 39] solves this issue by moving cloud computations to the edge of the network, minimizing the round-trip times between IoT devices and the edge cloud. Because overall latency is a strong concern in edge computing, a sizable body of research focuses on making computing at the edge faster [11, 15] and more predictable [25, 35]. Furthermore, just like other cloud settings, edge clouds are multi-tenant environments, which mandate a strong security posture of the operating systems (OSs) deployed [19, 7]. In such latency- and security-sensitive environments, performance isolation is an important property required to provide clients with meaningful service guarantees. In particular, malicious workloads must not be able to degrade the performance of other applications that run in parallel on the same edge cloud [25].
In this paper, we focus on edge clouds that execute untrusted processes for multiple tenants with high turnover, meaning that processes are frequently spawned and terminated. Workloads that feature short-lived client processes are, for instance, motivated by the emerging desire to run function-as-a-service workloads in edge clouds [22]. Also, in a resource-constrained edge cloud, it is often impractical to load all possible applications concurrently, thus requiring to spawn them on demand [14].
The need to enforce performance isolation on a system with high process turnover implies that the OS must expose predictable execution times for creating and terminating processes. If it takes longer than usual to clean up a process, both its allocated memory and the CPU – busy with cleanup code – are longer unavailable to processes launched subsequently, delaying their start or making their memory allocations fail.
One major factor in the cleanup latency of processes is the reclamation of their main memory pages. Processes that make extensive use of page frame sharing can indirectly create complex data structures in the OS kernel. The complexity and shape of these data structures can strongly influence the time it takes the OS to terminate a process and clean up its artifacts, as illustrated in Figure 1.
The plots highlight in an exemplary way that on both L4Re [10] and Linux, two conceptually fairly different OSs, memory resources may remain unavailable for a long time while the kernel destructs the associated management structures. Memory reclamation is not an instantaneous process but can take quite a long time. Thus, in order to provide availability and performance predictability in edge cloud use cases, we answer the question of how to enforce a limit on the reclamation latency induced by cleaning up main memory pages from user-space processes.
Given the constraints of the edge environment, the predictability of resource reclamation is a yet-understudied subject. There are multiple related works on the general problem of fast and predictable memory allocation and deallocation for page allocators [38] and real-time garbage collectors [4, 12, 6]. However, a cloud environment with processes of mutually distrusting tenants and complex management data structures requires additional considerations beyond predictable page allocations. Despite the need, there is currently no general solution that addresses the predictability of main memory reclamation.
To solve the issue of unpredictable user-space memory reclamation latency, this paper presents Brumm (Bounded Reclamation of User-space Memory Mappings). The key idea is to predict the latency it will later take to reclaim the memory handed out to applications. This allows the system operator to enforce strict limits on this reclamation latency – i.e., a quota – for groups of processes, similar to existing resource budgeting approaches, e.g., for the file descriptor count under Linux. Since the exact latency depends on how memory resources are used and how the management data is structured, Brumm accounts for changes in reclamation latency estimate whenever memory is handed out to processes or shared between them. Note, however, that Brumm is focused on user-space memory; reclamation latency for kernel memory is not within the scope of this paper.
The abstract design of Brumm, accounting for reclamation latency, can be applied to a multitude of OSs. Though, every implementation of Brumm on a specific OS needs to be instantiated with an OS-specific model of memory reclamation latency. This model captures the relation between modes of using memory and the predicted reclamation latency. Thus, Brumm is most applicable to OSs that have a stringently-defined operation for reclaiming individual memory pages. This is commonly the case for microkernel-based OSs that manage page allocations for application memory in user space. For this paper, we implement a prototype of Brumm on the L4Re OS framework [10]. The L4Re microkernel-based OS is a good fit for accomplishing the goals of Brumm. First, L4Re has a clearly defined way of reclaiming user-space memory pages via capability revocation. Second, L4Re is amenable to real-time considerations [13], and recent work on a container engine within the L4Re ecosystem [16] supports the cloud-oriented use case envisioned for Brumm. Because L4Re functions as a case study for the Brumm design, its overall algorithms for managing user-space memory are not altered or improved; the kernel is just extended with Brumm accounting.
In summary, this paper makes contributions by
-
showing the lack of predictability for reclamation latency using existing accounting methods – highlighting the need for the Brumm mechanism,
-
describing Brumm as a design for user-space memory reclamation time accounting,
-
showing a proof-of-concept implementation of Brumm on the L4Re microkernel,
-
including a timing analysis of the individual operations performed during the teardown of memory mappings, and
-
evaluating the accuracy and the overhead of the Brumm accounting prototype.
2 Background and Motivation
This section highlights why accounting for reclamation latency is important for enforcing predictable cleanup times. Existing solutions, which are not based on accounting, fall short in various areas when it comes to thwarting performance attacks: Cloud operators might simply bill clients for any excessive cleanup latency their processes incur on the system. This strategy works for large data centers with a plethora of resources; they can just schedule subsequent processes of other customers onto spare CPU cores or machines. However, edge data centers are far more resource constrained than traditional, centralized data centers [26, 28]. Edge sites do not have the spare CPU and memory resources to compensate for these performance attacks. Another solution might be to limit [8] or entirely disallow [19] complex memory sharing to speed up cleanup latency and improve predictability. However, these mitigations limit the size and complexity of applications, thereby hindering benign use cases that would not result in unpredictable or high reclamation latency. Overall, existing mitigation mechanisms either fail to prevent malicious applications from incurring excessive reclamation latencies or disrupt benign use cases.
Furthermore, existing budgeting mechanisms, for example, for kernel memory usage, are not a good fit for limiting the reclamation latency of user-space memory resources. In the following, we visualize two insights: First, reclamation latency can vary widely depending on an application’s resource-usage characteristics. Second, existing accounting techniques are not sufficient to model the latency of user memory reclamation. Processes can use memory (mappings) in a variety of ways, for example, in large chunks, as individual pages, or with extensive sharing. All these usages result in different latencies for memory reclamation. In particular, this latency is not simply proportional to the amount of allocated memory.
2.1 A Primer on L4Re
To understand these different ways of using user memory, this section takes a closer look at the architecture of the OS used throughout this paper. The L4Re microkernel, running in the privileged CPU mode, implements only the minimal set of mechanisms that are required to support applications and services in user mode. The core abstractions that the kernel provides are kernel objects and memory mappings. Kernel objects [10] are abstractions for interacting with the system, such as IPC gates for inter-process communication, semaphores and interrupts for coordination, factories for limiting the usage of kernel memory, and threads and tasks for process management. Applications can only interact with kernel objects via capabilities in their local capability space. Process on the left side of Figure 2 highlights that the capability space is simply a per-task list of capabilities inside the kernel – analogous to the file descriptor table in Linux.
User-space applications index this table in system calls via capability selectors as shown on the bottom left of the figure. Capabilities to kernel objects can also be shared with other applications, for example, to allow two applications to use a shared semaphore for coordination.
For this paper, memory mappings are particularly relevant. On the architectural side, a mapping is simply the insertion of a physical frame’s address into a page table, making the frame’s memory accessible to a process. Memory mappings are ubiquitously used in L4Re, for example, for loading the binary of new processes into their address space, for providing anonymous memory, or for fast shared memory communication. Memory management is handled in user space following a capability-based permission management – similar to the capabilities for kernel objects. To this end, processes gain access to pages of main memory as part of a capability exchange. For example, processes commonly allocate anonymous memory pages for their heap by requesting them from a memory service via inter-process communication (IPC). This memory service has a lot of free, unused memory pages mapped into its own address space. It can then reply to the IPC inquiry by sending a capability referring to one of its own, unused memory pages.
The operation of sharing such a page mapping, map, is depicted in the center of Figure 2 – process maps a page referring to frame 0xE from its own address space into the page table of . This mapping operation is realized by the kernel via two actions. First, the kernel inserts an entry referring to frame 0xE into the page table of . Second, the kernel records the new mapping of the page frame in the mapping database. This database is depicted on the right side of Figure 2. The kernel records the new mapping (in the address space of ) as a child node of the source mapping (in the address space of ). The derivation relations between these nodes form the derivation tree, which is stored in the mapping database for each frame in L4Re. In Figure 2, the nodes , , and form the capability derivation tree for the frame 0xE. Thus, the mapping database remembers who mapped which page to whom; even when shares a page frame with itself. This record keeping is essential so that applications can reclaim memory they have shared with others and then reuse it safely. For example, process can instruct the kernel to remove all page mappings derived from using the unmap system call. The kernel then uses the mapping database to recursively remove the mappings and from – a mechanism known as capability revocation; importantly, does not need to explicitly enumerate or even know about . User-space memory managers can use this recursive unmapping to implement demand paging and to ensure that memory is returned on process termination. However, the kernel also needs to clean up the associated management structures when reclaiming memory. The thereby induced latency is the primary subject for the Brumm accounting mechanism.
2.2 Problem Analysis
This section examines the question: Can an existing accounting mechanism function as a proxy for reclamation latency enforcement? Stated differently: Does a system operator need the explicit reclamation latency accounting of Brumm or could they instead set a budget for a different resource while limiting reclamation latency just as accurately? Take kernel memory accounting as an example: Limiting the amount of kernel memory a process can use also limits the number of memory mappings a process can create. Every entry in the mapping database and every new frame for the page table requires kernel memory. Thus, setting a budget for kernel memory usage does, ultimately, also limit memory mapping reclamation latency. However, this accounting metric is neither accurate nor sufficient.
To show that existing budgeting metrics are not accurate, we compare two microbenchmarks. These benchmarks measure the latency of the unmap system call in two antipodal settings:
-
“Single Frame”: In the first benchmark, the same page is mapped to many locations in the same address space, creating a very wide subtree of depth one in the mapping database. Notably, only a single frame is referenced and so only a single frame of user-space memory is used.
-
“Many Frames”: The second benchmark allocates many frames of user-space memory. Each frame is mapped only once, creating a single new entry in the mapping database of each frame. In contrast to the first benchmark, there are many, small subtrees in the mapping databases that need to be considered during the unmap system call.
The problem analysis considers four different budgeting metrics: the preparation time of the benchmark, the number of mapping system calls performed during the preparation phase, the amount of kernel memory taken up by the benchmark application, and the usage of user-space memory frames. Using the kernel memory metric as an example, a benchmark run looks as follows: First, the benchmark application measures the current kernel memory utilization. Then, in the preparation phase, it creates many memory mappings using either the “Single Frame” or the “Many Frames” benchmark – varying the number of memory mappings from run to run. Afterwards, the application measures the kernel memory usage again. Finally, the created memory mappings are unmapped and the latency of this system call, the reclamation latency, is measured.
Figure 3 shows four scatter plots: They compare the reclamation latency of benchmark runs with the four accounting metrics.
Considering the upper-left plot of Figure 3, the “Many Frames” benchmark takes consistently longer to reclaim than the “Single Frame” benchmark when looking at data points with the same preparation time. The ratio between reclamation latency and preparation time is for the “Single Frame” benchmark, compared to for “Many Frames”. The same relationship emerges when plotting against the number of system calls. The “Many Frames” benchmark has again a higher ratio with reclamation latency cycles per system call performed during preparation – compared to the ratio of for the other benchmark. The third accounting metric, kernel memory, shows similar behavior. Reclaiming memory mappings that take up around MiB of kernel memory in the “Single Frame” benchmark only takes cycles. When the mappings are prepared like in the second benchmark, reclamation takes far longer – cycles – even though the same MiB of kernel memory are used for the mapping structures. Unsurprisingly, the benchmarks look even more different when considering the user memory usage. By its construction, the “Single Frame” benchmark only uses a single frame of user memory but creates many mappings for it. These mappings need considerable time to be reclaimed. Because user memory accounting cannot detect excessive usage of memory mappings, it is fundamentally not viable for predicting reclamation latency. But also the other three accounting metrics do not accurately predict reclamation latency as is highlighted by how vastly different the two benchmarks behave in the plots of Figure 3.
There are additional, practical considerations that rule out the use of preparation time and kernel memory utilization as proxies for reclamation latency. Limiting the preparation time, i.e., the runtime of customer workloads on an edge cloud, just to prevent maliciously high reclamation latency is not a justifiable trade off. This would rule out any occasional long-running services from the outset; this is not practical. Kernel memory accounting is also problematic because it does not follow the mapping derivation tree. If a subordinate process shares memory with some unrelated process, such as a shared network service, the mapping database entries for the shared mappings are not accounted to the kernel memory quota of the subordinate process. Instead, they are accounted towards the shared service. Kernel memory accounting is not aware of the recursive nature of memory mapping inheritance. Furthermore, kernel memory is not only used for memory mappings but for all kinds of kernel-internal state. Thus, heavily restricting kernel memory budgets to limit reclamation latency can also prevent benign processes from creating large kernel objects such as thread objects. We argue that Brumm is the only accounting solution for reclamation latency that does not unduly restrict benign resource allocations; it predicts and accounts for memory reclamation latency explicitly.
3 Design
This section describes the high-level design of Brumm and how it accounts for the reclamation latency of memory mappings.
3.1 Changes to the Operating System
Motivated by the edge cloud use case, we assume a system setup with a central controller process that spawns and terminates applications – shown in the top left of Figure 4.
The spawned applications need main memory to store data and operate on. This memory is provided by a memory service that holds the available page frames in the system and manages page allocations for the applications. On Linux, the memory management is integrated into the monolithic kernel [31]. In contrast, the memory service is a separate user-space process in L4Re [10], like it is in many other microkernel systems [27, 2, 17, 18]. The memory service provides applications with pages of anonymous memory. These pages need to be accessible from the application’s address space. The kernel performs these necessary mapping operations and the included page table management as seen on the right side of Figure 4. These operations involve the kernel managing state objects that take up kernel memory. Applications might even share pages with other processes in the system, resulting in more state that the kernel has to manage. All of the memory service’s and kernel’s state describing the page allocations has to be eventually cleaned up.
For our design of Brumm, reclamation starts when the controller instructs the memory service to reclaim all pages handed out to one of its child applications111Because our Brumm design is only concerned with user-space memory reclamation, we do not examine the deletion of kernel objects referenced by the child. The reclamation of kernel objects is an interesting future topic but orthogonal to the analysis of memory mappings in this paper. – shown on the left of Figure 4. The memory service enumerates all allocations that belong to the child and then instructs the kernel to unmap all these pages from the child’s address space. If the child has granted other processes access to these pages via mapping operations, the kernel will recursively revoke these page mappings too. For this, the kernel consults its mapping information database. The memory service can therefore be sure that no process can access the reclaimed memory and it is safe to reuse. Figure 4 depicts an example of a derived memory mapping, “Mapping ”. All these cleanup steps need to be accounted for in Brumm.
To implement the accounting, the controller needs to create a kind of budget object that denotes the limit for the reclamation latency of the memory handed out to child applications. This concept of an accounting structure is similar to Linux cgroups [30] and L4Re factories [10]. Like with these existing techniques, the quota object is stored inside the kernel and created by the controller. To limit the reclamation latency, accounting is done in advance. Whenever the memory service or the kernel create a state object for managing memory allocations, the expected cleanup time is accounted towards a quota object. Regardless of the OS, the primary state objects to consider are the allocation state in the memory service and the mapping and page-table information inside the kernel. Brumm requires an OS-specific model that links state allocations to expected cleanup times. In the implementation section we derive such a model for the L4Re microkernel. For our Brumm mechanism, we assume that any allocation of state objects increases the future reclamation latency; thus, our model behaves monotonically. Furthermore, we rule out any external influence on the reclamation latency. Changes on one side of the overall system state must not prolong the reclamation of unrelated, accounted memory mappings. In our prototypical implementation, this requires some caution in memory allocation as later discussed in Section 6.1.
Putting it all together, the operation flow using Brumm is shown in Figure 4. The controller creates a new quota object with a limited reclamation latency budget before spawning a new subordinate process group. The memory service is responsible for providing the new processes with main memory. The controller instructs the memory service to only allocate and hand out memory under the governance of the child’s reclamation quota. Any changes to the memory subsystem regarding the child will be accounted towards the quota object. This includes, for example, the expected reclamation latency of “Mapping ”. Should an operation, like creating a shared mapping between processes, exhaust the quota, the kernel will deny the offending operation. This makes sure that the budgets in the Brumm design can reliably set limits to the reclamation latency for main memory even when applications misbehave. This prevents unexpectedly long cleanup operations that keep the OS busy.
3.2 Integration by the System Designer
The first step in deploying Brumm is to obtain reliable estimates of the time spent on individual sub-operations in the kernel and the memory service during reclamation of given-out user memory. We call this the profiling phase of Brumm. Once these per-operation latencies are known, the Brumm quota subsystem is configured to use these values when accounting against reclamation latency quotas.
Estimating latencies in the profiling phase is not straightforward. The runtime of sub-operations can vary drastically across executions depending on the hardware state; for example, differences in CPU caches can result in different execution times. We rely on measurement-based timing analysis [36] for our prototype. Brumm can simply use the mean execution time – determined by measurement on the target system – for all sub-operation latency estimates. Alternatively, designers may apply a static worst-case execution time analysis to the kernel and memory service source code to arrive at an upper bound for the execution time of every sub-operation. Similarly, the system designer could empirically determine tail latency estimates for every sub-operation in the kernel’s memory subsystem. However, using worst-case estimates for the individual sub-operations is likely too pessimistic. The Brumm quota mechanism aggregates latency estimates. It is extremely unlikely that all sub-operations in a long memory unmapping operation execute exceptionally slow. Thus, using the mean estimate for all operations is likely sufficient for cloud use cases.
After the profiling phase, the designer profiles actual, realistic workloads. In the edge cloud scenario, these workloads could be containers with web servers or databases. The system designer uses the quota system of Brumm to monitor the peak consumption of the reclamation latency budget. The measured peaks give a realistic baseline of “benign” reclamation latencies – values that should already be acceptable for the higher-level scheduling and billing policies of the cloud operator.
Armed with this baseline, the controller process can set a hard reclamation latency budget for each subordinate process group. The budget is chosen as the observed maximum latency plus a modest safety margin to absorb occasional variations. From this point on, the kernel checks any attempt by a child process to allocate additional state in the memory subsystem against the remaining quota. If the operation will cause the estimated reclamation latency to exceed the allotted budget, the kernel denies the request.
In other words, Brumm introduces a completely independent budget that accounts for the expected time needed to clean up an application’s memory. This budget is enforced regardless of the current availability of other resources, guaranteeing that the system can always reclaim memory within the prescribed latency bound. System designers can therefore reason about isolation and predictability at the level of reclamation latency, shielding against any rough, malicious application that uses the memory management subsystem to threaten system availability.
3.3 Adopting BRUMM to a New Platform
We want to reflect on the effort required to adopt Brumm to a new platform. We differentiate two kinds of platform changes: a different OS and a different hardware configuration. Adopting Brumm for a new OS requires manual code analysis and implementation effort. Developers have to identify the source code locations that contribute to the reclamation latency of memory mappings. For microkernels, this is commonly the code path handling capability revocation. Developers may need to extend the OS’s performance tracing to measure the latency of all the sub-operations along the reclamation code path. Furthermore, developers must implement the reclamation latency accounting in the code that handles allocating memory and creating corresponding page mappings.
With all these code changes at hand, adopting the implementation to a new hardware configuration such as a different architecture or different CPU is rather straightforward and can be automated. The system integrator needs to execute the profiling phase – as discussed in the previous section – to measure the latency of the individual sub-operations in the reclamation code path. These measured latencies are then used to configure the Brumm accounting for the OS installation. We imagine that this step can easily be automated and performed at boot time whenever the system’s hardware configuration has changed. For the prototype discussed in the section below, we did not yet implement this automation step.
4 Implementation
We implement the Brumm design in the L4Re microkernel-based OS while closely following the microkernel’s way of managing user-space memory – see Section 2.1. The current implementation of Brumm focuses on the kernel, enabling the reclamation latency accounting there.
4.1 The Memory Unmap Path
The first step in predicting reclamation latency is to understand how that latency is composed. A significant amount of this time is spent outside the kernel in the controller and in the memory service, which initiates reclamation after receiving a signal, which, for example, can be due to a cloud client exceeding its compute-time budget. Because the current prototype does not target a precise use case, we deliberately omit this external overhead and focus on the kernel-internal management structures.
When the controller decides that a child’s memory must be reclaimed, the memory service eventually issues an unmap request to the kernel. Figure 5 illustrates the anatomy of this unmap system call.
The request begins with a system-call entry ; the time spent in this transition is denoted by . Through the system call, the service supplies a virtual address range that it wishes to unmap. Consequently, the kernel’s unmap logic has to walk the process’s page table in order to enumerate every page/mapping that falls within the specified range. We call the set of these pages . For each page the kernel must locate the corresponding entry in the global mapping database . We denote the time required for such a lookup . All mappings that are derived from the pages contained in range must be removed not only from the child itself but also from any other processes that inherited access rights to these page frames. Thus, once a mapping entry for page has been found, the kernel proceeds to traverse the subtree of descendants in the mapping database. We denote the set of all descendants of as . The data layout of the mapping database is only logically a tree but physically a depth-first linked list; this is visualized by the two different arrow styles in Figure 5. Thus, all descendants of lie in a linear list structure. Brumm does not need to consider the hierarchical, logical structure of the database for estimating reclamation latency. As shown by the two orange boxes in the center of the figure, the traversal is performed twice: first to delete the page-table entries in each descendant’s address space ( per descendant) and second to erase the corresponding records from the mapping database ( per descendant) . The time needed to leave the kernel again and return back to the memory service is also accounted towards .
Summing the contributions of all pages in the range yields the overall unmap latency
| (1) |
which captures the essential components that Brumm must account for when estimating reclamation time. This formula also highlights why simply counting the total number of mapping database entries – – does not result in an accurate accounting. Looking up a mapping under question for a particular frame in the mapping database takes a bit of time (), but the kernel can then walk the derivation subtree below this mapping without performing lookups again. This is also the major factor why the “Single Frame” and “Many Frames” benchmarks behave differently in Section 2.2. Thus, we will make sure to specifically account for the lookup latency in the following implementation.
4.2 Implementing BRUMM
The prototypical implementation of Brumm is currently confined to the core kernel mechanisms: At present, there is no dedicated controller process nor a special memory service. Nevertheless, all of the kernel-side building blocks required for a functional prototype have been realized and they are already being exercised in the measurements presented later in the paper. These implemented building blocks include the tracing of sub-operations, the kernel-internal reclamation latency accounting, and the corresponding user-space-facing quota API via system calls.
Central to the current implementation is a new kernel object for accounting the estimated reclamation latency – see the right box in Figure 6.
User-space processes are able to create an instance of this quota object; in the proposed Brumm design, the creator would be the controller process. The kernel initializes the object’s remaining_quota with the desired reclamation latency budget. The creator process receives a capability to the new object. When a process maps a region of memory into another process it may also specify the capability to a quota object. If such a capability is given, the kernel automatically attributes the expected reclamation latency of the newly created mapping to the remaining quota stored in the quota object. In a final system, this step would be performed by the memory service on behalf of the controller, either eagerly during the IPC that requests the memory mapping or lazily when the mapping is established as a result of page-fault handling.
Internally, the kernel links the child’s mapping entry, which is inserted into the global mapping database, to the quota object. At the same time, the kernel deducts the estimated costs of the lookup operation () as well as the page-table update and mapping-database removal costs ( and ) from the remaining_quota. Whenever later a descendant mapping is created for a mapping that already references a quota object, the kernel again subtracts and in anticipation of the future traversal of the mapping database. Importantly, the kernel does not subtract : The lookup operation is only considered for the first mapping in a quota-accounted subtree, which is reflected by is_first in the Mapping class – see Figure 6. Conversely, when a mapping is removed, the previously reserved quota is returned to the quota object, thereby restoring the budget for subsequent operations.
The system call overhead () cannot be accounted from inside the kernel. Because the memory service performs allocation management in user space, only it knows how many individual system calls will be required to unmap all allocations belonging to a child process. Following the microkernel principle, the L4Re kernel has no knowledge of the semantic meaning of mappings in virtual address spaces. It only implements the mechanism of mapping frames into page tables.
When the controller instructs the memory service to reclaim a child’s memory, the service first initiates deletion of the quota object. This deletion request does not immediately free the quota – because kernel objects may still hold references to it – but it locks (is_locked) the object; no further allocations can consume the budget while reclamation proceeds. After the lock is in place, the memory service issues the unmap system call; the kernel’s accounting guarantees that the unmap will complete within the specified reclamation time budget.
The numerical values for (lookup_cost in Figure 6) and the combined (mapdb_cost) are not hard-coded in the kernel. Instead, they are supplied by the controller at the moment the quota object is created. Because the parameters are set at run time, system designers can experiment with different latency models, update the values on the fly, and run multiple varieties of tests without recompiling the kernel or rebooting the system.
5 Evaluation
The evaluation of the Brumm implementation consists of three parts. First, we need to find appropriate values for , , , and . Then, we show how accurate the Brumm implementation can estimate the reclamation latency of various unmap operations. This is essential for enforcing a maximum reclamation time bound reliably. Finally, we measure the overhead that all the additional accounting logic in the kernel induces in system operations.
5.1 Benchmark Setup
All measurements are performed on a dual-socket server featuring two Intel Xeon Platinum 8358 CPUs (32 cores per CPU) and GiB of main memory. We disabled both simultaneous multithreading (Hyper-Threading) and temporary overclocking (Turbo Boost). Furthermore, the benchmarks set the CPU’s pstate configuration to the maximum-performance mode. The kernel is configured to support a multi-core system. However, we mainly look at single-core benchmarks for this evaluation; most benchmarks are executed on a single CPU core. The general idea of Brumm is nevertheless extensible to multi-core systems as we argue in Section 6.2. All benchmarks in this section are using the x86 time stamp counter for measuring latencies. The depicted latency values are thus given in reference clock cycles which are proportional to wall-clock time.
Throughout this section, we will use a deliberately artificial benchmark to assess the latency of kernel operations involving memory mappings. This “Random Map” benchmark starts out with a contiguous range of pages within a single address space. Starting from this base range, the benchmark recursively creates child mappings in the same address space forming an inheritance tree of page mappings for each frame in the base range. The number of child mappings to create is randomized; thus, the kernel’s mapping databases will look quite chaotic with mapping hierarchies of random width and depth. After this setup phase, the benchmark uses the unmap system call on the base range to trigger a recursive reclamation of all the memory mappings. By exercising a wide variety of mapping configurations, the benchmark is able to expose a wide spectrum of sub-operations that occur during an unmap system call, including slower paths.
5.2 Latency Analysis
To obtain the kernel-side latency estimates required by Brumm, we must first determine the latencies of the individual kernel operations that are subtracted from the reclamation-latency quota: the system-call overhead (), the mapping-lookup cost (), the page-table update cost (), and the mapping-database removal cost (). In principle, these values could be derived by means of static timing analysis, yielding a worst-case execution time (WCET) for a given hardware platform. In practice however, no ready-to-use workflow exists for performing WCET analysis on the L4Re microkernel running on x86 systems; developing such workflows is out of scope for this work. Consequently, we resort to a straightforward measurement-based timing analysis [36]. By measuring the actual execution on real hardware, we can obtain average or tail latency figures that are sufficient for the non-hard-real-time scenarios we target – namely workloads in edge clouds. This approach is also common in industry, where measurement-based timing analysis is frequently employed to estimate worst-case system behavior [1]. Because the choice of timing-analysis technique is orthogonal to the Brumm design, future work could replace the empirical values with statically-derived WCET numbers without affecting the rest of the mechanism.
The individual latency numbers are measured as follows. The component is obtained by timing a no-operation unmap system call; this captures the full round-trip latency from user space into the kernel and back. The remaining three components – , , and – are measured using in-kernel trace points during the “Random Map” benchmark. Before and after each lookup, each page-table manipulation, and each mapping-database operation, the kernel writes a timestamp into its trace buffer. After the benchmark finishes, the buffer is extracted and the timestamps are post-processed to yield the individual latency values.
The benchmark results are depicted in Figure 7, which shows one plot for each of the latency values to estimate.
The plots contain cumulative distribution functions for the measured latencies in reference clock cycles. In the top-left plot, nearly all of the measured values for the no-operation unmap system call are close to the mean latency of cycles and the 99th percentile of cycles. There is an outlier at cycles, showing that a system call can occasionally take times longer than the mean. The plot for shows a larger variance. While the mean is at a low cycles, the percentile value is at cycles. The other two plots for and show a similarly high variance with mean values at cycles/ cycles and 99th percentiles at cycles/ cycles, respectively. We suspect that the severe outliers are mainly due to the complex x86 architecture with its speculative mispredictions, cache misses, device interrupts, and firmware executions. Furthermore, the periodic timer interrupts of the L4Re scheduler can occasionally delay benchmark executions. Nevertheless, we can deduce mean and tail-latency estimates from these measurements to make reclamation latency predictions.
5.3 Accuracy Assessment
To evaluate how well the Brumm accounting mechanism can predict the reclamation latency of a memory unmap operation, we again use the “Random Map” benchmark. This time, we use the reclamation-quota object that we added to the kernel in Section 4.2. This object records the two values required for the estimation: the number of pages that belong to the unmap request () and the total number of descendant mappings that have to be processed (). With these values at hand, we can apply Equation 1 to compute a prediction for the total latency of this exact unmap system call. At the same time, we also measure the real unmap latency from the moment the benchmark program issues the unmap system call until the kernel returns control to user space. Thus, each benchmark run records the predicted and measured latency values.
The benchmark results are plotted on the left of Figure 8.
Each individual experiment appears as three dots (one real measurement and two predictions); the horizontal axis orders the points by increasing measured latency, while the vertical axis shows the corresponding latency values (both for predicted and for measured latency). For every benchmark run, we display two predictions: one obtained by inserting the average values of the four sub-operation latencies (, , , and ) shown in Figure 7, and another that uses the tail latency (99th-percentile) values of the same distributions. The predictions are plotted with the same x-coordinate as the measured value to which they refer.
As anticipated, the tail-latency-based prediction systematically overshoots the actual execution time. For example, the rightmost datapoints of the left plot yield a latency overestimation of times (71 versus 277 million cycles). This pessimism would be undesirable for the cloud-oriented scenario that motivated Brumm, where overly conservative budgets could restrict benign edge workloads unduly. Even the prediction based on average component latencies exhibits a noticeable overestimation, although the difference is considerably smaller than with the tail latency model. The predicted latency using the mean – again for the rightmost datapoints – is about 114 million cycles ( % over the measured latency). To connect back to the problem analysis (Section 2.2), we also perform measurements using the “Single Frame” and “Many Frames” benchmarks. These benchmarks – on the right side of Figure 8 – show similar results.
We attribute the residual overestimation – even for the mean predictions – primarily to the measurement methodology used for obtaining the sub-operation latencies. During the latency analysis the kernel wrote timestamps into the trace buffer, which increased the execution time of the sub-operations. Consequently, the values fed into the model are larger than the true costs that are incurred when the kernel runs without tracing. If the evaluation were repeated on a platform that is amenable to static timing analysis without measurements, these artifacts might disappear and the predictions would become tighter.
Despite the systematic bias, the average-based prediction is meaningful: It provides a consistent overestimation that stays within the same order of magnitude as the real reclamation latency. This property enables a controller to allocate a reclamation time budget that is safe (i.e., never exceeded) while still being realistic enough to avoid limiting cloud tenants.
5.4 Performance Overhead
The reclamation latency budgeting introduced by the Brumm implementation inevitably influences the performance of both mapping and unmapping operations. In order to keep track of the budget, the kernel must execute a few extra instructions each time a mapping is created or destroyed: The kernel’s logic accesses the quota object, changes its reference count, and updates the bookkeeping field remaining_quota. Moreover, the code path now contains additional conditional branches that decide whether quota accounting is required for a particular mapping. Even when a process does not make use of reclamation quotas, the execution still traverses these branches, which adds a small amount of latency.
To quantify this impact, we evaluate the three distinct configurations
-
“Disabled” – the accounting code is completely removed for the kernel at compile time,
-
“Available” – the kernel contains the accounting code, but the benchmarks do not use any quota objects, and
-
“Used” – the benchmarks actually instruct the kernel to perform reclamation budget accounting for the mappings touched in the tested system calls.
We first measure the latency of simple mapping and unmapping system calls using the “Random Map” benchmark. The map system call, inherently, touches only a single entry in the mapping database and updates a single, corresponding page-table entry. To capture simple unmapping system calls, we alter the “Random Map” benchmark to delete memory mappings starting from the leaves of the mapping hierarchy. Thus, no recursive reclamation is ever triggered and only a single mapping is removed at a time. The results, visualized as box plots in Figure 9, show only little performance loss.
The y-axes encode the configuration and the measured latencies on the x-axes are nearly the same in all configurations. More precisely, the median latencies of mapping a single page in the “Disabled” and the “Used” setting are not too far from each other – cycles versus cycles (). For unmapping only a single page with no children in the inheritance tree (a leaf), the latencies in both settings are even closer – cycles versus cycles (). This is likely due to the high overhead of the system call and kernel entry itself in all configurations. The few additional branches and the fast quota object manipulations therefore do not severely affect the latency of these simple system calls.
The situation changes when we again consider the unmodified “Random Map” benchmark with its large, recursive unmap operation. For each mapping configuration, we execute the unmap system call thrice – once for each kernel configuration. The latency values are sorted according to the “Disabled” measurement so that each triple of points can be compared directly. As shown in Figure 10, an overhead is only observed when the quota mechanism is actually employed.
As an example, we have a look at the values at index . While the “Disabled” (55 million cycles) and the “Available” (57 million cycles) system call latencies are close, the “Used” setting results in a % higher latency of 71 million cycles. In the latter configuration, the kernel must perform reference count updates on the quota object and adjust the stored quota for every descendant mapping that is traversed, which explains the increase in latency compared with the other two settings. In contrast to the overhead results above, the latency of the kernel entry and exit becomes negligible for these long system calls. We also still see some additional potential for filigree optimizations, for example, by aggregating updates to the quota object, which happen in rapid successions for large, accounted mapping database subtrees.
The latency estimation of our Brumm implementation is currently only designed to be used in single-core scenarios; thus, accounting might not be as accurate on multi-core systems. Nevertheless, we evaluate the performance implications of the current implementation on multi-core systems. We adapted the “Single Frame” benchmark to a multi-core scenario in two variants: First, we designed the “Independent” benchmark. It splits the “Single Frame” benchmark among multiple processes and uses a different memory frame for each process. Thus, we expect only little sharing among these processes. In contrast, the “Shared” benchmark executes multiple instances of the “Single Frame” benchmark on threads of the same process and uses the same physical frame for all memory mappings. All benchmarks first perform memory mapping system calls and then a single unmap on the created mapping data structure. The combined latency of these two phases is measured and shown in Figure 11.
The single-core overhead of accounting follows the trend of Figure 10. Splitting the workload among multiple cores with little sharing in the “Independent” setting results in a longer execution time. This is likely due to some residual sharing in the mapping database design of the L4Re microkernel. Using the Brumm accounting in this multi-core benchmark results in an overhead partially due to atomic operations on the shared quota. The plot on the right (“Shared”) shows that sharing a lot of state in a multi-core setting drastically reduces performance. The performance is further reduced when compiling the Brumm implementation into the kernel. This might be due to increases in code and data structure sizes of the kernel.
Although mapping operations in the kernel are slower for the modified L4Re sources, we think that the overhead introduced by reclamation budget accounting is tolerable given the strong guarantees it provides towards bounded memory reclamation latency.
6 Discussion
This section discusses the limitations and the extensibility of the Brumm design and implementation. We had to make some assumptions about the setup of our Brumm-enabled L4Re system to work around some predictability challenges in the kernel’s design. Moreover, we look at further steps that are required to lift the current Brumm prototype to properly support multi-core systems. Lastly, we discuss the transferability of the Brumm design idea to other OSs.
6.1 Limitations
A first limitation concerns the cost of locating a particular entry in the kernel’s mapping database based on its virtual address in the address space. In L4Re, this database is organized as a depth-first linked list of mappings that reflects the inheritance tree of a frame. Consequently, the time required to find a mapping () is not necessarily constant: It grows with the number of entries that precede the target mapping in the list – not only its depth in the inheritance tree. For the purpose of estimating unmap system call latency, we therefore made a simplifying assumption: Every accounted mapping resides at a fixed inheritance depth and no ancestor has any other child. This assumption is reasonable for the isolated process group scenarios that motivate our work; the memory manager can enforce this requirement by issuing mappings only from a predetermined depth in the inheritance hierarchy of each frame.
The assumption does impose a restriction on how the memory service may hand out mappings. If the service were to allocate the same physical frame to several process groups, e.g., to share a library or a zero page, then the inheritance tree would contain multiple top-level siblings and the lookup cost would no longer be constant. Future work can address this issue in two ways: An ad-hoc solution that avoids performance interference is to eagerly copy shared resources into distinct frames for each group – thereby preserving the constant-time lookup property. A more general solution has to implement a constant- or logarithmic-time lookup from a page-table entry to the corresponding mapping-database entry (e.g., by employing a maple tree in a similar way like Linux uses for virtual memory area lookups [32]).
A second limitation arises from the locking discipline employed by L4Re’s mapping database. When a frame’s mapping tree is traversed or modified, the kernel holds a lock on that specific tree. Consequently, an unmap request issued by the memory allocator may have to wait for another process that currently holds the lock to finish its operation. The waiting time, fortunately, is bounded: The lock-holding thread performs at most one operation per mapping-database entry and the total number of entries it may touch is already accounted for in the reclamation quota. Hence, any additional latency introduced by a locked frame is proportional to the reclamation budget that has already been granted to the process group. Assuming that the memory allocator has the higher scheduling priority, the unmap system call of the memory allocator should continue right after the lock is released by the offending application. In future extensions, Brumm could explicitly model these lock-induced delays by analyzing the code paths that may retain a frame lock and adding the corresponding worst-case latencies to the reclamation time estimate.
Finally, a production-grade implementation would also have to account for the overhead incurred by the controller that initiates reclamation and by the memory allocator that finally frees the reclaimed pages from its internal data structures. These costs are highly dependent on the concrete use case (e.g., the size of the allocator’s bookkeeping structures or the communication mechanism between the controller and the memory service). We therefore omitted these latencies from the prototype evaluation. We leave a systematic treatment of these additional latencies to future work, as they do not affect the fundamental feasibility of bounded user-space memory reclamation demonstrated by Brumm.
6.2 Multi-Core Support
The general idea and most of the implementation of Brumm is already applicable to multi-core use cases. We can already support application threads running and using the reclamation latency accounting in the kernel’s memory subsystem on multiple cores in parallel, as shown by our multi-core overhead benchmarks in Section 5.4. The quota object already uses atomic instructions at the appropriate places. We generally assume that only a single thread is doing the cleanup as it is already inherent by the unmap system call of the L4Re microkernel. Because the Brumm quota object supports locking (see Section 4.2), it cannot happen that the quota is used by an application for new mapping database entries while a reclamation/unmap operation by the memory service is in progress. However, there are still some specifics that need to be considered when assessing the sub-operation latencies for the quota predictions. Importantly, inter-CPU translation lookaside buffer (TLB) shootdowns are rather slow [34] and can drastically increase the latency of an unmap system call. These shootdowns – and the associated inter-processor interrupts – are required after removing page table entries to ensure that no TLB on any involved CPU still has stale entries for these page translations. Thus, future work on the Brumm implementation will have to consider the worst case for TLB shootdowns: How long could a full TLB shootdown take that is performed on all CPUs that the to-be-reclaimed memory was used on? Overall, there is still some work to be done on the side of latency predictions and performance evaluation to fully support multi-core workloads. Nevertheless, our approach is clearly applicable to multiprocessing systems.
6.3 Applicability to Other Operating Systems
The capability system of the seL4 microkernel [9] is comparable to the one of L4Re. Both have capability derivation trees, i.e., they support delegation and inheritance, for access permissions to page frames [33]. It should be possible to implement the design of Brumm analogously in the seL4 microkernel. seL4 would even allow us to elevate the Brumm design to a more generic kind of memory resource: untyped memory. This kind of kernel object represents main memory, which the system can split, use for kernel objects, or utilize in user space. Implementing a reclamation latency budgeting mechanism for untyped memory would yield predictable cleanup times for all kinds of memory usage in the system. However, the implementation of an accounting system would likely be far more involved because untyped memory can hold all kinds of kernel objects present in an seL4 system. Furthermore, a Brumm implementation on seL4 could make use of existing work on statically analyzing the WCET of kernel operations [5]. This could help to find guaranteed WCET bounds for the sub-operations in the memory reclamation path of the kernel.
Brumm is less applicable to the monolithic Linux kernel. Linux has no capability system for applications’ memory; i.e., it is not possible to recursively revoke handed-out shared memory in Linux. The ownership of memory pages is not clearly defined in Linux: For example, the decision which cgroup is charged for memory shared between multiple cgroups is in-deterministic [30]. In general, Linux does not provide a mechanism to reclaim mappings of individual physical frames as many microkernel do. Instead, Linux relies on the out-of-memory (OOM) killer to terminate processes that hold on to memory. Thus, one possible way to reclaim handed-out anonymous memory is to terminate a subordinate process group, for example, by terminating a whole PID namespace [29] or relying on the cgroup’s OOM killer [30]. Instead of focusing on user-space memory reclamation like in Brumm, one should instead perform reclamation latency accounting for the termination of entire process groups. This is similar to the design idea of our prior work [21], i.e., considering the cleanup latency of all kernel objects, which we realized on the M3 microkernel [3]. However, implementing such an all-encompassing reclamation accounting in the large, monolithic Linux kernel is presumably very invasive.
Overall, the idea of Brumm is most applicable to kernels with memory capabilities or hierarchical memory mapping databases as reclamation latency accounting can follow these data structures. Nevertheless, the more general concept of reclamation latency budgeting for cleanup operations is universally applicable as long as there is any form of resource grouping, such as capability derivation subtrees or cgroups.
7 Related Work
To the best of our knowledge, only our prior work [21] provides reclamation latency accounting that is comparable to the mechanism discussed in this paper. Nevertheless, several other existing ideas are closely related and help to contextualize our contribution.
In our prior work [21], we discuss the problem of bounded resource reclamation primarily for kernel memory. The key idea of this work is to group applications in reclamation groups and predict the time it will take to clean up all kernel objects related to such groups – primarily when the subordinate processes are terminated. In contrast, Brumm specifically considers the reclamation of user-space memory by revoking page mappings. In our earlier work, we only regard semaphore kernel objects; a consideration of user-space memory capabilities is noticeably missing. The paper also does not implement or evaluate any accounting logic but rather focuses on the performance improvements through the employed arena allocator. The evaluation in Section 5, instead, realizes an estimation of reclamation latency by considering sub-operation timings. Thus, we complement and extend the ideas of our previous research and think that a future combination of both approaches could capture even more aspects of reclamation latency accounting and performance improvements.
One related work that tackles performance interference from a very different angle is the S3K partitioning kernel [8]. It focuses on eliminating microarchitectural side channels that can arise from sharing kernel data structures. To achieve this, scheduling time is promoted to a first-class capability that can be delegated and later revoked. All system calls are required to execute in constant time. Consequently, every operation involved in capability management must have a bounded worst-case execution time. S3K enforces this by fixing the size of the capability derivation tree; the latency of any operation, including revocation, is therefore bounded by this predetermined size. However, the size of any subtree under a derived child capability has to be decided at derivation time – statically partitioning the size of subtrees. This makes the approach less flexible than Brumm. In Brumm, the reclamation time budget is global to a process group, allowing different derivation subtrees to grow without a priori size limits as long as the overall budget is respected. Moreover, S3K targets embedded RISC-V platforms that lack paging support, whereas our L4Re-based implementation runs on x86 systems and is intended to handle cloud-type workloads.
Löser et al. [13] present a work that explicitly addresses memory reclamation in a real-time setting. The authors argue for reclaiming page mappings in the context of inter-process communication. Their design follows a producer-consumer model in which the two processes exchange data through shared memory mappings. If the consumer fails to consume the data in time, the producer may forcibly reclaim the memory by removing the pages from the consumer’s address space; the consumer detects this via page faults. Brumm could enhance this technique by providing a way to enforce explicit limits on the reclamation latency of those shared mappings, thereby protecting the system against untrusted or misbehaving consumers in a real-time environment.
A third – albeit orthogonal – line of research is HyperAlloc [37]. HyperAlloc’s goal is to reclaim memory that has been handed out to virtual machines as efficiently as possible. The key idea is to make the guest OS quickly aware of frames that the hypervisor has reclaimed. To this end, the virtual-machine monitor directly accesses the guest’s lock-free page-frame allocator and marks the reclaimed pages as allocated, preventing the guest from unintentionally using reclaimed frames and enabling rapid memory deflation for VMs. HyperAlloc focuses on the cooperation between the hypervisor and the guest OS and does not provide timing guarantees; therefore it is not directly comparable to Brumm, although both works share an interest in fast memory reclamation.
Finally, Ren et al. [20] investigate the problem of scalable memory reclamation in the context of real-time read-copy-update (RCU). That work is concerned with the reclamation of memory that is no longer referenced by any RCU participant. It presents two new methods to make this reclamation operation predictable and to avoid blocking RCU readers. This requires a “co-analysis of both memory consumption and response time” [20]. In contrast, Brumm does not assume any prior knowledge of the execution schedule; instead it shields the system from rogue programs by accounting for reclamation latency on a per-process-group basis. This accounting-based approach makes Brumm applicable even when the schedule and memory consumption cannot be statically determined as it is common in cloud settings.
Taken together, these works illustrate a spectrum of strategies for controlling memory reclamation – ranging from kernel arena allocation to hypervisor-guest cooperation. Brumm distinguishes itself by providing a flexible, accounting-driven budget for reclamation latency that can be enforced at runtime without requiring predetermined capability tree sizes or static schedule information, making Brumm applicable to cloud-oriented edge scenarios.
8 Conclusion
Predictable reclamation latency is essential in resource-constrained, dynamic, and multi-tenant edge clouds. Our measurements demonstrate that the latency incurred when reclaiming memory mappings can be both large and highly variable; none of the existing accounting mechanisms (e.g., kernel memory quotas) are capable of providing a reliable estimate of this latency. To address this gap we introduced Brumm (Bounded Reclamation of User-space Memory Mappings), a mechanism that accounts for the expected reclamation time of each memory mapping in advance. By attaching a reclamation latency quota object to a process group, a controller can enforce a hard upper bound on the time required to recover the memory used by its subordinate applications, thereby guaranteeing that resources become available within a known interval. We realized Brumm by extending the L4Re microkernel with a new quota object that is updated whenever mappings are created or destroyed. The experimental evaluation shows that the accounting model yields accurate predictions of reclamation latency – although higher than the measured values. The additional kernel overhead is modest. In summary, Brumm provides a practical, accounting-driven foundation that enables system administrators and orchestration frameworks to assert timing predictability for memory cleanup operations, paving the way for more reliable and isolated edge cloud environments.
References
- [1] Benny Akesson, Mitra Nasri, Geoffrey Nelissen, Sebastian Altmeyer, and Robert I. Davis. A comprehensive survey of industry practice in real-time systems. Real Time Syst., 58(3):358–398, 2022. doi:10.1007/S11241-021-09376-1.
- [2] Nils Asmussen, Sebastian Haas, Carsten Weinhold, Till Miemietz, and Michael Roitzsch. Efficient and scalable core multiplexing with M³v. In Proceedings of the 27th ACM International Conference on Architectural Support for Programming Languages and Operating Systems, ASPLOS ’22, pages 452–466, New York, NY, USA, 2022. Association for Computing Machinery. doi:10.1145/3503222.3507741.
- [3] Nils Asmussen, Marcus Völp, Benedikt Nöthen, Hermann Härtig, and Gerhard P. Fettweis. M3: A hardware/operating-system co-design to tame heterogeneous manycores. In Tom Conte and Yuanyuan Zhou, editors, Proceedings of the Twenty-First International Conference on Architectural Support for Programming Languages and Operating Systems, ASPLOS 2016, Atlanta, GA, USA, April 2-6, 2016, pages 189–203. ACM, 2016. doi:10.1145/2872362.2872371.
- [4] Henry G. Baker, Jr. List processing in real time on a serial computer. Commun. ACM, 21(4):280–294, 1978. doi:10.1145/359460.359470.
- [5] Bernard Blackham, Yao Shi, Sudipta Chattopadhyay, Abhik Roychoudhury, and Gernot Heiser. Timing analysis of a protected operating system kernel. In 2011 IEEE 32nd Real-Time Systems Symposium, pages 339–348, 2011. doi:10.1109/RTSS.2011.38.
- [6] Perry Cheng and Guy E. Blelloch. A parallel, real-time garbage collector. In Michael Burke and Mary Lou Soffa, editors, Proceedings of the 2001 ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), Snowbird, Utah, USA, June 20-22, 2001, pages 125–136. ACM, 2001. doi:10.1145/378795.378823.
- [7] Xinyu Han, Yuan Gao, Gabriel Parmer, and Timothy Wood. Byways: High-performance, isolated network functions for multi-tenant cloud servers. In Proceedings of the 2024 ACM Symposium on Cloud Computing, SoCC ’24, pages 811–829, New York, NY, USA, 2024. Association for Computing Machinery. doi:10.1145/3698038.3698547.
- [8] Henrik Karlsson and Roberto Guanciale. Partitioning kernel with capability controlled temporal and spatial partitioning. In 2025 IEEE Real-Time Systems Symposium (RTSS), pages 68–81, 2025. doi:10.1109/RTSS66672.2025.00015.
- [9] Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, David A. Cock, Philip Derrin, Dhammika Elkaduwe, Kai Engelhardt, Rafal Kolanski, Michael Norrish, Thomas Sewell, Harvey Tuch, and Simon Winwood. seL4: formal verification of an OS kernel. In Jeanna Neefe Matthews and Thomas E. Anderson, editors, Proceedings of the 22nd ACM Symposium on Operating Systems Principles 2009, SOSP 2009, Big Sky, Montana, USA, October 11-14, 2009, pages 207–220. ACM, 2009. doi:10.1145/1629575.1629596.
- [10] Adam Lackorzynski and Alexander Warg. Taming subsystems: capabilities as universal resource access control in L4. In Michael Engel and Jörg Nolte, editors, Proceedings of the Second Workshop on Isolation and Integration in Embedded Systems, IIES ’09, Nuremburg, Germany, March 31, 2009, pages 25–30. ACM, 2009. doi:10.1145/1519130.1519135.
- [11] Borui Li, Wei Dong, and Yi Gao. WiProg: A WebAssembly-based approach to integrated IoT programming. In IEEE INFOCOM 2021 – IEEE Conference on Computer Communications, pages 1–10, 2021. doi:10.1109/INFOCOM42981.2021.9488424.
- [12] Henry Lieberman and Carl Hewitt. A real-time garbage collector based on the lifetimes of objects. Commun. ACM, 26(6):419–429, 1983. doi:10.1145/358141.358147.
- [13] Jork Löser, Hermann Härtig, and Lars Reuther. A streaming interface for real-time interprocess communication. In Proceedings of HotOS-VIII: 8th Workshop on Hot Topics in Operating Systems, May 20-23, 2001, Elmau/Oberbayern, Germany, page 174. IEEE Computer Society, 2001. doi:10.1109/HOTOS.2001.990090.
- [14] Jiong Lou, Zhiqing Tang, Weijia Jia, Wei Zhao, and Jie Li. Startup-aware dependent task scheduling with bandwidth constraints in edge computing. IEEE Transactions on Mobile Computing, 23(2):1586–1600, 2024. doi:10.1109/TMC.2023.3238868.
- [15] Weiwei Miao, Zeng Zeng, Changzhi Teng, and Rui Zhang. Resource-aware scheduling mechanism for real-time tasks in lightweight edge systems. In 2022 International Conference on Automation, Robotics and Computer Engineering (ICARCE), pages 1–5, 2022. doi:10.1109/ICARCE55724.2022.10046442.
- [16] Till Miemietz, Viktor Reusch, Matthias Hille, Lars Wrenger, Jana Eisoldt, Jan Klötzke, Max Kurze, Adam Lackorzynski, Michael Roitzsch, and Hermann Härtig. MettEagle: Costs and benefits of implementing containers on microkernels. In Lidong Zhou and Yuanyuan Zhou, editors, 19th USENIX Symposium on Operating Systems Design and Implementation, OSDI 2025, Boston, MA, USA, July 7-9, 2025, pages 979–996. USENIX Association, 2025. URL: https://www.usenix.org/conference/osdi25/presentation/miemietz.
- [17] Gabriel Parmer. Composite developers manual, July 2020. URL: https://github.com/gwsystems/composite/blob/b452fdf45dd64b352085c7485c65bd8f818dc1d5/doc/dev_manual/composite_dev_manual_v2020-07-04.pdf.
- [18] Gabriel Parmer and Richard West. Predictable and configurable component-based scheduling in the Composite OS. ACM Trans. Embed. Comput. Syst., 13(1s), December 2013. doi:10.1145/2536747.2536754.
- [19] Yuxin Ren, Guyue Liu, Vlad Nitu, Wenyuan Shao, Riley Kennedy, Gabriel Parmer, Timothy Wood, and Alain Tchana. Fine-grained isolation for scalable, dynamic, multi-tenant edge clouds. In 2020 USENIX Annual Technical Conference (USENIX ATC 20), pages 927–942. USENIX Association, July 2020. URL: https://www.usenix.org/conference/atc20/presentation/ren.
- [20] Yuxin Ren, Guyue Liu, Gabriel Parmer, and Björn B. Brandenburg. Scalable memory reclamation for multi-core, real-time systems. In Rodolfo Pellizzoni, editor, IEEE Real-Time and Embedded Technology and Applications Symposium, RTAS 2018, 11-13 April 2018, Porto, Portugal, pages 152–163. IEEE Computer Society, 2018. doi:10.1109/RTAS.2018.00025.
- [21] Viktor Reusch. Bounded resource reclamation. In Kuan-Hsun Chen and Marion Sudvarg, editors, Proceedings of OSPERT 2025, pages 49–55. OSPERT, July 2025. doi:10.5281/zenodo.15975835.
- [22] Gabriele Russo Russo, Valeria Cardellini, and Francesco Lo Presti. Serverless functions in the cloud-edge continuum: Challenges and opportunities. In 2023 31st Euromicro International Conference on Parallel, Distributed and Network-Based Processing (PDP), pages 321–328, 2023. doi:10.1109/PDP59025.2023.00056.
- [23] Mahadev Satyanarayanan. The emergence of edge computing. Computer, 50(1):30–39, 2017. doi:10.1109/MC.2017.9.
- [24] Mahadev Satyanarayanan, Zhuo Chen, Kiryong Ha, Wenlu Hu, Wolfgang Richter, and Padmanabhan Pillai. Cloudlets: at the leading edge of mobile-cloud convergence. In 6th International Conference on Mobile Computing, Applications and Services, pages 1–9, 2014. doi:10.4108/icst.mobicase.2014.257757.
- [25] Wenyuan Shao, Bite Ye, Huachuan Wang, Gabriel Parmer, and Yuxin Ren. Edge-RT: OS support for controlled latency in the multi-tenant, real-time edge. In 2022 IEEE Real-Time Systems Symposium (RTSS), pages 1–13, 2022. doi:10.1109/RTSS55097.2022.00011.
- [26] David Sowry, Dharmesh Jani, Don Duet, Frank Yang, Harry Smeenk, James Young, Phillip Marangella, and Robert Bunger. Edge data centers. TIA position paper, Telecommunications Industry Association, 2018. URL: https://tiaonline.org/wp-content/uploads/2018/10/TIA_Position_Paper_Edge_Data_Centers-18Oct18.pdf.
- [27] Udo Steinberg and Bernhard Kauer. NOVA: a microhypervisor-based secure virtualization architecture. In Proceedings of the 5th European Conference on Computer Systems, EuroSys ’10, pages 209–222, New York, NY, USA, 2010. Association for Computing Machinery. doi:10.1145/1755913.1755935.
- [28] Hiren Surti, Crown Castle, Pack Jones, Tom Craft, and Tom Widawsky. Types and locations of edge data centers: Scoping locations that work for your needs. A Future at the Edge: Edge Data Center Working Group Solutions Brief Papers 1, Telecommunications Industry Association, January 2020. URL: https://tiaonline.org/wp-content/uploads/2020/03/EDC-Issue-1_types-and-locations_03_23_20.pdf.
- [29] The authors of the Linux man-pages project. pid_namespaces(7) — Linux manual page, September 2025. URL: https://www.man7.org/linux/man-pages/man7/pid_namespaces.7.html.
- [30] The kernel development community. Control group v2 — the Linux kernel documentation, September 2025. URL: https://www.kernel.org/doc/html/v6.18/admin-guide/cgroup-v2.html.
- [31] The kernel development community. Memory management — the Linux kernel documentation, September 2025. URL: https://www.kernel.org/doc/html/v6.18/admin-guide/mm/index.html.
- [32] The kernel development community. Process addresses — the Linux kernel documentation, November 2025. URL: https://www.kernel.org/doc/html/v6.18/mm/process_addrs.html.
- [33] The seL4 authors and contributors. seL4 reference manual, November 2025. URL: https://sel4.systems/Info/Docs/seL4-manual-14.0.0.pdf.
- [34] Carlos Villavieja, Vasileios Karakostas, Lluis Vilanova, Yoav Etsion, Alex Ramirez, Avi Mendelson, Nacho Navarro, Adrian Cristal, and Osman S. Unsal. DiDi: Mitigating the performance impact of TLB shootdowns using a shared TLB directory. In 2011 International Conference on Parallel Architectures and Compilation Techniques, pages 340–349, 2011. doi:10.1109/PACT.2011.65.
- [35] Chao Wang, Christopher Gill, and Chenyang Lu. FRAME: Fault tolerant and real-time messaging for edge computing. In 2019 IEEE 39th International Conference on Distributed Computing Systems (ICDCS), pages 976–985, 2019. doi:10.1109/ICDCS.2019.00101.
- [36] Ingomar Wenzel, Raimund Kirner, Bernhard Rieder, and Peter P. Puschner. Measurement-based timing analysis. In Tiziana Margaria and Bernhard Steffen, editors, Leveraging Applications of Formal Methods, Verification and Validation, pages 430–444, Berlin, Heidelberg, 2008. Springer Berlin Heidelberg. doi:10.1007/978-3-540-88479-8_30.
- [37] Lars Wrenger, Kenny Albes, Marco Wurps, Christian Dietrich, and Daniel Lohmann. HyperAlloc: Efficient VM memory de/inflation via hypervisor-shared page-frame allocators. In Proceedings of the Twentieth European Conference on Computer Systems, EuroSys 2025, Rotterdam, The Netherlands, 30 March 2025 – 3 April 2025, pages 702–719. ACM, 2025. doi:10.1145/3689031.3717484.
- [38] Lars Wrenger, Florian Rommel, Alexander Halbuer, Christian Dietrich, and Daniel Lohmann. LLFree: Scalable and optionally-persistent page-frame allocation. In 2023 USENIX Annual Technical Conference (USENIX ATC 23), pages 897–914, Boston, MA, July 2023. USENIX Association. URL: https://www.usenix.org/conference/atc23/presentation/wrenger.
- [39] Zhi Zhou, Xu Chen, En Li, Liekang Zeng, Ke Luo, and Junshan Zhang. Edge intelligence: Paving the last mile of artificial intelligence with edge computing. Proceedings of the IEEE, 107(8):1738–1762, 2019. doi:10.1109/JPROC.2019.2918951.
