操作系统中的用户空间和内核空间
操作系统中的用户空间和内核空间
在操作系统中,程序分为两类:用户程序和内核程序。
用户程序:Java、Python、C等编写的应用程序。
内核程序:文件读写、网络传输、进程和线程管理、调用系统资源等。
用户程序运行的空间就是用户空间,即 user space。内核程序运行的空间就内核空间,即 kernel space。这两个空间是隔离的,即使用户程序崩溃了,内核也不受影响。
如图:
用户空间只能执行简单的运算,很多时候,还需要调用内核空间。如应用程序要读取某个文件时,并不是直接去读取文件,而是通过调用内核程序(也称 system call),内核读取文件后,再返回给应用程序。
如下程序:
// 读取文件内容,再通过网络传输
sender = "zhangsan" //用户空间
content = file.read() //切换到内核空间,读取文件
length = content.length //切换回用户空间
msg = sender + ":" + length + ":" + content //用户空间
socket.send(msg) //切换到内核空间,网络传输
在linux中,可以通过 top 命令来查看CPU在 user space 和 kernel space 中消耗的百分比。如:
us:用户空间,CPU消耗在用户空间的时间百分比。
sy:内核空间,CPU消耗在内核空间的时间百分比。
(其它指标如下)
ni:低优先级进程(niceness),CPU 消耗在 nice 进程的时间百分比。
id:闲置进程(idle),CPU 消耗在闲置进程的时间百分比,这个值越低,表示 CPU 越忙。
wa: 等待I/O操作(wait),CPU 等待外部 I/O 的时间百分比,这段时间 CPU 不能干其它事,但是也没有执行运算,这个值太高说明IO设备有问题。
hi: 硬件中断(hardware interrupt),CPU 响应硬件中断请求的时间百分比。
si: 软件中断(software interrupt),CPU 响应软件中断请求的时间百分比。
st: 偷走时间(stole time),该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其它虚拟机偷走的时间百分比。
还可以用 time 命令查看单个进程的信息。如:
real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其它任务的时间。
user:程序在用户空间执行的时间。
sys: 程序在内核空间执行的时间。
user 和 sys 之和,一般要小于 real。但如果是多核 CPU,这两个指标反映的是所有 CPU 的总耗时,所以它们之和可能大于real。
理解用户空间和内核空间后,编程中,如果遇到文件传输问题,可以使用零拷贝技术,也就是文件流只经过内核空间,而不需要返回到用户空间,这样就可以提高传输效率。