Changchun Master Li

系统开发面试题,实现malloc4k和free4k函数

2025-12-30

今年面试了好几个gpu设计公司,忘记是沐曦科技还是摩尔线程的面试,问了一个经典问题值得记录一下,这是amazon的面试题。我当时上班上的有点懵了,临场发挥回答说申请一个hash表存放4k指针对应的真实指针。。。

题目

实现malloc4k和free4k函数

  1. 封装系统malloc和free
  2. malloc4k总是返回4k对齐的内存地址
  3. free4k传入4k对齐的内存地址释放内存

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stddef.h>
#include <stdint.h>
#define PAGE_SIZE 0x1000

void *malloc_4K_aligned(size_t size) {
void *raw = malloc(size + sizeof(void*) + PAGE_SIZE - 1);
if (!raw)
return 0;

uintptr_t aligned = ((uintptr_t)raw + sizeof(void*) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
*(uintptr_t *)(aligned - sizeof(void*)) = (uintptr_t)raw;
return (void *)aligned;
}
  1. (size + PAGE_SIZE - 1) 用来分配size大小的空间,如果size未对齐,最多需要后移(4k-1)的offset。因此为了4k对齐,多申请了(4k-1)的空间。
  2. sizeof(uintptr_t) 用来存放真正malloc拿到raw指针。
  3. aligned 地址怎么计算非常有技巧性,首先后移sizeof(uintptr_t),地址通过 (A + 4k - 1) & (4k - 1) 拿到该地址的4k上界,这种形式在系统编程中非常常见。
  4. aligned地址前面存真正的raw地址。
1
2
3
4
5
6
void free_4K_aligned(void *ptr) {
if (ptr) {
uintptr_t *addr = (uintptr_t *)((uintptr_t)ptr - sizeof(void*));
free((void *)(*addr));
}
}
  1. 解引用raw地址
  2. free释放

reference

https://leetcode.com/discuss/post/125031/amazon-interview-malloc32-align-space-re-7bd6/

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章