内存管理的需求
内存管理包括以下方面:
重定位
一旦程序被换出到磁盘,当下一次被换入时,如果必须放在和被换出前相同的内存区域,那么这将会是一个很大的限制。为了避免这种限制,需要把进程重定位到内存的不同区域,通过交换技术在实现在内存中移动,这关系到寻址相关的技术。 内存换入换出的目的是提高处理器的利用率,换入换出的时机是根据进程的状态,当进程编程就绪态时,程序有可能换出。
保护
该进程以外的其他进程中的程序不能未经授权地访问该进程的内存单元。
大多数程序设计语言允许在运行时进行地址的动态计算(通过计算数组下标或数据结构中的指针)。
内存保护的需求必需由处理器来满足,而不是由操作系统(软件)来满足。
共享
允许多个进程访问内存的同一部分,内存管理系统必须允许对内存共享区域进行手控访问,而不会损害基本的保护
逻辑组织
计算机系统中的内存总是被组织成线性的地址空间,并且地址空间是由一系列字节或字组成的。然而,大多数程序被组织成模块,一些模块是不可修改(只读),一些模块包含可以修改的数据。
物理组织
计算机存储器至少要被组织成两级:内存和外存。在这种两级方案中,系统主要关注的是内存和外存之间信息流的组织。存储管理的本质所在就是内存和外存的信息移动。
内存分区
固定分区
在系统生成阶段,内存被划分成许多静态分区。进程可以被装入到大于或等于自身大笑的分区中。
实现简单,操作系统开销极少
存在内部碎片,对内存的使用不充分;活动进程的最大数量是固定的
动态分区
分区是动态创建的,因而使得每个进程可以被装入到与自身大小正好相等的分区中。
没有内部碎片,可以更充分地使用内存
需要压缩外部碎片,处理器利用率低。
可供考虑的三中放置算法
- 最佳匹配。选择与要求的大小最接近的块
- 首次匹配。从开始处扫描内存选择大小足够的第一个可用块
- 下次匹配。从上一次放置的位置开始扫描内存,选择下一个大小足够的可用块。
伙伴系统
内存地址
当第一次创建一个进程映像时,它被装入内存中的某个分区,以后该进程可能被换出,当它再次被换入时,可能被指定到与上一次不同的分区中。当使用压缩时,内存中的进程也可能会发生移动。总之,当进程被换入火在内存中移动时,指令和数据单元的位置会发生改变。
地址类型
- 物理地址,或绝对地址,是数据在内存中的实际位置
- 逻辑地址,指与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须把它转换成物理地址
- 相对地址,是逻辑地址的一个特例,是相对于某些已知点的存储单元
系统采用运行时动态加载的方式把使用相对地址的程序加载到内存。相对地址转换成物理内存地址通过硬件机制完成。运行时动态加载涉及基址寄存器,界限寄存器,加法器,比较器
分页
内存被划分成大小固定想等的块切块相对比较小,每个进程也被分成同样大小的片段,那么进程中称为页的块可以指定到内存中称为页框的块。
分页技术存在进程最后一页的内部碎片,没有外部碎片。分页对程序员是透明的。
页表
操作系统为每个进程维护一个页表。页表给出了该进程的的每一页对应的页框的位置。
在程序中,每个逻辑地址包括一个页号和该页的偏移量。处理器使用页表产生物理地址。页的大小以及页框的大小必须是2的幂
分段
采用分段技术,可以把程序和其相关的数据划分到几个段中。段中有一个最大程度限制,但是不要求所有的程序的所有段的长度都相等,因此逻辑地址和物理地址间不再具有简单的对应关系。采用分段技术的逻辑也是由两部分组成:段号和偏移量。
每个进程都有一个段表,系统也会维护一个内存中的空闲块列表。分段对程序猿可见,作为组织程序和数据的一种方便手段提供给程序员。
段表
包含段在内存中的起始地址、指明段的长度。
分页技术和分段技术的区别:
+ 每个页的大小固定,而每个段的长度可以不相同。因此分页有内部碎片,无外部碎片,分段消除了内部碎片,有外部碎片。
+ 分页对程序员是透明的,分段对程序猿是可见的。
安全问题
缓冲区溢出
也叫内存越界,输入到一个缓冲区或者数据保存区域的数据量超过了其容量,从而导致覆盖了其他信息的一种状态。
当一个进程试图向一个固定大小的缓冲区中存储的数据量超过了该缓冲区的限制区时,会覆盖相邻的内存单元,这种缓冲区溢出可能是由编程错误造成的。缓冲区可以位于堆、栈或者进程的数据段。