从 CPU 时间说起…
下面这个是 top
命令的界面,相信大家应该都不陌生。
top - 19:01:38 up 91 days, 23:06, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 151 total, 1 running, 149 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8010420 total, 5803596 free, 341300 used, 1865524 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 6954384 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13436 root 20 0 1382776 28040 5728 S 0.3 0.4 251:21.06 n9e-collector
1 root 20 0 43184 3384 2212 S 0.0 0.0 5:15.64 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.28 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.58 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:35.48 migration/0
%Cpu(s):
这一行表示的是 CPU 不同时间的占比,其中大家比较熟悉的应该是 system time
与 user time
:
- 正常情况下
user time
占比应该最高,这是进程运行应用代码的的时间占比(CPU 密集) - 而
system time
占用率高,则意味着存在频繁的系统调用(IO 密集)或者一些潜在的性能问题
不熟悉的朋友可以参考下面这张图(来源于极客时间的课程):
接下来我们将探究隐藏在这些时间背后的操作原理。
内核态与用户态
操作系统的核心功能就是管理硬件资源,因此不可避免会使用到一些直接操作硬件的CPU指令,这类指令我们称之为特权指令。特权指令如果使用不当,将会导致整个系统的崩溃,因此操作系统提供了一组特殊的资源访问代码 —— 内核kernel
来负责执行这些指令。
操作系统将虚拟地址空间划分为两部分:
- 内核空间
kernel memotry
:存放内核代码和数据(进程间共享) - 用户空间
user memotry
:存放用户程序的代码和数据(相互隔离)