c - malloc 需要操作系统支持吗?
问题描述
内存管理是底层操作系统提供的服务。当我们调用malloc()/free()
并且没有运行操作系统(例如裸机嵌入式系统)时,内存分配和跟踪是如何处理的?
应该有一个实体来跟踪哪些地址是免费的,哪些不是。那是操作系统内存管理单元。malloc()/free()
然后将不得不调用操作系统系统调用。所以没有操作系统意味着没有malloc()/free()
。我假设这个错了吗?
更新:
所有答案都指出malloc/free
可以使用静态池分配(当没有可用的操作系统时)或使用sbrk/brk
内核系统调用。问题是如何malloc/free
知道下面是否有内核?
答案(见下面他的回答下“Kuba Ober”的评论):
malloc 不需要知道任何东西,因为您链接项目的 C 库是特定于目标的:如果您为 Linux 开发,则使用用于 Linux 的 C 库,这与为 OS X 或 Windows 开发时不同,或裸机 ARM Cortex M0。或者,见鬼,准系统 x86。编写 C 库的人知道如何实现它,以便它在所需的目标上工作。例如,用于 x86 的准系统 C 库将使用 EFI 和 ACPI 来查询硬件或 BIOS 未使用的可用 RAM 块列表,然后使用它们来满足分配请求。
解决方案
malloc()
并且free()
不需要操作系统支持。它们可以(并且经常!)在裸机系统上实现。例如,Arduino 库使用malloc()
andfree()
来管理字符串。
在托管实现(即在操作系统上运行的应用程序)中,malloc()
通常free()
会使用操作系统服务来分配新的“大块”内存 - 通常一次最多几兆字节 - 并返回这些大块未使用时发送给操作系统。通过将这些内存块切割成应用程序所需的大小来处理较小的分配。这允许在没有系统调用开销的情况下管理小分配。
在非托管实现(如裸机系统)中,应用程序已经可以访问系统上存在的所有内存,并且可以随意分配该内存的块。
在较低级别:托管和非托管的实现malloc()
通常通过将每个已分配或未分配的内存块视为链接列表中的条目来工作。这通常通过在每次分配开始之前存储一个结构来完成,例如
struct malloc_block {
struct malloc_block *prev, *next;
size_t size;
...
char allocation[];
};
并返回一个指针allocation
作为 的返回值malloc()
。类似realloc()
和的函数free()
可以通过从指向分配的指针中减去结构的大小来检索结构。
推荐阅读
- c# - 如何解决 NuGet.targets(124,5):错误:值不能 > null。(参数“文件夹名称”)错误?
- amazon-web-services - aws 在 shell 脚本中承担角色不承担该角色
- odoo - Odoo 序列重置坚持使用 UTC
- python - TCP Server 按需与 Client 通信
- c++ - 垂直方向的 Gtk3+ Spinbutton (c/c++)
- javascript - jquery ui位置的窗口导致primeui对话框在升级jquery后无法弹出
- .htaccess - 将所有子文件夹重定向到父文件夹
- tsql - 关于:尝试插入数据时设置 IDENTITY_INSERT ON 的问题
- javascript - jQuery window.open() 不允许在 Chrome 中加载本地资源
- php - 在 Laravel 中使用很多包是不是很糟糕?