【操作系统笔记2】内存层次结构之 虚拟内存

版权声明:QQ: 1063385677 Copyright ©2019 CielleeX 本文地址: https://blog.csdn.net/Ciellee/article/details/89437055

1.虚拟内存的起因

  1. 程序规模的增长速度远远大于实际存储容量的增长速度
    软件在运行时会发现,内存越来越不够用,尤其是电脑游戏越来越大,为了让程序正常运行,需要更大的内存和更高的性能。

    理想中的存储器: 更大、更快、更便宜 的 非易失性存储器
    实际中的存储器
    Registers(寄存器<1k) —> Cache(缓存1M) —>Main Memory(主存64-512M)—>Magnetic disk(内存5-50G)—>Magnetic Tape(硬盘20-100G)

  2. 覆盖技术
    目标:在较小的可用内存中运行较大的程序,常用于多道程序系统,与分区存储管理配合使用
    原理:把程序按照其自身逻辑结构,划分位若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后顺序来运行。
    必要部分: 常用功能的代码和数据常驻内存
    可选部分:在其他程序模块运行时,需要时装入内存,平时放在外存中
    不存在调用关系的模块不必同时装入内存,从而可以相互覆盖,即这些模块公用一个分区。

    缺点:
    由程序员来把一个大的程序划分位若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度。
    覆盖模块从外存装入内存,实际上时以时间延长来换取空间节省。

  3. 交换技术
    目标: 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源。
    方法:
    ①可将暂时不能运行的程序送到外存中,从而获得空闲内存空间。
    ②操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程读入内存中(换入swap in),换入换出内容的大小为整个程序的地址空间。
    交换技术的几个问题:
    交换时机的确定:何时需要发生交换? 只当内存不够用或者不够的危险时换出。
    交换区的大小: 必须足够大以存放用户进程的所有内存映像拷贝,必须要能够对这些内存映像进行直接存取。
    程序换入时的重定位:换出后再换入的内存位置一定要在原来的位置上吗? 最好采用动态地址映射的方法。

  4. 覆盖和交换的比较
    ①覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内各个模块之间的逻辑覆盖结构。
    ②交换技术是以内存中的程序大小为单位来进行的。
    换言之,交换发生在内存中程序和管理程序或操作系统之间。而覆盖技术则发生在运行程序内部。

2.虚拟存储技术

在内存不够用的情形下,可以采用覆盖技术和交换技术,但是:
覆盖技术: 需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担。
交换技术: 以进程为交换的单位,需要把进程的整个地址空间换进换出,增加了处理器的开销。
虚拟技术: 像覆盖技术那样,不是把程序的所有内容都放在内存中,因而能够运行当前的空闲内存空间还要大的程序。但做得更好,由操作系统自动来完成,无需程序员的干涉。

虚拟技术—程序的局部性原理: 程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作地址,分别局限于一定区域内。该原理表明,从理论上,虚拟存储技术是能够实现的,而且实现了以后应该能取得一个满意的效果。

这可以表现为:
时间局部性: 一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内。
空间局部性: 当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。

虚拟技术基本概念: 在页式 或者 段式内存管理的基础上实现。
①在装入程序时,不必将其全部装入内存,而只需要将当前需要执行的部分页面或段装入内存中,就可以让程序开始执行。
②在程序执行过程中,如果需要执行的指令或访问的数据尚未在内存(缺页或者缺段),则由处理器通知操作系统将相应的页面或者段调入内存,然后继续执行程序。
③另一方面,操作系统将内存中暂时不需要使用的页面或者段调出保存在外存中,从而腾出更多的空闲空间存放将要转入的程序以及将要调入的页面或者段。

虚存技术 — 基本特征
①大的用户空间: 通过把物理内存和外存结合,提供给 用户的虚拟内存空间通常大于实际物理内存。即实现了两者的分离。
②部分交换: 与交换技术相比,虚拟存储的调入和调出是对部分虚拟地址空间进行的。
③不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续。

程序的编写方法对缺页率的影响:
例子:
	页面大小为4K,分配给每个进程的物理页面数位1。在一个进程中,定义了如下的二维数组 int A[1024][1024],
	该数组按行存放在内存中,每一行放在一个页面中。
	A 这个变量大概需要占用4M的内存(1024 x 1024 x 32bit),这样每一行就占用4K 的大小(整形32bit,4byte)。


程序编写方法一:
	for(j = 0; j < 1024; j++)
		for(i = 0; i < 1024; i++)
			A[i][j]=0;
	解析1: A 是按照 A[0][0], A[1][0],, A[2][0], A[3][0],
	以列来访问的话,每次访问都是跨页访问,会导致 1024x1024 次缺页中断,每次访问都需要从硬盘重新拷贝,
	整体开销非常大,效率低。


程序编写方法二:
	for(i = 0; i < 1024; i++)
		for(j = 0; j < 1024; j++)
			A[i][j]=0;
	解析2: A 是按照 A[0][0], A[0][1],, A[0][2], A[0][3],
	以行来访问,相当于一维数组了,具有 时间局部性 和 空间局部性 的特性
	这样就只需要发生 1024 次缺页中断就可以了。
  1. 虚拟页式管理
    在页式存储管理基础上,增加了请求调页和页面置换功能。
    在这里插入图片描述

页表表项:
在这里插入图片描述
逻辑页号帧号对应特定的物理页帧号。
驻留位: 表示该是在内存中,还是外存中。如果等于1表示在内存中,即该页有效。0表示在外存中,如果访问该页表项,将导致缺页中断。
保护位: 表示允许对该页做何种类型的访问。如只读,可读写,可执行等
修改位: 表示该页是否被修改过。当系统回收该物理页时,根据此位来决定是否把它的内容写回外存。如果没有修改过,则直接将这页丢弃就好了。
**访问位:**如果该页被访问过(包括读写操作),则设置此位。用于页面置换算法。

在这里插入图片描述
比如,
当运行 MOV REG, 0 时,0对应得页在内存中,物理帧号为2,则对应物理内存8K-12K之间。可以直接访问
当运行 MOV REG,3280时, 3280对应的是32K-36K之间,此时该页并不在内存中,会产生缺页中断,请求CPU 调页。

3.2 虚拟存储技术-----后备存储

一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置。
代码段: 映射到可执行二进制文件
动态加载的共享库程序段: 映射到动态调用的库文件
其他段: 可能被映射到交换文件 swap file

3.3 虚拟存储技术-----虚拟内存性能

EAT = 访问时间 * 页表命中率 + (page fault处理时间 )* (page fault几率)

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/89437055