概述
地址重定位
地址映射和重定位是一个概念
地址映射
为了保证 CPU 执行指令时可正确访问 存储单元 ,需将 用户程序 中的逻辑 地址转换 为运行时由机器 直接寻址 的物理地址。
地址重定位:
操作系统把用户程序指令中的相对地址变换成为所在存储中的绝对地址的过程,实现了从逻辑地址到物理地址的转换。
重定位分为:静态重定位、动态重定位静态重定位:
把作业装入内存时随即进行地址变换的方式。程序的代码发生了变化,由原来逻辑地址的程序已经变为物理地址的程序,按物理地址的方式运行,因此不能再进行移动。
动态重定位:
在程序运行过程中由硬件进行地址变换,变换的结果存放在内存地址寄存器中。程序代码并没有发生变化,仍然是逻辑地址的代码,按逻辑地址的方式运行。
- 虚地址通常指的是逻辑地址,而程序执行所要访问的内存地址指的是物理地址
- 编程是直接使用抽象的虚拟(逻辑)地址。
- 在大多数操作系统中,执行时需要地址转换。但是在实模式下逻辑地址等于物理地址,因此在实模式下不需要地址转换。
内部碎片和外部碎片
内部碎片:
已经被分配出去的内存空间大于请求所需的内存空间。
固定分区 和 页式虚拟存储系统 存在内部碎片 。外部碎片:
还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。
可变式分区分配 和 段式虚拟存储系统存在外部碎片
- 页式虚拟存储系统:为了有效的利用内存,使内存产生更少的碎片,要对内存分页,内存以页为单位来使用,最后一页往往装不满,于是形成了内部碎片。
- 段式虚拟存储系统:为了共享要分段,在段的换入换出时形成外部碎片,比如5K的段换出后,有一个4k的段进来放到原来5k的地方,于是形成1k的外部碎片。
采用以上两个互补(即段页式存储)不会产生存储器碎片
可变分区分配算法
最优适应算法:通常将空闲区按长度递增顺序排列。
最先适应算法:通常将空闲区按地址从小到大排列。
最坏适应算法:通常将空闲区按长度递减顺序排列
适应于请求段的内存分配方法是最佳适应和可变分区
可重定位分区
可重定位分区是连续分配方式,当内存碎片很多的时候,它把那些零散的数据移动,使零散的未使用的空间聚集在一起,这样就减少了碎片,但是这个过程中移动了数据,需要重定位。
采用可重定位分区分配方式解决了碎片问题
可重入代码(Reentrant Code) 又称为 “纯代码” (PureCode),是一种允许多个进程同时访问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变。
虚拟存储器
- 程序运行前不必全部装入内存且在运行过程中不必一直驻留在内存
- 基于局部性原理,在程序运行时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。
- 在程序执行过程中,当访问的信息不在内存时,由操作系统将所需的部分调入内存,然后继续执行。
- 另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入的信息。
目的:扩充主存容量
最基本的特征:多次性
最主要的技术是:部分对换
虚拟存储的实现是基于程序局部性原理,其实质是借助外存 将内存较小的物理地址空间转化为较大的逻辑地址空间。
内存和外存
- 内存(主存)直接给CPU提供存储,高速,低容量,价格贵,不能永久保存数据,断电消失,需要从辅存中重新调入数据。
- 外存(辅存)给主存提供数据,低速,大容量,价格低,能永久保存数据。
- 所以更高缓存的CPU和更大的内存能够大大提升系统的性能。
- 常见主存有:CPU的高速缓存,电脑的内存条。
常见辅存有:硬盘、光盘、U盘、磁盘、移动硬盘等等。
计算虚拟存储器的容量
计算机中(虚拟存储器)容量(个数)最多
一般情况下虚拟内存的大小大于物理内存与外部存储的大小总和。虚拟存储器最大实际容量= min(计算机地址,内存+辅存)。
内存+辅存 即内、外存容量之和
计算机地址 即 CPU逻辑地址给出的空间大小
例如:段的逻辑地址形式是段号10位,段内地址20位,内存1MB,辅存10GB。那么虚拟存储器最大实际容量可能是(1024M)。
计算机地址= 2^ 10* 2^20=1024M=1GB
内存+辅存 = 1MB+10GB
计算机地址<内存+辅存
对应于kb,mb,gb的换算式如下
2^10b = 1kb
2^20b = 1mb = 1kb*2^10
2^30b = 1gb =1mb*2^10
2^32 = 2^2*1gb = 4gb
虚存管理和实存管理
主要区别
实存要求一程序全部装入内存才开始运行
虚存允许程序在执行的过程中逐步装入虚存
通过统一管理主辅存,给用户造成内存空间巨大的假象;只把运行程序最近一段时间内活跃的一个部分放进主存,提高了系统的吞吐量,从而充分利用了地址空间
虚存管理
可变分区存储管理
页式存储管理
段式存储管理
段页式存储管理例:在请求分页管理中,一个首次装入内存的页面可能来自
磁盘文件区
后备作业区
I/O缓冲池
不可能是磁盘对换区(将内存中放不下的页面暂时存放在磁盘中,其中的页面都是从内存中置换出的)
程序的链接方式:
静态链接
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
动态链接
当程序运行到需要调用某一模块时,再去链接。对于未使用的模块就可以不必链接。
装入时动态链接
将用户源程序编译后所得到的一组目标模块,在装入内存时,釆用边装入边链接的链接方式。
运行时动态链接
对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。代码程序能够装入内存任何位置。
动态链接 要求以 段 作为管理的单位,所以分段存储管理有利于程序的动态链接
中断
中断类型分为如下两大类:
一、强迫性中断:
正在运行的程序所不期望的,来自硬件故障或外部请求。
1、I/O 中断:来自外部设备通道;
2、程序性中断:运行程序本身的中断,如 溢出、缺页中断、缺段中断、地址越界。
3、时钟中断
4、控制台中断
5、硬件故障二、自愿性中断:
用户在编程时要求操作系统提供的服务,使用访管指令或系统调用使中断发生。也称为访管中断。包括执行I/O,创建进程,分配内存,信号量操作,发送/接收消息
在请求分页存储管理中,当访问的页面不在内存时,便产生缺页中断,缺页中断 属于 程序性中断
最后
以上就是个性月亮为你收集整理的操作系统之内存管理的全部内容,希望文章能够帮你解决操作系统之内存管理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复