3.1.1内存管理的概念

内存管理是操作系统设计中最重要和最复杂的内容之一,虽然 计算机硬件一直在飞速发展,内存 容量也在 不断增长,但是仍然不可能将用户进程所需要的全部程序和数据放入主存中,所以操作系统必须将内存空间进行合理地划分和有效地动态分配。操作系统对内存的划分和动态分配就是内存管理的概念。 有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器,提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。 内存管理的功能有: - 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。 - 地址转换,在多道程序环境下,程序中的逻辑地址与内存中的物理不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。 - 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 - 存储保护:保证各道作业在各自的存储空间内运行,互不干扰。

程序运行的基本原理和要求

1.程序装入和链接

创建程序首先要将程序和数据装入内存,将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤: 编译:由编译程序将用户源代码编译成若干个目标模块 。 链接:由链接程序将编译后形成的一组目标模块,以及所需要的库函数链接在一起,形成一个完整的装入模块。 装入:由装入程序将装入模块装入内存运行。 程序的链接有以下三种方式 静态链接:在程序运行之前,先将各目标模块及他们所需的库函数链接成一个完整的可执行程序,以后不再拆开。 装入时动态链接:将用户源程序编译后所得到的一组目标模块, 在装入内存时面采用边装入边链接的链接方式。 运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。 内存的装入模块在装入内存时,同样有以下 三种方式: 1)绝对装入。在编译时,如果知道程序将驻留在内存的某个位置,编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址和实际内存地址完全相同,故不需对程序和数据的地址进行修改。 绝对装入只适用于单道程序环境。另外,程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换成绝对地址。 2)可重定位装入。在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其他地址都是相对于起始地址的,此时采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置装入时对目标程序中指令和数据的修改过程称为重定位,地址转换通常是在装入时一次完成的,所以又称为静态重定位。 静态重定位的特点是在一个程序装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。此外,作业一旦进入内存后,在整个运行期间不能在内存中移动,也不能再申请内存空间。 3)动态运行时装入,也称为动态重定位,程序在内存中如果发生移动,就需要采用动态的装入方式。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址变换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。 动态重定位的特点是可以将程序分配到不连续的存储区中;在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

2.逻辑地址空间与物理地址空间

编译后,每个目标模块都是从0号单元开始编址,称为 该目标模块的相对地址(或逻辑地址)。当 链接程序 将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间 。用户程序和程序员只需要知道逻辑地址,而内存管理的具体机制则是完全透明的,它们只有系统编程人员才会涉及。不同进程可以有相同的逻辑地址,因为相同的逻辑地址可以映射到主存的不同位置。 物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据最终都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址装换将逻辑地址转换成物理地址,这个过程称为地址重定位

3.内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法: (1)在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。 (2)通过采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含有最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,如果未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再交给内存单元。 当CPU调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每一个逻辑地址都需要与这两个寄存器进行核对,以保证操作系统和其他用户程序及数据不被该进程的运行所影响。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

HTTP 方法:GET 对比 POST

15540
来自专栏java一日一条

理解Cookie和Session机制

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确...

26310
来自专栏Vamei实验室

C编译: makefile基础

在编译一个大型项目的时候,往往有很多目标文件、库文件、头文件以及最终的可执行文件。不同的文件之间存在依赖关系(dependency)。比如当我们使用下面命令编译...

278100
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列18-servlet

Servlet方面 01 说一说Servlet的生命周期? servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期...

35080
来自专栏linux运维学习

linux学习第二十三篇:shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向

shell介绍 什么是shell, shell是一个命令解释器,提供用户和机器之间的交互。支持特定语法,比如逻辑判断、循环。每个用户都可以有自己特定的shel...

22190
来自专栏Golang语言社区

【Go 语言社区】学习网页开发基础 HTTP 方法:GET 对比 POST

两种最常用的 HTTP 方法是:GET 和 POST。 什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。 HTTP 的...

380100
来自专栏企鹅号快讯

py3.6+xadmin的自学网站搭建

xadmin安装 由于安装时需要依赖包并且暂时不支持py3等原因,直接pip install的方法很容易就狗带了。 说一下我在网上找到的安装方式,在GitHub...

315100
来自专栏IT可乐

Linux系列教程(四)——Linux常用命令之文件和目录处理命令

  这个系列教程的前面我们讲解了如何安装Linux系统,以及学习Linux系统的一些方法。那么从这篇博客开始,我们就正式进入Linux命令的学习。学习命令,首先...

22690
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x02实现一个反弹shell

0x02实现一个反弹shell 这个比较简单,就是用套接字,tcp三次握手,然后用subprocess模块实现命令执行 注意客户端和服务端脚本中的端口要一致,不...

31660
来自专栏源哥的专栏

客户端数据集/服务端数据集的原理和设计

最近在开发一个比较大型的项目,主要采用Activex控件做底层操作,采用Javascript做逻辑控制和处理,采用Ajax实现服务端与客户端之间的交互,而在实际...

9840

扫码关注云+社区

领取腾讯云代金券