谈论之前需要先谈论一些线程的背景知识
其中就有进程地址空间,又是这个让我们又爱又恨的东西
目录
- 背景知识:
- 地址空间:
背景知识:
地址空间:
说在前边,OS通常分为4个核心模块:执行流管理,文件系统管理,文件管理与IO管理。
在这先要涉及到对内存的管理。
以下是一张内存与磁盘的形象图。
在没接触内存管理之前我们通常是认为内存是直接一整块的。
现在我们要知道内存其实不是一整块的,而是分成了一个大数组,数组每个大小4kb!每个4kb叫做页框或页帧。
当然,这个是可以进行更改的,但是需要将OS重新编译一份出来,另外这个数字是由计算机科学家研究出来的。
我们的这个4KB是不是看着很熟悉呢?
4KB也正是磁盘文件与系统进行IO的基本单位。
在OS中的巧合都是精心设计的~
结论:我们磁盘中的可执行程序也是文件,是文件就有对应的inode。我们磁盘中已经天然的按4kb,比如说我们文件存放自己的数据就在datablock[]中,这个就是以4kb进行划分的,所以在进行磁盘IO时,所谓的加载就是把数据块加载到指定的内存块。
那么现在就有一个问题了:当父子进程共享了一个全局变量int类型,进行写时拷贝时是进行4字节的拷贝还是4kb呢?
答案是4kb,这遵循了一个局部性的原则,当你本行的数据被修改,那么下一行会有90的概率也被修改,避免了太多的拷贝,OS也是很忙的。
所以其实我们C语言malloc4字节其实也是申请了4kb,只是我们只能只用4字节(很粗略的理解)
我们的共享内存所以一般也都是申请4096个字节的整倍数…
那么是怎么进行划分的呢,那么多4kb是如何管理的呢?
比如每个内存块被占用了多少,被谁占用了…
所以需要进行管理。
假设我们是4GB,那么大约是一百万的页框,更准确来说是104876
,每个页框都有自己的使用情况。
最底层使用数组进行管理起来,每个page都有自己对应的下标–>也就是每个页框的起始地址。
所以对内存的管理就变为了对数组的增删查改。
那么这个数组大约多大呢?
假设每一份是1byte,那么大约是1mb。
但是实际上一份大约是十几byte。那么就是十几MB就可以管理起来这个数组了。
持续更新…