如何使用/dev/random输出填充指定容量的内存?
用随机数填充指定大小内存的实现方法
已知以下命令可分配任意大小的内存(例如1GB),且内存区域会被零填充:
< /dev/zero head -c $((1024**3)) | tail
但如何用类似方式,用随机数填充指定大小的内存(例如1GB)呢?
以下是几种尝试过的无效写法及问题:
- 仅输出数百个随机字符,无法实现指定大小的内存分配:
< /dev/random head -c $((1024**3)) | tail - 修改原始数据(移除
\0),且仅能在变量中保存数百个字符而非1GB:output=$(sudo head -c $((1024**3)) /dev/random | tr -d '\0' | tail) - 思路可行,但同样只能在变量中保存数百个字符而非1GB:
output="" while IFS= read -r -d '' substring; do output+="$substring" done < <(sudo head -c $((1024**3)) /dev/random | tail)
正确实现方案
核心问题分析
/dev/random是阻塞式设备,当系统熵池不足时会暂停输出,这就是为什么只能得到少量随机字符。换成**非阻塞的/dev/urandom**可以持续生成随机数据;另外,shell变量本身有内存限制,不适合存储1GB级别的数据,应让进程直接持有数据以占用内存。
方法1:用/dev/urandom生成指定大小随机数据并占用内存
< /dev/urandom head -c $((1024**3)) | tail
该命令会生成1GB随机数据,通过管道传递给tail,tail进程会将数据暂存在内存中,直到进程终止,以此实现指定大小的随机填充内存占用。
方法2:持久化占用内存(可选)
如果需要长时间保持内存占用,可以用命名管道配合tail -f:
# 创建命名管道 mkfifo /tmp/random_fifo # 后台生成1GB随机数据写入管道 sudo head -c $((1024**3)) /dev/urandom > /tmp/random_fifo & # 用tail -f持有数据,保持内存占用 tail -f /tmp/random_fifo
需要释放内存时,杀掉tail进程并删除管道:
pkill tail rm /tmp/random_fifo
内容的提问来源于stack exchange,提问作者Alfred.37
相关产品推荐
相关产品推荐

