基本分段管理:
类似于分页管理,只不过这里分段是按照程序本身的逻辑进行分段的,因此每个段之间的大小是可以不一样的
段表:能够根据逻辑地址查询段表就能够查询到物理地址。
下面的段表项:6B(字节)
地址转换:
在CPU的段表寄存器当中含有两个数据:段表起始位置,段表长度
具体过程:
分页和分段的区别:
段页式管理:
地址转换的过程:
虚拟内存管理:
传统储存管理方式的特征和缺点:
传统的内存管理方式,在作业调度的时候,需要将一整个作业数据(可执行文件)加载进内存当中,同时在该进程运行期间,该作业数据会一直存在内存当中,直至进程结束。这样就会导致两个问题:
-
如果一个作业的数据量特别大,比你机器的内存容量还要大,那么就会无法加载进内存当中
-
作业数据在进程运行期间一直处于内存当中,便会占用很多内存空间,导致无法并发处理多个进程
虚拟内存主要就是在进行作业调度的时候,不是将所有的数据全部都加载进内存当中,而是将一部分需要的数据加载进内存当中。当进程运行时发现需要访问的数据还未加载进内存,这个时候才会将需要的数据加载进内存。同时,在内存当中如果内存空间不够的时候便会将内存当中暂时用不到的数据置换到内存的外面。
我们所玩的游戏就是如此,一个大一点的游戏就有几十个G,而我们电脑的内存只有8G或者是16G无法将全部的游戏数据全部加载进内存当中,因此这里使用的就是虚拟内存技术,只是将一部分CPU运行需要的数据加载进了内存当中,当需要其他数据资源的时候,才会将新数据加载进内存当中。
请求分页管理方式:
这是最常用的实现虚拟内存的技术。
请求分页管理方式当中的页表:
请求分页管理当中的执行流程主要是通过缺页中断来实现的:
当系统执行时,发现所需要的数据还未加载进内存当中,便会触发一个缺页中断,然后进程状态变成阻塞状态,CPU执行IO命令,IO硬件进行数据传输。
具体的执行流程:
页面置换算法:
Linux内核现在使用的页面置换算法是两级的软件LRU,也就是分为active和inactive类型的两个链表,并实现软件LRU(NFU)算法,由于基于硬件的LRU在当今的体系结构中无法实现,下文中我们把这一种算法简称为LRU。
【额外补充】CPU架构知识:
CPU架构分为两种:
-
32位机:X86
-
64位机:X86-64,X64,AMD64(这三个是同一个东西,只不过是由于商业问题,intel和AMD两家公司叫法不同)
现在使用的CPU架构几乎都是64位的,市场的大部分的CPU也都是64位的
在之前的32位CPU架构中,内存管理使用的是段页式管理,因此需要先通过逻辑地址中的段号对照段表求出线性地址,然后根据逻辑地址当中的页表+页号对照页表项页表和页内偏移地址求出数据的物理地址。
虚拟地址就是偏移地址的别称。
在如今的64位架构当中,段的概念已经被淡化,也就是不再对进程进行分段,只需要考虑分页。因此此时,虚拟地址就等于逻辑地址等于线性地址。