实验证明,在一个进程的执行过程中,其大部分程序和数据并不经常被访问。这样,存储管理系统把进程中那些不经常访问的程序和数据放入外存中,待需要访问它们时再将它们调入内存。那么,对于那些一部分数据和程序段在内存而另一部分在外存的进程,怎么安排它们的地址?
编译链接程序把用户源程序编译后链接到一个以0地址为始地址的线性或多维虚拟地址空间。每个指令或数据单元都在这个虚拟空间中拥有确定的地址,这个地址称为虚拟地址(virtual address)。进程在该空间的地址排列可以是非连续的,其实际物理地址由虚拟地址到实际物理地址的变换得到。由源程序到实际存放该程序指令或数据的内存物理位置的变换如下图所示。
进程中的目标代码、数据等的虚拟地址组成的虚拟空间称为虚拟存储器(virtual store 或 virtual memory)。与实际物理存储器数量有限,且被所有进程共享不一样,每个进程都拥有自己的虚拟存储器,且虚拟存储器的容量是由计算机的地址结构和寻址方式确定的。
编译链接主要是语言系统的设计问题,而虚拟存储器到物理存储器的变换是操作系统必须解决的问题。要实现这个变换,必须要有相应的硬件支持,并使这些硬件能够完成统一管理内存和外存之间数据和程序段自动转换的虚拟存储器功能。
把几个线性或多维虚拟地址空间变换到内存的唯一的一维物理线性空间称为地址变换,主要涉及涉及两个问题:虚拟空间的划分和地址重定位。
通过虚拟地址划分,实现将不同的程序模块链接到一个统一的虚拟空间中。
在虚拟空间程序执行之前有装配程序完成地址映射工作。
不需要硬件支持
在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址。
地址重定位机构需要一个(或多个)基地址寄存器BR和一个(或多个)程序虚拟地址寄存器VR。指令或数据的内存地址MA与虚拟地址的关系为MA=(BR)+(VR)。
覆盖技术要求用户清楚的了解程序的结构,并指定各程序段调入内存的先后次序。
交换方式由操作系统把那些在内存中处于等待状态的进程换出内存,而把那些等待事件已经发生、处于就绪态的进程换入内存。
在程序运行时,如果所要访问的程序段或数据段不在内存中,则操作系统自动地从外存将有关的程序段和数据段调入内存。
由操作系统预测在不远的将来会访问到的那些程序段或数据段部分,并在它们被访问之前选择适当的时机将它们调入内存。
存储管理模块要为每一个并发执行的进程分配内存空间。另外,当进程执行结束之后,存储管理模块又要及时回收该进程所占用的内存资源。
为了有效合理地利用内存,设计内存的分配和回收方法时,必须考虑和确定一下几种策略和数据结构。
登记内存使用情况以及供分配程序使用的表格与链表。利于内存空闲表、空闲队列等。
确定调入内存的程序和数据在内存中的位置。这是一种选择内存空闲区的策略。
在需要将某个程序段和数据段调入内存时,如果内存中没有足够的空闲区,有交换策略来确定内存中的哪些程序段和数据段调出内存,以便腾出足够的空间。
外存中的程序段和数据段什么时间按什么样的控制方式进入内存。
回收策略包含两点,一是回收的时机,二是对所回收的内存空闲区和已存在的内存空闲区的调整。
上下界保护法是一种常用的硬件保护法。上下界保护技术要求为每个进程设置一对上下界寄存器,其中装有被保护程序和数据段的起始地址和终止地址。
保护键法也是一种常用的存储保护法。保护键法为每一个被保护存储分配一个单独的保护键。在程序状态字中则设置相应的保护键关键字,对不同的进程赋予不同的开关代码与被保护的存储块中的保护键匹配。
界限寄存器与CPU的用户态或核心态工作方式相结合的保护方式。在这种保护方式下,用户态进程只能访问那些在界限寄存器所规定范围内的内存部分,而核心态进程则可以访问整个内存地址空间。
[1] 张尧学. 计算机操作系统教程[M]. 清华大学出版社, 2018.
本文地址:https://blog.csdn.net/qq_40634175/article/details/107293606
如对本文有疑问, 点击进行留言回复!!
asp.net使用三层架构实现简单的增删改查(1)—— 搭建三层架构
分布式计算是指系统的工作方式,主要分为数据分布式和任务分布式
Spark Core快速入门系列(1) | 什么是RDD?一文带你快速了解Spark中RDD的概念!
Spark Core快速入门系列(2) | Spark Core中编程模型的理解与RDD的创建
IOS-海外版授权分享推送统计 Google FaceBook Twitter Instagram
网友评论