操作系统-2
本章主要总结操作系统中的内存管理 随着技术的发展,内存的容量再不断增大,但是也不能把所有用户数据和程序一起装入内存,因此操作系统需要对内存空间进行合理的划分和有效的动态分配,从而提高系统的资源利用率。对内存的合理划分以及有效的动态划分就是内存管理的概念。 程序执行过程 每段程序执行前大致需要经过三个过程:编译 -> 链接 -> 装入 编译:将源代码通过编译器编译为一个个目标模块。 链接:将每个目标模块和所需库函数链接起来,形成一个完整的装入模块。 静态链接(装入前链接),即在装入内存之前把所有的模块和对应的库函数进行链接从而形成一个可执行程序,以后不会再拆开。 装入时动态链接,即在装入内存时,一边装入一边链接。 运行时动态链接,即在执行对应模块代码时,实时链接。 装入:将链接后形成的模块装入内存中。 绝对装入 => 程序相对地址和实际装入的物理地址相同。 可重定位装入 => 程序相对地址加一个重定位地址形成实际的物理地址。 动态运行时装入 => 在执行对应的模块时,才开始执行地址转换,地址转换的偏移量则从重定位寄存器中取出。 内存分配管理方式 连续分配方式:用户程序被分配进一个连续的内存空间 单一连续分配方式: 整个内存中只运行一道用户程序。 固定分区分配 内存被划分为若干个固定大小的区域。当有程序需要装入内存时,从分区说明表上寻找合适的内存区域并分配给它。 动态分区分配 => 不预先对内存进行分区,而是等程序装入内存时动态分区。 首次适应算法 最佳适应算法 最坏适应算法 邻近适应算法(首次适应算法的改进,即下一次分配内存是从上一次分配内存结束位置开始) 区分内部碎片还是外部碎片的关键在于:内存分区是提前分好还是运行时实时分配的。 对于前者,很容易理解每个内存分区就可以称之为“内”,所以就有了内部碎片的说话。 对于后者,由于没有提前分区,所以自然没有“内”的概念,那么所有的内存都是“外”,所以此时产生的碎片也称为外部碎片。 即固定分区会产生内部碎片,动态分区会产生外部碎片。 非连续分配方式 基本分页存储管理方式 => 一维表示即可,即给定一个地址,便可以算出它的页号以及偏移地址(因为页的大小是确定的) 基本分段存储管理方式 => 二维表示,因为每段的大小不同,导致一个地址无法算出其它信息,段号和段内位移地址要显式给出 段页式存储管理方式 => 对代码分段,对内存分页。 分页系统和分段系统的共同之处: 它们都有对应的“表”,分页系统是页表,分段系统是段表。当然对于表来说也有对应的寄存器(页表/段表寄存器) 它们都可以加入**快表(联想存储器 TLB)**来提高地址转移效率。 不同之处: 分页系统的地址可以进行一维表示,而分段系统的地址需要二维表示。 分段系统中的每段是具有一定逻辑意义的代码集合(比如一块函数定义),方便代码共享。 虚拟内存 局部性原理 => 高速缓存技术依赖的原理 时间局部性:程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问,不久后该数据可能再次被访问。产生时间局部性的原因是程序中往往含有大量的循环操作 空间局部性:一旦程序访问了某个存储单元,不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在某个区域。 虚拟存储器 根据局部性原理,程序装入时,可以只将程序的部分装入,其余部分留在外存。程序执行过程中,若程序不在内存中,则从外存中调入对应部分的程序代码,然后继续执行程序。另一方面,操作系统也把不再执行的代码重新换出到外存(实际情况是如果代码段没有被修改,则直接丢弃)。这样,系统好像就为用户提供了一个比内存大的多的存储器,称其为虚拟存储。 实现方式 请求分页存储管理 请求分段存储管理 请求段页式存储管理 它们都需要的硬件支持:...