(备战招聘)操作系统之存储和寻址
操作系统的存储和寻址是较为重要的一部分,这里面有很多精髓的思想在里面,涉及到很多知识点,例如寻址空间(逻辑内存)、物理内存(实际拥有的内存)、虚拟内存(通常在硬盘上,固态或者机械硬盘上开辟的空间),因此我打算通过一种较为形象具体的方法来给大家讲解我的理解。
先说一下操作系统的存储
计算机的存储主要是层级结构化的,如图所示,从下至上的速度由慢到快,相应的成本也越来越高,所以容量也越来越小,价格越来越贵。
硬盘:数据长久存放,容量比较大
内存:关机数据就会消失,快速随机访问
CPU:运算模块和缓存模块,缓存分为不同级别
寄存器:离CPU运算单元最近的部分
好的 那么给出一个地址,如何在层次性的存储结构中找到相关的数据呢,下面就要引入寻址的概念
首先要讲讲寻址空间,寻址空间为每一个进程可以取到的地址的范围,与机器上物理内存的大小是没有关系的,相当于一个逻辑上的概念,例如32位操作系统的寻址空间为bit,也就是4G,64位的操作系统的寻址空间为bit也就是大概60TB的大小。
下面举出一个寻址例子
比如给你一个指针P,如何找出它对应的数据并读出呢?
int n=*P
汇编语言为MOV EXA,[EBA]
给出一个指针P,首先其指向的内存为逻辑内存(上面讲的寻址空间),然后计算机操作系统通过建立一个逻辑内存与物理内存的对应关系,但是存在一个问题,因为逻辑内存普遍较大,因此有可能出现逻辑内存大于物理内存的现象,那么多出来的内存在哪里呢?答案就是虚拟内存里面,操作系统一般都会在硬盘空间开辟一块地方用作虚拟内存,假如指针P的寻址指向的是虚拟内存,那么就需要把虚拟内存中的数放入物理内存中,比如指针P指向一个4字节的整数,那么不能每次都这么繁琐的操作吧,所以操作系统中不是仅仅把P这样一个数的数据放过去,而是把P所在的数据分页整体放入物理内存中。
但是上面所述又存在一个问题,比如一个进程A占用1-200,进程B占用201-205,进程C占用206-300的地址空间,然后进程B结束后,201-205的空间就空出来了,假如这样的情况越来越多,那么内存中就会出现很多细小空闲的空间碎片,这时候操作系统就通过算法找寻出这些细小的空间碎片,然后将这些小碎片空间(不常用的物理内存)汇总交换回硬盘上的虚拟内存里,这样就保证了物理内存的高效性。
然后接着上面的,当数据被放入物理内存中的时候,接下来的操作就是把数据放入寄存器EXA里面就可以了。
上面所讲的就是寻址的过程,一个系统如果绝大部分的数据都在物理内存里面,那么系统速度很快,如果物理内存的使用量过多,就会发生频繁的分裂和与硬盘虚拟内存的交换,由于硬盘的速度较慢,所以就会影响到整个系统运行速度的稳定。