本系列是查阅无数资料,又不想从头开始读厚厚的计算机操作系统教材,痛定思痛之后脑洞大开的结果。鉴于我有一些基础概念,那就从破坏性实验开逆向思考:用垃圾代码搞坏 Linux,顺便了解各种情况下系统诊断命令的输出。

我的智商下,第一个可能搞坏操作系统的代码就是死循环了。

先上代码。最简单的 Python。

def run():
    i = 0
    while(True):
        i += 1

if __name__ == "__main__":
    run()

在 linux 上执行这个 Python 脚本。

使用 top 查看

image.png

关键信息:

  • load avarage 的三个值依次开始升高。因为分别代表 1 、 5、 15 分钟的系统负载
  • load avarage 第一位一分钟后达到 ~ 1。表示单核 cpu 被占满。
  • python 进程的 cpu 达到 100%,该进程所在的 cpu 占满。
  • cpu idle 达到 93.5 ,说明整体看 cpu 还是非常空的。 idle 近似理解成空跑。晶振在不停的发时钟信号,但是没有任务要做。

继续用 htop 看系统状态

image.png

可以看到编号是 10 的 CPU 占用率居高不下,其他 cpu 没动静。传说中的:一方有难、八方围观。

关键信息:

  • 死循环执行一段时间后 load avarage 现在都起来了,依次起立。起来吧,极寒交迫的 CPU
  • 系统硬件 CPU 是 8 core 16 thread。Htop 里面 cpu 显示了 16 个。
  • 一个进程会在一个固定逻辑 cpu 中执行,不会调度到其他 cpu 上。

破坏加码

死循环搞不坏系统,假如再起一个死循环呢?

打开两个命令行,执行两个 forever loop 代码

image.png

HTOP 里面成功点亮第二个 cpu 。

关键信息:

  • 第二个进程占用另外一个逻辑 CPU 核,占用率 100%
  • load 逼近 2 。看来 load 的值跟 cpu 逻辑核对应。load 到 16 说明所有 cpu 满载

TOP 中观察 cpu 相关数据

image.png

关键信息:

  • 12.5% 的 us 。forever loop 占用的是用户态的 cpu. 2/16 = 12.5%
  • 86.9% 的 id 表示还有很多核在空载。14/16 = 87.5%

Airy
2.4k 声望69 粉丝

github.com/airylinus