在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理内存。当然,如果计算机同时只运行一个程序,那么只要程序要求内存空间不要超过物理内存的大小,就不会有问题。但事实上为了更有效地利用硬件资源,我们必须同时运行多个程序,正如多道程序、分时系统和多任务一样,当我们能同时运行多个程序时,CPU地利用率将会比较高,那么,如何将计算机上有限地物理内存分配给多个程序使用。
我们都知道,操作系统要把程序从磁盘放到内存中后运行,但是,如果程序特别大的话,那么内存根本放不下,同样也有很多没有办法利用的小块内存,这样我们要怎么做呢?
所以,我们就引入了虚拟内存地址。
然后通过映射的方法,将这个虚拟地址转换为实际的物理地址。这样,只要我们能够妥善地控制这个虚拟地址到物理地址地映射过程,就可以保证任意一个程序所能够访问地物理内存区域跟另外一个程序互相不重叠,以达到地址空间各地的效果,这样就提高了内存的利用率。
虚拟地址空间是指虚拟的、人们想象出来的地址空间,其实他并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间,这样就有效地做到了隔离。
我们所看到的程序地址空间实际上就是一个虚拟地址空间,实际上是操作系统通过mm_struct这个结构体为进程描述地一个空间,因此有时也成为地址描述符。
而页表则记录的虚拟内存地址与物理地址之间地映射,而且页表还记录了这块地址地内存访问实现控制。
在创建一个子进程时都发生了什么?
写时拷贝技术:操作系统通过复制父进程创建子进程,子进程初始时与父进程指向同一块物理内存区域,当内存数据发生改变时,会为子进程重新开辟内存更新页表。
页表是如何将虚拟地址转换为物理地址的?
段页式内存管理:
段页式:通过段号在段表中找到段表项,通过段表项中的段内页表地址找到段内页表,通过地址中的段内页号在在段内页表中找到页表项,通过页表项的中的物理页号与页内偏移组成物理地址。
内存地址:段号+段内页号+页内偏移
段表项中包含段内页表起始地址
段内页表项中又包含着物理页号
如果内存地址不够用怎么办?
swap分区也叫交换分区:内存不够的时候,将内存中的数据置换到交换分区中,腾出内存处理数据
内存置换算法:
这里我只简单的提及一下内存置换算法,我知道三种:
FIFO:先进先出
LFU:最近最少频率未使用
LRU:最近最久未使用