06 操作系统中的虚拟内存管理技术

概述:在内存不够的情况下,可以采用覆盖技术和交换技术,但是这两种方法都存在一定的不足:

  • 覆盖技术:需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担;
  • 交换技术:以进程作为交换单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销。

虚存技术的目标:

  • 如同覆盖技术那样,不是把整个程序的所有内容都放在内存中,因为能够运行比当前的空闲内存空间还要大的程序。但虚存技术做的更好的一方面是,它是由操作系统自动来完成,无须程序员的干涉。
  • 如同交换技术那样,能够实现进程在内存与外存之间的交换,因而获得更多的空闲内存空间。但虚存技术做的更好的一方面是,只对进程的部分内容在内存和内存之间交换(交换技术以一个程序为粒度)。

虚存技术之程序的局部性原理(principle of locality):指程序在执行过程中的一个较短的时期,所执行的指令地址和指令的操作数地址,分别局限于一定的区域。

进一步可细分为:

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

补充:在C语言中是按照行优先来放置数组的

示例:程序的编写方法对缺页率的影响

​ 页面的大小为4K,分配给每个进程的物理页面数为1。一个进程中,定义了如下的二维数组 int A[1024][1024],数组的空间大小为4M,因为C语言中数组是按照行优先来放置的,所以数组的每一行的大小为 4K,即一个页面大小。分析两种遍历数组元素的编程方法对缺页率的影响。

//程序编写方法一:逐列遍历
for(j=0;j<1024;j++)
    for(i=0;i<1024;i++)
        A[i][j] = 0;

//程序编写方法二:逐行遍历
for(i=0;i<1024;i++)
    for(j=0;j<1024;j++0)
        A[i][j] = 0;
  • 这两种实现方法的不同之处在于,执行过程中操作系统产生的缺页次数不同

虚存技术可以在页式或段式内存管理的基础上实现

  • 在装入程序的时候,不必将其全部装入到内存中,而只需要将当前需要执行的部分页面或段装入到内存,就可以让程序开始执行;
  • 在程序执行的过程中,如果需要执行的指令或者访问的数据尚未在内存(称为缺页或者缺段),则由处理器通知操作系统将相应的的页面或者段调入到内存,然后继续执行程序;
  • 另一方面,操作系统将内存中暂时不使用的页面或者段调出保存在外存上,从而腾出更多的空间存放将要装入的程序以及将要调入的页面或段。

虚存技术的基本特征

  • 大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有 256M的物理内存,但硬盘的容量大于 4GB (注意操作系统的内核是常驻内存的,不能被换进换出);
  • 部分交换:与交换技术相比,虚拟存储的调入和调出是对部分虚拟地址空间进行的(交换的粒度更小);
  • 不连续性:物理内存分配的不连续性,虚拟地址空间使用的不连续(即本来连续的程序内存空间,由于操作系统的换入换出操作,使得程序在外存分配的空间变得不连续,但是当这些不连续的外部存储程序,需要在内存中连续执行时操作系统会使它们再一次换入内存时变得连续)

提示:为了更好的理解知识点,博主在微信公众号中将操作系统知识进行了重新排版和插入图片。感兴趣的朋友可以扫码进行关注。

在这里插入图片描述

发布了19 篇原创文章 · 获赞 1 · 访问量 716

猜你喜欢

转载自blog.csdn.net/weixin_45615071/article/details/105505647
今日推荐