cpu占用率拉高:/dev/null(黑洞文件)与 /dev/zero(空白文件)

一、/dev/null(黑洞文件)与 /dev/zero(空白文件)

/dev/null 和 /dev/zero 都是特殊的设备文件,位于 Linux 系统中的 /dev 目录下。它们被称为设备文件,因为它们提供了对设备的访问,但实际上并不对任何物理设备进行读写操作。

1.1 /dev/null(黑洞文件)

/dev/null:被称为“黑洞文件”,它会丢弃所有写入它的数据,并在读取时返回一个文件结束符。因此,将数据写入 /dev/null 相当于将数据永久删除,而从中读取数据则会立即返回文件结束符。

1.2 /dev/zero(空白文件)

/dev/zero:被称为“空白文件”,它会不断地产生空字节(即二进制的 0 ),因此从中读取数据会得到无限的空字节流,不会遇到文件结束符。通常用于初始化和清零操作。

二、 将空白文件写入黑洞文件

2.1 linux的dd命令

1.dd 命令用于读取、转换并输出数据。
2.dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

2.1.1 dd命令参数

if 代表输入文件。如果不指定 if,默认就会从 stdin 中读取输入。
of 代表输出文件。如果不指定 of,默认就会将 stdout 作为默认输出。
bs 代表字节为单位的块大小。
count 代表被复制的块数。
conv=ucase 把字母由小写转换为大写。

2.1.2 dd命令示例

2.1.2.1 从一个设备复制到另一个设备

dd if=/dev/sda of=/dev/sdb bs=4k
这个命令将硬盘 /dev/sda 的内容复制到硬盘 /dev/sdb 中,bs=4k 表示每次读取和写入的块大小为 4KB。

2.1.2.2 创建一个指定大小的文件

dd if=/dev/zero of=output.bin bs=1M count=100
这个命令将从 /dev/zero 中读取数据,写入到 output.bin 文件中,总共写入 100MB 的数据。

2.1.2.3 将一个文件转换成大写

dd if=input.txt of=output.txt conv=ucase
这个命令将 input.txt 中的内容复制到 output.txt 中,并将所有字母转换成大写。

2.1.2.4 备份和恢复 MBR(主引导记录)

dd if=/dev/sda of=mbr_backup bs=512 count=1
dd if=mbr_backup of=/dev/sda bs=512 count=1
第一个命令将硬盘 /dev/sda 的 MBR 备份到文件 mbr_backup 中,第二个命令将备份的 MBR 恢复到硬盘 /dev/sda 中。

2.1.2.4 随机生成一个文件

dd if=/dev/urandom of=random_data.bin bs=1M count=10
这个命令将从 /dev/urandom 中读取随机数据,写入到 random_data.bin 文件中,总共写入 10MB 的数据。

2.2 dd if=/dev/zero of=/dev/null

了解了上面的基础知识,dd if=/dev/zero of=/dev/null 便容易理解了:

dd 命令用于复制文件。在这里,if=/dev/zero 表示输入文件是 /dev/zero,这个设备会不断产生空字节。of=/dev/null 表示输出文件是 /dev/null,即将产生的数据直接丢弃。& 表示在后台执行这个命令。

参考链接:
linux中的&&和&,|和||

三、循环执行dd命令拉高cpu使用率

3.1 for i in `seq 1 7`; do dd if=/dev/zero of=/dev/null & done

如果有对 seq命令不了解的可以看下例子和链接Linux基础:常用命令之seq命令详解

xxxxx$ for i in `seq 1 7`; do echo "It is a test"; done
It is a test
It is a test
It is a test
It is a test
It is a test
It is a test
It is a test

for i in `seq 1 7`; do dd if=/dev/zero of=/dev/null & done 会不断的产生空字节并输出到/dev/null,并将数据丢弃,这个过程会消耗cpu的资源,又因为它是不断产生空字节,所以理论上执行此命令的cpu会一直被占用,`seq 1 7`是产生了七条 dd if=/dev/zero of=/dev/null的命令,理论上会让七个cpu不断执行对应的操作。7/8 *100/100 =87.5%,如果有需要cpu占用率87.5%附近及以上的环境,可以通过seq1 7 或者seq 1 8来模拟,当然此情况只针对8核cpu的情况,其它情况另外计算即可。

3.2 adb shell执行命令并对比top

可以看到此时idle空闲态81%,cpu占用率应该在90%左右。
cpu占用率拉高:/dev/null(黑洞文件)与 /dev/zero(空白文件)_第1张图片
用自己的工具测一下:
cpu占用率拉高:/dev/null(黑洞文件)与 /dev/zero(空白文件)_第2张图片
没有问题,有兴趣的可以看下我的这篇文章:
安卓cpu信息查看与cpu占用率计算

注意:
最后不要忘了杀死进程,不然cpu累死了:

pkill -9 dd

cpu占用率拉高:/dev/null(黑洞文件)与 /dev/zero(空白文件)_第3张图片

四、参考链接:

Linux系统之dd命令详解
linux中的&&和&,|和||
Linux 下的两个特殊的文件 – /dev/null 和 /dev/zero 简介及对比
Linux基础:常用命令之seq命令详解

你可能感兴趣的:(安卓性能优化,linux,android)