首页 > 试题广场 >

请你说说 malloc 的实现原理

[问答题]
malloc 函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。 调用 malloc()函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。(如果没有搜索到,那么就会用sbrk()才推进brk指针来申请内存空间)。 然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用 free 函数时,它将用户释放的内存块连接到空闲链表上。
发表于 2022-07-15 20:17:26 回复(0)
1. 当开辟的空间小于 128K 时,调用 brk()函数,malloc 的底层实现是系统调用函数 brk(),其主要移动指针 _enddata(此时的 _enddata 指的是 Linux 地址空间中堆段的末尾地址,不是数据段的末尾地址) 2.当开辟的空间大于 128K 时,mmap()系统调用函数来在虚拟地址空间中(堆和栈中间,称为“文件映射区域”的地方)找一块空间来开辟。
发表于 2022-08-24 17:10:52 回复(0)
malloc基本的实现原理维护一个内存空闲链表,调用 malloc()函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块 将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节),将分配给用户的那块内存储存区传给用户,并将剩下的那块返回到连接表上。调用free函数时,他将用户释放的内存块连接到空闲链表上。小于128K的时候调用brk()函数,大于128K时系统调用mmap()在虚拟内存地址空间中找一块空间来开辟
发表于 2022-08-31 16:31:54 回复(0)
malloc() 基本的实现原理就是维护一个内存空闲链表,当申请内存空间时,搜索内存空闲链表,找到适配的空闲内存空间,然后将空间分割成两个内存块,一个变成分配块,一个变成新的空闲块。如果没有搜索到,那么就会调用 sbrk() 推进 brk 指针来申请内存空间。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用 free 函数时,它将用户释放的内存块连接到空闲链表上。
发表于 2023-07-26 16:56:50 回复(0)
为什么没人看吗
发表于 2022-06-09 14:25:12 回复(1)
malloc() 的整体思想是先向操作系统申请一块大小适当的内存,然后自己管理,即内存池。 malloc() 基本的实现原理就是维护一个内存空闲链表,当申请内存空间时,搜索内存空闲链表,找到适配的空闲内存空间,然后将空间分割成两个内存块,一个变成分配块,一个变成新的空闲块。如果没有搜索到,那么就会调用 sbrk() 推进 brk 指针来申请内存空间。
发表于 2024-05-17 10:53:23 回复(0)
1. malloc(),向操作系统申请一大块内存,自己进行管理,也就是内存池管理。 2. malloc(),返回的每个内存块都相当于一个数据结构,其中包括着临近内存块的地址,本内存块的大小,而且是内存对齐的。 3. 每一个malloc()内存块实际上连成了一个链表,free链表。 4. 每次申请,就从链表中找到一块合适的内存返回;释放,就把内存块放到空闲链表上。 5. 涉及的算法:区间合并、首次适配、最佳适配、下一次适配等。
发表于 2023-11-09 22:02:34 回复(0)
malloc底层主要由2种系统调用brk()和mmap()实现, 当申请的内存小于128k时,采用brk()申请内存,通过将堆顶指针向上移动获得内存空间,通过brk申请的内存,在free释放内存时,不会把内存理解归还给操作系统,而是作为内存池待下次使用; 当申请的内存大于128k时,采用mmap申请内存,mmap在文件映射区申请内存,通过mmap申请的内存,在free释放内存后,会把内存理解归还给操作系统。
发表于 2023-10-24 11:46:11 回复(0)
malloc 是单纯的在堆区开辟一块指定大小的内存
发表于 2023-08-12 11:22:13 回复(0)
STL里面的allocator是有多个链表的。
发表于 2022-10-18 10:43:52 回复(0)