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信息查看与cpu占用率计算

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

pkill -9 dd

在这里插入图片描述

四、参考链接:

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

  • 23
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误信息通常意味着挂载点已经被占用或者该设备已经被挂载。要解决这个问题,你可以尝试以下几个步骤: 1. 首先,你可以使用`mount`命令检查是否已经有其他设备或分区挂载到了`/data`目录下。如果有,请卸载这个设备或分区,使其空闲出来,然后再进行挂载。可以使用`umount`命令来卸载设备或分区,例如`umount /data`。 2. 如果`/data`目录没有被占用,那么你可以使用`df`命令来查看已经挂载的设备或分区列表,看看是否有其他设备或分区已经挂载到了`/dev/sdb`上。如果是这样,你同样需要先卸载这个设备或分区,再进行挂载。 3. 如果以上两种情况都不适用,那么可能是系统中的某个进程或服务正在使用`/dev/sdb`设备或分区。你可以使用`fuser`命令来查找当前正在使用该设备或分区的进程,然后手动停止这些进程。例如,可以使用`fuser -m /dev/sdb`命令来查找正在使用`/dev/sdb`的进程,并使用`kill`命令停止它们。 总结来说,解决"mount: /data: /dev/sdb already mounted or mount point busy"错误的步骤包括: 1. 检查是否有其他设备或分区挂载到了`/data`目录下,如果有,先卸载它们。 2. 使用`df`命令查看是否有其他设备或分区已经挂载到了`/dev/sdb`上,如果是,先卸载它们。 3. 使用`fuser`命令查找并停止正在使用`/dev/sdb`的进程。 希望这些步骤可以帮助你解决问题。如果还有其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值