学习Linux时,经常可以看到两个词:Userspace(用户空间)和Kernelspace(内核空间)。
简单说,Kernelspace是Linux内核的运行空间,Userspace是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。
Kernelspace可以执行任意命令,调用系统的一切资源;Userspace只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称systemcall),才能向内核发出指令。
str="mystring"//用户空间x=x+2file.write(str)//切换到内核空间y=x+4//切换回用户空间上面代码中,第一行和第二行都是简单的赋值运算,在Userspace执行。第三行需要写入文件,就要切换到Kernelspace,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回Userspace。
这一行有8项统计指标。
随便也说一下其他6个指标的含义。
如果想查看单个程序的耗时,一般使用time命令。
程序名之前加上time命令,会在程序执行完毕以后,默认显示三行统计。
user和sys之和,一般情况下,应该小于real。但如果是多核CPU,这两个指标反映的是所有CPU的总耗时,所以它们之和可能大于real。
[参考链接]
(完)
知行合一说:
第一张图片太大,1366的屏幕直接撑开了。
ahern88说:
要是还能够更深入就更赞了(比如如何查看用户态和内核态之间的切换次数?),不过挺不错的了,学习了。
cwhy说:
看到kernelspace以为是RKHS(汗)
LiangGuo说:
其实linux下直接执行time,是bash内置的功能,除了bash内置的这个time,还有一个命令time,输出略有不同:[root@hp103~]#timelsacnganaconda-ks.cfgapt-cacher-ng-0.8.9-1.el7.x86_64.rpminstall.loginstall.log.syslogrhel-server-6.5-x86_64-dvd.isotinc-1.0.24-1.el6.x86_64.rpm
real0m0.007suser0m0.000ssys0m0.007s[root@hp103~]#/usr/bin/timelsacnganaconda-ks.cfgapt-cacher-ng-0.8.9-1.el7.x86_64.rpminstall.loginstall.log.syslogrhel-server-6.5-x86_64-dvd.isotinc-1.0.24-1.el6.x86_64.rpm0.00user0.00system0:00.00elapsed0%CPU(0avgtext+0avgdata3504maxresident)k0inputs+0outputs(0major+256minor)pagefaults0swaps[root@hp103~]#
石樱灯笼说:
其他的都见过,唯有niceness从没见过值上升。
Loyalsoldier说:
.rq说:
好文,不过再多讲一些更好
屈成国说:
相比之前这次讲的确实有点少了:)
peacefulEgg说:
最近在学操作系统,正好学到这儿,操作系统的程序和数据是通过进程的手段去控制运行的,因为CPU是多任务的,每个进程要保持独立性,所以要有自己的内存空间,而Linux因为考虑安全问题,把进程的内存空间分为user和system。^-^,不知道说的对不对
菜鸟说:
如果不理解的人,看这个说明我觉得应该还是一头雾水。大侠这个概念应该能讲的更加深入,两者之间的区别啥的。
我是菜鸟,我理解用户态与内核态的区别在于能访问的地址空间不同、能执行的指令集不同。
欧阳说:
ayia说:
这里的双方的"空间"具体指的是"内存空间"么
Timothykwok说:
使用JS说明什么运行于用户空间,什么运行于内核空间,有点过于不精确。用户进程中的基本运算,普通函数调用都是用户空间。即使是调用read(2),write(2),fork(2),exec(2)这些函数时,仍然有很多代码是在用户空间运行的。
jiangtao说:
这个解释还是软件工程师的视角。从用户态运行到内核态的systemcall并不是函数调用的堆栈过程,而是CPU工作模式的一个硬件切换。
Mars说:
Kernelspace可以执行任意命令,调用系统的一切资源->可能改成"kernelspace可以執行比userspace更高權限的動作"會比較好,因為現今系統大多還有更高級別的CPUstate(virtulization&security),一般又比kernelspace有更多權限。