操作系统(存储管理)

操作系统(存储管理)

一,多层结构的存储器系统

计算机系统中的存储结构

主要分为:

  • CPU寄存器
  • 主存
  • 辅存

1.1主存

主存,又叫可执行存储器或内存,主要用来保存进程运行时的程序和数据,处理器都是从主存储器中取到指令和数据的,并将其所取到的指令放入到指令寄存器中,而将其数据放入到数据寄存器中,由于主存储器(内存)访问速度远远低于CPU执行指令的速度,为了缓和这一矛盾,在计算机系统中引入了寄存器和高速缓存

  • 寄存器
    • 寄存器具有和处理器相同的速度,故对寄存器的访问速度最快,完全能与CPU协调工作,但是价格昂贵
  • 高速缓存
    • 介于寄存器和内存之间,主要用于备用内存中的常用的数据,减少CPU对内存的访问次数

1.2磁盘缓存

由于磁盘的IO速度远低于对内存的访问速度,所以为了缓和两者之间在速度上的不匹配,设置了磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据和信息,减少对磁盘的访问次数,磁盘缓存是一种逻辑储存器,利用内存中的部分存储空间暂时存放从磁盘中读出或者写入的信息

二,程序的装入和链接

用户程序要在系统中运行,必须先装入内存,然后在将其转变为一个可执行的程序,需要经过三步:

  • 编译:编译程序对用户程序代码吗进行编译,形成若干个用户模块
  • 链接:将编译后形成的目标模块和他们需要的库链接在一起,形成完整装入模块
  • 装入:将装入模块装入内存

2.1程序的装入方式

将位于磁盘上的代码加载至内存的过程就是装入,在装入的过程中,会将程序代码中的逻辑地址转换为物理上的直接地址,不同的地址转换对应着不同的装入方式

2.1.1绝对装入方式

在程序代码编写的过程就确定了存储的物理地址。此时逻辑地址和物理地址保持一致。在现在操作系统中不会采用这种方式

2.1.2可重定位装入方式

在程序加载到内存地址中时,其可以存储到内存的任意位置。物理地址 = 逻辑地址(相对地址) + 物理内存加载处的起始地址(就是装入的内存位置的起始处)。 可重定位的装入方式比绝对装入灵活多了,但是其存储地址在刚载入内存后就固定了,后续不可以移动存储位置。在现在操作系统中也不使用这种方式

2.1.3动态运行时的转入方式

目前主流的装入方式是动态运行时的装入方式,**其在程序加载到内存时,不会将逻辑地址转换为直接物理地址,而是在程序代码被执行时,才会将逻辑地址转换为直接物理地址,**运行时转入,允许程序在装入内存后,依旧能在存储空间中移动,满足了内存整理等相关场景需要

2.2程序的链接

程序在经过编译之后,将形成多个目标模块,将这多个目标模块和其所需要的库函数组合成一个整体的过程即为链接

2.2.1静态连接

在程序运行之前,先将个目标模块及他们运行所需要的库函数链接成一个完整的装入模块,以后不再拆开的方式就是静态链接

2.2.2装入时动态链接

装入时动态链接就是在程序转入内存时,边装入边链接的链接方式

2.2.3运行时动态链接

在执行过程中,当发现一个被调用的模块尚未装入内存时,立即由操作系统去找到该模块,并将之装入内存,将其链接在调用者模块上,凡是在执行过程中未被用到的目标模块都不会被调入内存和被链接到装入模块

三,程序存储空间的分配

3.1连续分配存储管理

为一个用户程序分配一个连续的内存空间

3.1.1单一连续分配

在单道程序环境下,当时存储器将内存分为系统区和用户区,系统区负责提供给OS使用,工作区紧装入一道用户程序,即整个内存的用户空间由该程序独占

3.1.2固定分区分配

该方法适用于适用于多任务操作系统。其将主内存分为多个大小相等的子内存区域,当存在任务加载需求的时候,将任务加载去子内存区域。该方法采用的固定分区,灵活性不够。不能解决分区过大导致的内存碎片的问题,也不能解决分区过小导致无法载入大作业的问题。(也可以将内存固定划分为不等的子内存区域,又称为不等分区固定分配)

3.1.3动态分区分配

数据结构

  • 空闲分区表

    在系统中设置一张空闲分区表记录每个空闲分区的情况,每个空闲分区占一个表目,表中有分区号,分区大小,分区起始地址,状态等数据项

  • 空闲分区链

    将空闲分区以双向链表的形式链接起来,当分区被分配出去后,状态位由0变为1

分区分配算法

  • 首次适应算法(FF)

    在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止

    该算法倾向于优先利用内存中地址部分的空闲分区(每次都从首部开始搜索),从而保留了高址部分的大部分空闲分区,为分配大作业留了很多,但是缺点就是低址部分不断被划分,会留下很多内存碎片无法被利用

  • 循环首次适应算法(NF)

    一开始还是一样从链首开始顺序查找大小满足要求的空闲分区,但是找到后,起始查询指针会指向该空闲分区的下一个分区,下一次查找会从起始查询指针指向的空闲分区开始查找,直至找到符合要求的分区,找到链尾还没有找到就重新回到链首,缺点是缺乏大的空闲分区

  • 最佳适应算法(BF)

    该算法要求将所有的空闲分区按其容量从小到大的顺序形成一个空闲分区链,然后遍历该链,找到一个最小的又能符合要求的空闲分区,也会留下空闲碎片

  • 最坏适应算法(WF)

    最坏适应和最佳适应相反,每次总是挑一个最大的空闲分区,会缺乏大的空闲分区

3.1.4可重定位的分区分配

该存储方式,在动态存储空间分配上添加了内存整理功能。若当前内存空间不能满足任务所需内存空间时,其会将已分配的内存空间全部移动,使未分配的内存空间形成一片连续的地址空间。该种方法则要求程序的装入方式是动态装入

3.2离散存储空间分配

通过将任务拆分进行存储的方法,能极大的提高存储空间的利用率。

3.2.1页式存储空间分配

这里将定义为一个固定大小的存储单位。在将任务载入内存时,一个完整的任务可以被划分成多页。每页独立的存储到内存空间中,内存空间中存储位置可用物理页号描述。每页的存储是连续,页与页之间的存储并不是连续的,而是离散存储的。 为了建立任务的地址与物理空间地址之间的联系。在内存表中将建立页表,完成页号到物理号的映射

页表

3.2.2段式存储空间分配

段式存储的方法和页式存储的方法手段都是一致。将任务以**段为存储单位,将任务分成多段进而离散存储。**在内存中同样维护了一张段表。段表和页表结构是一致的。

段表

3.2.3页式存储和段式存储比较

  • 页是信息的物理单位,分页式为了减少内存碎片,提高内存利用率而提出的。段是信息的逻辑单位,它包含一组完成的逻辑意义,其不仅能提高内存利用率,而且在方便编程,信息共享,信息保护等方面均有好处。

  • 页的大小是有操作系统固定设计的,在系统中页的大小是固定且唯一的。段长度并不是固定的,取决于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质决定。

发布了254 篇原创文章 · 获赞 136 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41922289/article/details/103473825