1.一个计算机通常有一定大小的内存空间,如使用的计算机是4GB 的地址空间,但是
程序并不能完全使用这些地址空间,因为这些地址空间被划分为内核空间和用户空间。程
序只能使用用户空间的内存,这里所说的使用是指程序能够申请的内存空间,并不是程序
真正访问的地址空间。
内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接
硬件资源等的程序逻辑。为何需要内存空间和用户空间的划分呢?很显然和前面所说的每
个进程都独立使用属于自己的内存一样,为了保证操作系统的稳定性,运行在操作系统中
的用户程序不能访问操作系统所使用的内存空间。这也是从安全性上考虑的,如访问硬件
资源只能由操作系统来发起,用户程序不允许直接访问硬件资源。如果用户程序需要访问
硬件资源,如网络连接等,可以调用操作系统提供的接口来实现,这个调用接口的过程也
就是系统调用。每一次系统调用都会存在两个内存空间的切换,通常的网络传输也是一次
系统调用,通过网络传输的数据先是从内核空间接收到远程主机的数据,然后再从内核空
间复制到用户空间,供用户程序使用。这种从内核空间到用户空间的数据复制很费时,虽
然保住了程序运行的安全性和稳定性,但是也牺牲了一部分效率。但是现在已经出现了很
多其他技术能够减少这种从内核空间到用户空间的数据复制的方式,如Linux 系统提供了
sendfile 文件传输方式。
内核空间和用户空间的大小如何分配也是一个问题,是更多地分配给用户空间供用户
程序使用,还是首先保住内核有足够的空间来运行,这要平衡一下。如果是一台登录服务
器,很显然,要分配更多的内核空间,因为每一个登录用户操作系统都会初始化一个用户
进程,这个进程大部分都在内核空间里运行。在当前的Windows 32 位操作系统中默认内
核空间和用户空间的比例是1:1(2GB 的内核空间,2GB 的用户空间),而在32 位Linux
系统中默认的比例是1:3(1GB 的内核空间,3GB 的用户空间)。
2.自己的理解,众所周知,os也是一个程序,是程序一定要在内存中运行,会胡乱地在物理内存中分页运行吗?
不会的,为了保证操作系统能够安全、稳定地运行,内存空间会被分为用户空间和内核空间,内核空间即为os所运行的空间,
其中会运行与os有关的相关进程,如对某些硬件资源访问的进程,如某些调度程度等等。内核空间其实封存了高权限的进程,
这些进程用户进程不能访问到,唯一的办法是当用户进程需要执行内核空间的一些进程的时候,会进行用户态到内核态的转化,
其实就是一种进程调度,从当前用户态的进程转为内核空间中的某些进程执行。进程有独立性,一个进程使用一个地址空间,
这里的地址空间为虚拟内存空间,即用户为了编写程序方便所自己模拟的具有连续内存的空间。由于对所有的用户进程来说,
内核进程都是共享的,所以其实通俗理解为,整个内存有一块固定的内存空间,装在os进程,而剩下的空间则由用户编写的程序
占据。注意系统调用的概念,即用户进程对os进程的一个调用,进而获取某些硬件权限。