目录

操作系统中的用户空间和内核空间

目录

操作系统中的用户空间和内核空间

在操作系统中,程序分为两类:用户程序和内核程序。

用户程序:Java、Python、C等编写的应用程序。

内核程序:文件读写、网络传输、进程和线程管理、调用系统资源等。

用户程序运行的空间就是用户空间,即 user space。内核程序运行的空间就内核空间,即 kernel space。这两个空间是隔离的,即使用户程序崩溃了,内核也不受影响。

如图:

https://i-blog.csdnimg.cn/blog_migrate/85191b136c90c3788f029946454a1359.png

用户空间只能执行简单的运算,很多时候,还需要调用内核空间。如应用程序要读取某个文件时,并不是直接去读取文件,而是通过调用内核程序(也称 system call),内核读取文件后,再返回给应用程序。

如下程序:

// 读取文件内容,再通过网络传输

sender = "zhangsan"                                              //用户空间

content = file.read()                                            //切换到内核空间,读取文件

length = content.length                                          //切换回用户空间

msg = sender + ":" + length + ":" + content                      //用户空间

socket.send(msg)                                                 //切换到内核空间,网络传输

在linux中,可以通过 top 命令来查看CPU在 user space 和 kernel space 中消耗的百分比。如:

https://i-blog.csdnimg.cn/blog_migrate/77942efdd504445c45bf97ef3ddb0784.png

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 命令查看单个进程的信息。如:

https://i-blog.csdnimg.cn/blog_migrate/c83c1f2a0f88e487ef93a6c206e07d9c.png

real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其它任务的时间。

user:程序在用户空间执行的时间。

sys: 程序在内核空间执行的时间。

user 和 sys 之和,一般要小于 real。但如果是多核 CPU,这两个指标反映的是所有 CPU 的总耗时,所以它们之和可能大于real。

理解用户空间和内核空间后,编程中,如果遇到文件传输问题,可以使用零拷贝技术,也就是文件流只经过内核空间,而不需要返回到用户空间,这样就可以提高传输效率。