内存管理
内存管理:在单道程序设计系统中,内存被分为两部分:一部分供操作系统使用,一部分供当前正在执行的程序使用。在多道程序设计系统中,必须在内存中进一步细分出“用户部分”,以满足多个进程的要求。细分的任务由操作系统动态完成,这成为内存管理。
内存管理术语:
页框:内存中一个固定长度的块。
页:一个固定长度的数据块,存储在二级存储器中(如磁盘)。数据页可以临时复制到内存的页框中。
段:一个变长的数据块,存储在二姐存储器中。整个段可以临时复制到内存的一个可用区域内(分段),或者可以将以段分为许多页,将每页单独复制到内存中(分段与分页相结合)。
内存管理需求:
重定位:内存通常是由很多个进程共享的,假如进程A和B共享地址DD,那么如果在A运行时候你想运行B,那么这时候就会出现B无法进入地址DD的问题,所以我们这时候需要采用重定位技术,将B加载到其它地址去,不能让进程在一棵树上吊死啊。
保护:假如将进程比作你女朋友,如果她不能受到保护,后果可想而知。而且不能是绝对地址保护,必须是在运行时检查进程产生的所有内存访问,这个得交给警察(处理器—硬件)来保护了,你不可能保护你女朋友走过的每一寸土地啊。当然啦,用户系统不能访问操作系统的任何部分。
共享:任何保护机制都必须具有一定的灵活性,以允许过个进程访问内存的同一部分。
逻辑组织:暂不知该如何描述
物理组织:暂不知该如何描述
内存分区
内存管理技术:
技术 | 说明 | 优势 | 弱点 |
固态分区 | 在系统生成阶段,内存被划分成许多静态分区。进程可以被装入到大于或等于自身大小的分区中。 | 实现简单,只需要极少的操作系统开销 | 由于有内部碎片,对内存的使用不充分;活动进程的最大数目是固定的 |
动态分区 | 分区是动态创建的,因而使得每个进程可以被装入到与自身大小正好相等的分区中 | 没有内部碎片;可以更充分地使用内存 | 由于需要压缩外部碎片,处理器利用率低 |
简单分页 | 内存被划分成许多大小相等的页框;每个进程被划分成许多大小与页框相等的页;要装入一个进程,需要把进程包含的所有段都装入到内存不一定连续的某些页框中 | 没有外部碎片 | 有少量的内部碎片 |
简单分段 | 每个进程被划分成许多段;要装入一个进程,需要把进程包含的所有段都装入到内存内不一定连续的某些动态分区中 | 没有内部碎片;相对于动态分区,提高了内存利用率,减少了开销 | 存在外部碎片 |
虚拟内存分页 | 除了不需要装入一个进程的所有页之外,与简单分页一样;非驻留页在以后需要时自动调入内存 | 没有外部碎片;支持更高道数的多道程序设计;巨大的虚拟地址空间 | 复杂的内存管理开销 |
虚拟内存分段 | 除了不需要装入一个进程的所有段之外,与简单分段一样;非驻留段在以后需要时自动调入内存 | 没有内部碎片;支持更高道数的多道程序设计;巨大的虚拟地址空间;支持保护和共享 | 复杂的内存管理开销 |
固定分区:又分为分区大小相等和大小不等两种情况,其中分区大小相等容易造成内部碎片,分区大小不等在系统生成的时候就确定了分区数目,这限制了系统中活动进程的数目,而且极易造成小作业不能有效利用分区空间的情况。
动态分区:其分区长度和数目是可变的。当进程被装入内存时,系统会给它分配一块和它所需容量完全相等的内存空间,不多也不少。但随着时间的推移,内存中产生了越来越多的碎片,内存的利用率随之下降,这种现象称为外部碎片。为了解决外部碎片问题,引入了压缩技术对外部碎片进行压缩,但这却会对cpu造成额外的开销。
伙伴系统:固定分区和动态分区都有缺陷,于是引入了伙伴系统,其实就是把内存划分成切成AB两份,如果进程大小刚好大于B的一半,小于或等于B,就将进程放在B中,否则B继续切成等大的两块。进程释放后就再将两块等大的内存合并起来。
重定位:
逻辑地址是指与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须把它转换成物理地址。相对地址是逻辑地址的一个特例,是相对于某些已知点的存储单元。物理地址或绝对地址是数据在内存中的实际位置。
一个进程是不可能已知占用某个固定物理地址而不改变的。它是可改变的,所以我们需要一个硬件机制,在一个进程被首次加载时,代码中的相对内存访问被绝对的内存地址代替,这个绝对地址由进程被加载到的基地址确定。
分页:将内存划分成大小固定相等的块,切块相对比较小,这个称为页框,进程也分为同样大小的小块,称为页。然后系统会为每个进程分配一个也表,这样将页装入各个页框中后,即使地址不连续也没关系。
分段:
分段技术和分页技术原理差不多,不过段的最大长度有限制,但是段大小并不需要相等。
安全问题:
内存和虚拟内存是容易受到安全威胁的系统资源。进程中的内存,未授权则不允许访问,除非其中的某部分已经声明可以被指定的程序共享,而且操作操作必须保证只有被指定的线程可以访问这部分内存。
缓冲区溢出攻击,也即内存越界。
预防缓冲区溢出:
编译时防御系统,目的是强化系统以抵制潜伏于新程序中的恶意攻击。
运行时防御系统,目的是检测并中止现有程序中的恶意攻击。
参考资料:《操作系统——精髓与设计原理》第七版,电子工业出版社,作者:Willian Stallings