目录
进程虚拟地址空间简单理解
我们有时候可能会听到说操作系统为每个进程都分配4G的空间,那不知道你有没有产生这个疑问,我的运行内存(不是磁盘)可能就8G,运行一个进程,好家伙,4个G没了,运行两个进程就分配完了,好家伙,那咱办?
对于这个问题,你可以这样理解:不知道你有没有到银行存过钱,你的钱存到银行之后,你觉得银行是把你的钱用于干别的事情呢,还是就放在那里不动,等着你来取?答案肯定是用于干别的了,对吧,但是,银行会告诉你,你存储了100万,所以你在银行就有100万,如果你要取,反正我钱多,我随便哪里给你找100万,如果你不取,那我也不给你真的准备100万等着你取,而是不管你,你要取我在给你找就行了,所以,有时候你的存款,更像是一句承诺
这和操作系统给进程的承诺是一样的,一个进程被创建出来,操作系统告诉它,你有4G的空间,就像你在银行有100万存款,进程如果要一些空间进行存放数据,操作系统就现场给它找一些空间来,就和你要取1万块钱,银行也是现场给你找的一样
Linux下的进程虚拟地址空间
总体理解
我们可以先简单的这样理解,即进程虚拟地址空间分为两部分,从低地址到高地址,总共有4G,其中,前三个G是用户空间,最后1G是内核空间
为什么要区分用户空间和内核空间
在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令
所以,简单说来,就是操作系统不放心你的有些操作,直接设置权限不让你用了,
内核空间
内核空间主要负责资源管理以及处理紧急情况(中断与异常)这些事情
紧急情况很好理解,就是程序出现错误了,那进程就会进入核心态,然后自动访问内核空间中关于这种中断或异常的处理方法(核心态就是指程序能自动访问内核空间了,也不需要人来管)
资源管理就是内核空间里面有好多关于资源管理的函数之类的,我要想调用这些函数,就得进入内核空间,所以也需要进行核心态访问内核空间
用户空间
进程虚拟地址空间的其他知识
页表
当你要申请一块空间时,操作系统会有一张表,这张表把分给进程的4G的空间全部包含进去,比如把4G分成4块,每块1G,我们可以简单的理解每块都有一个编号,如果这一块被用到了,那就在内存中开辟同样大小的字节,然后一一对应
写时拷贝
为什么创建子进程以后,你打印某个变量的地址,竟然发现和父进程是一样的,就是因为子进程连页表也一起拷贝过去了,但是如果你修改变量,父子进程的变量地址虽然一样,但是值就不一样了,因为子进程在写的时候拷贝了一份新的,和父进程不用同一份了,这叫做写时拷贝