一 为什么要引入虚拟内存
像我们正常的内存条大小也就16G,但是我们程序运行后的大小是远远比这个大的,所以我们就引入了虚拟内存,我们可以让一个实际内存去管理很多虚拟内存,说白了我们可以让实际内存当一个大哥,让这个大哥去管理小弟,如下图所示,这个就叫做分页。
二 虚拟内存的实际分布
虚拟内存他不一定是连续的,只不过一页必须在一起,页与页之间的,没必要在一起,就如下图所示:
这个记录虚拟地址3456的叫做页表项。
当我们从虚拟内存中读取过这段页面之后,他就会被拷贝都物理地址中,然后这个时候有一个有效位,会置为1,如果下次还要这段页面中的数值可以直接从内存中取到,
页表项里面还有的就是页框,1800就是这个页框号,还有就是如图所示,明显这个数据拷贝到内存之后被改动了,这个时候页表里面还要一个叫做脏位,说白了你给别人污染了,所以将脏位设置为1。
但是这个是内核操作系统进行的操作,我们程序员甚至都不知道页有多大,其实我们程序员用的是段,就像这样,比如说我们需要四段,会在页表项里写入四,然后你需要将数据存入到那个段当中,存入第三段,然后虚拟内存3456上面的值为3,虽然我们是看不到的,但是当把这些写入内存的时候,就是这样的实现,像段和页这种联合的话就叫做段页式存储。
就像下面这种操作,我需要12段,加入一页是三段,这样子系统就会给操作系统分配三页。
但是页有一些缺点,就比如说分页式存储,都是一整页一整页的分配,
就比如说这个三行一页,还没用用完就跑到下一页这样子就产生了页内碎片
如果想避免这个问题的话,那么就用分段式存储,要多少用多少如下:
但是这种美好只能出现在第一次分配,当删除一些的时候就变成了这样
而我们使用的段页式同时继承了这两个缺点