---
# System prepended metadata

title: SMP-safe memory allocation

---

# SMP-safe memory allocation

We currently have to choices for moving forward:
## 1. Use just an internal, synhcronized allocator.
- probably best candidate: bbuddy
- first iteration of lock based synchronization, needs updates: https://github.com/unikraft/unikraft/pull/801
- we have the possibility to implement a lock free allocator, but it requires significant changes / implementing an atomic list

## 2. Use an external "user-space" synchronized internal allocator, fed by an internal allocator / mmap API.

- At some point, this will anyway be required to achieve high performance in various situations. 
- However, these are frontend allocators that run in the user-space on common operating systems. Once they consome their memory pool, they rely on the underling OS to increase their pool.
- Therefore, we will still need to syncronizing the internal memory allocation.

## 3. Mimalloc

![](https://i.imgur.com/ZIDx9c4.png)

- mimalloc is lock free and it is already ported (need to check it with the current version of Unikraft): https://github.com/microsoft/mimalloc **BUT** we still need a synchronized provisioner
- mimalloc is currently patched to call our internal region allocator:  https://github.com/unikraft/lib-mimalloc/blob/staging/patches/adapt-to-unikraft-interface.patch#L117
- when the mimalloc memory pool is fully occupied, it relies on the internal region allocator to increase the heap base; one option is to simply synchronize this
- an alternative is to implement an optimized backend allocator to feed mimalloc (the same discussion with the synchronized bbuddy allocator) and replace the call to the region allocator
- since the default behavour of mimalloc is to call `mmap()` when it is out of memory, another way of doing this is relying on posix-mmap, which also needs synchronization

**Conclusion:** Even if we decide to continue with an external allocator, we will still need internal memory management synchronziation. We should decide between implementing an efficiently synchronized internal allocator, synchronize `posix-mmap` or doing both of them.


**Proposal:** 
*Step 1*: Focus on making mimalloc work in SMP situations, synchronizing the internal backend allocator
*Step 2*: Optimize the internal allocator
*Step 3*: Research into porting other SMP-safe external allocators e.g. jemalloc
*Intermediary step*: Find relevant benchmarks for SMP allocations