在平时看资料时,时不时出现用户空间(user space)和内核空间(kernel space)。那到底什么是用户空间,什么是内核空间呢?在这里说说我自己的理解。
操作系统中直接与硬件打交道的被称之为内核,内核控制这所有的硬件,如果普通程序需要操作硬件(例如写IO到硬盘),是不可以直接与硬件交互的,必需通过调用内核暴露的接口,来达到相应的目的,调用内核的接口这个过程被称为系统调用(system call)。用户空间指的是在内核之外运行的代码,而内核空间是内核运行的地方。
例如下面的的代码中就涉及了用户空间和内核空间的转换:
str = "my string" // 用户空间
x = x + 2
file.write(str) // 切换到内核空间
y = x + 4 // 切换回用户空间
为什么要区分内核空间以及用户空间?
因为用户进程无法直接调用系统资源,只能通过操作系统来访问。
内核态和用户态(kernel mode和user mode),在内核态可以访问系统资源,比如:
-
处理器cpu:cpu控制着一个程序的执行。
-
输入输出IO:linux有句话叫“一切都是流”,也就是所有输入输出设备的数据,包括硬盘,内存,终端都可以像流一样操作。
-
进程管理:类似对进程的创建,休眠,唤醒,释放之类的调度。比如linux下的fork和windows下的CreateProcess()函数。
-
内存:包括内存的申请,释放等管理操作。
-
设备:这个就是常常说的外设了,比如鼠标,键盘。
-
计时器:计算机能计时是因为晶体振荡器产生的电磁脉冲。那么所有的定时任务都是以它为基础的。
-
进程间通信IPC:进程之间是不能够互相访问内存的,所以进程与进程之间的交互需要通信,而通信也是一种资源。
-
网络通信:网络通信可以看做是进程见通信的特殊形式。
而上面所说的这些系统资源,在用户进程中是无法被直接访问的,只能通过操作系统来访问,所以也把操作系统提供的这些功能成为:“系统调用”。
那为什么要分为两个空间呢?主要为了安全的缘故,防止资源的独占滥用或可以破坏操作系统等。例如某些进程霸占的资源不释放,就影响到了其他进程的运行。