谢谢阅读,如有错误请大佬留言!!
目录
抛出总结
进程:何为进程进程 = 内核数据结构(PCB+mm_struct+页表(MMU))+ 代码和数据
开始介绍
发现问题
看一份代码
我们知道,当子进程出现写实拷贝的时候,将共享的数据拷贝一份,为子进程独立存储。
让我们运行该代码。
分析结果:1、写实拷贝前:在写实拷贝前子进程与父进程的flag数据相同,数据地址相同,无可厚非为写时拷贝前,父子进程共享一块数据空间
2、写实拷贝:子进程准备修改flag数据,先发生写实拷贝-父进程的flag数据拷贝一份,然后拷贝的空间给子进程形成独立,然后子进程的数据flag改变为222。
3、写实拷贝后,我们观察结果:子进程与父进程的flag值确实发生了不一样了,但是!!我们惊奇的发现他们的地址居然一模一样!同一个地址怎么能保存不一样的值呢??
得出结论,我们看见的地址,其实并不是直接物理内存上面的地址,这里我们看见的地址其实是进程进程地址空间(虚拟地址)。
进程地址空间(虚拟地址)
我们常见这个表其实是不是内存上面的数据区分布,其实是进程空间分布图。它其实一种结构体类型。
让我们讲个小故事更加了解虚拟内存:
有一个有钱的富翁他对他的朋友非常的好,但是他的朋友们都不知道富翁有其他朋友,以为富翁只有他一个朋友,富翁有一千万元,他对所有朋友说哎呀我的钱都可以借给你,但是你不能一下子借太多,要经过我的同意才行。富翁所有的朋友都认为自己可以向富翁借款一千万,所有他们就先规划了这一千万怎么用。富翁也可以同时放贷给许多朋友。故事先暂停一下。
这里的富翁换成物理内存,而朋友们换成进程,所有的进程都是独立的其实,但是进程都认为一个人独占了整个物理内存资源,所以就事先规划了内存使用的分布。划分了并不代表拥有,只是划分了而已
这里我们介绍一下inux的进程地址空间:s