用户态和内核态
内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序
内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
当程序运行在0级特权级上时,就可以称之为运行在内核态。
运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。
往往我们的系统的资源是固定的,例如内存2G,CPU固定,磁盘2TB,网络接口固定。所以就需要操作系统对资源进行有效的利用。假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。所以,Linux的设计的初衷:给不同的操作给与不同的“权限”。Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。
各位有没有发现,前面讲了这么多内核态和用户态什么不同,其实用一句话就能概括:它们权限不同。用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程可以“为所欲为”。
从用户态到内核态切换可以通过三种方式:
- 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
- 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
-
- 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。
cpu占用率
user
(通常缩写为us),代表用户态CPU时间。注意,它包括下面的nice
时间,但包括了guest
时间。
nice
(通常缩写为ni),代表低优先级用户态CPU时间,也就是进程的nice值被调整为1-19之间是的CPU时间。
system
(通常缩写为sys),代表内核态CPU时间
idle
(通常缩写为id),代表空闲时间。注意,它不包括I/O等待时间(iowait
)
iowait
(通常缩写为wa),代表等待I/O的CPU时间,cpu出于空闲且有未完成的I/O请求
irq
(通常缩写为hi),代表处理硬中断的CPU时间
softirq
(通常缩写为si),代表处理软中断的CPU时间,系统调用时发生软中断
steal
(通常缩写为st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间
guest
(通常缩写为guest
),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间
理解:
user
+system
+idle
+iowait
=100%?idle
+iowait
=空闲cpuiowait
: 单纯的iowait高不能说明I/O负载高https://www.linuxprobe.com/understand-iowait.html
sleep() wait()
Thread.sleep()或object.wait()后,都会释放cpu资源
Thread.sleep()不会释放占用的锁
object.wait()会释放占用的锁
top使用
在top命令运行过程中可以通过top的内部命令做显示方式的控制。
1- 开启或关闭显示所有cpu使用详细情况
l - 关闭或开启第一部分第一行 top 信息的表示
t - 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m - 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N - 以 PID 的大小的顺序排列表示进程列表(第三部分后述)
P - 以 CPU 占用率大小的顺序排列进程列表 (第三部分后述)
M - 以内存占用率大小的顺序排列进程列表 (第三部分后述)
h - 显示帮助
n - 设置在进程列表所显示进程的数量
q - 退出 top
s - 改变画面更新频率(输入数字)