You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

声明16GB的BSS段存储海量文件名是否存在技术弊端?

大内存动态数组的技术方案弊端咨询

我正在开发一款内存用量不可预测的程序:它处理的目录可能只包含少量文件,也可能有数千万个文件。受内核行为限制,必须一次性将所有文件名存入RAM。

下面这段代码并非我的程序,仅用于说明必须一次性存储文件名的原因:

DIR *dir = opendir(".");
for (struct dirent *entry; (entry = readdir(dir);)
    unlink(entry->d_name); // DANGER DO NOT RUN ME

这段代码看似会删除当前目录下的所有文件,但实际会因目录树条目变更破坏枚举稳定性,导致遗漏部分文件。

该程序的几乎所有内存都需要用于存储全部文件名的单一缓冲区,我设计了如下内存结构(ASLR已开启,0为虚拟起始地址,非实际物理地址):

000000000 ELF header
000000118 Program code
000001000 work buffers
000002000 begin stretchy array
400002000 no man's land (mapped with 0 access so anything hitting it faults)
400003000 top of stack
400005000 bottom of stack

无需讨论代码或栈空间过小的问题,相关常量可轻松调整。

我需要讨论的是大型动态数组的实现:管理非连续数组会产生冗余开销,而MMU允许虚拟地址空间无需物理内存连续。我曾在单用户系统中见过这种技巧,但不确定在多用户主机上是否会出现问题。

我的需求是内存仅在被访问时才分配,此前不占用物理资源。那么,声明一个16GB大小的BSS段但仅使用实际所需部分的做法存在哪些风险?由于该段过大,必须确保栈不会与其冲突,因此使用mmap()动态分配地址空间的方案不可行。

我还考虑过另一种方案:如果PE格式支持,可在启动时预留内存并按需通过mmap提交,但手册显示mmap无法预留16GB地址空间且不实际分配物理内存。

目前我已编写了一个包含空程序(mov al, 60 ; syscall)的ELF头,程序可正常运行,现咨询该方案的技术弊端。

内容的提问来源于stack exchange,提问作者Joshua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:52:48