zoukankan      html  css  js  c++  java
  • 内存管理,外存(文件/磁盘)管理,IO管理

    第三章  内存管理

    3.1,多层次的存储系统:缓和存储器的访问速度与处理机运行速度差异大的问题。

    • CPU寄存器          速度与处理机相当,很贵
    • 主存(内存)

    高速缓存         缓和处理机与内存访问速度不匹配。

    主存储器

    磁盘缓存         缓和内存与外存(磁盘IO)速度不匹配。

    • 辅存

    3.2,程序的装入与连接:

    3.2.1,程序在系统上运行的步骤:

    ①编译:将源程序编译成若干目标模块

    ②连接:将一组模块与所需库函数连接形成装入模块

    ③装入:将装入模块装入内存--将逻辑地址转化为逻辑地址

    • 绝对装入
    • 可重定位装入:早期批处理系统
    • 动态运行时装入:【重定位寄存器】,现代操作系统,

    3.3,内存管理的功能:

    内存空间的分配与回收

    内存空间的扩充(虚拟内存)

    地址转换:逻辑地址->物理地址

    • 绝对装入
    • 可重定位装入
    • 动态运行时装入

    存储保护

    • 保证各进程在自己内存空间运行,不会越界。
    • 方式:<1>上下限寄存器<2>利用重定位寄存器,界地址寄存器。

    3.4,物理内存分配:

    3.4.1,连续地址分配与管理:

    ①单一连续分配:单道程序,单任务操作系统。

    ②固定分区算法:(多道程序系统)

    将整个用户空间划分若干固定大小区域,每个区域只装入一道作业。【不产生外部碎片,产生内部碎片】

    ③动态内存分配:--可变分区分配。

    <1>数据结构:空闲分区表,空闲分区链。

    <2>内存的分配与回收:

    • 分配:若一个分区大小>=需要大小,则此空闲分区可分配给调用者,剩余空间如果小于事先规定的最小切割单位,

    则不切割。剩余空间放回空闲链。

    • 回收:因为分配时存在分割,避免内存碎片化,回收时要合并
    • 若回收分区与前一个空闲分区相邻,合并。
    • 若回收分区与后一个空闲分区相邻,合并。
    • 若与前后空闲分区都相邻,合并。

    ④动态分区算法:

    • 顺序搜索:

    <1>首次适应算法:

    • 空闲分区按地址递增排列
    • 按空闲链首地址遍历,遇到第一个能容纳的分区就分配
    • 倾向于用内存地址部分

    <2>循环首次适算法:

    • 每次不从空闲链首开始遍历,从上一次分配分区的以一个分区开始遍历。
    • 缺乏大分区

    <3>最佳适应算法:

    • 将链或表按从小到大递减方式排序
    • “最佳”指所有满足分配分区(空间>=所需空间)中空间最小的。
    • 留下很多难以利用的碎片

    <4>最坏适应算法:

    • 将链或表按从大到小排序
    • 从满足分配的分区中挑一个最大的。
    • 大进程(需要内存多的)不友好。
    • 索引分配:

    <1>快速适应算法:

    • 又称为分类搜索法,根据分区大小划分不同的空闲列表,分配时先找到能容纳的最小空闲列表,再区列表中

    找分区。

    • 空间换时间

     

    3.4.2,非连续物理内存分配:

    ①分页式储存管理:

    <1>结构

    • 页可以装入不连续的物理块中
    • 页面大小要适中,太小--页表过长,换页频繁。太大--页内碎片。(2的幂次方,1K-8K)
    • 地址结构:  【页号|偏移量】
    • 页表:记录页号和内存中的物理块号。【页表是顺序结构的(数组),页号即下标表示了,逻辑地址/页面大小】

    <2>地址变换:

    将逻辑地址转换为逻辑地址,通过逻辑地址计算出页号,从页表中找到快号,物理地址:块号+偏移量。

    <3>TLB:快表,具有块表(高速缓存,)的地址转换结构。

    <4>多级页表:所管理的内存大,页表过长,无够大连续空间存放页表,对页表进行分页。

    ②分段式储存管理:

    <1>结构:

    • 段:连续空间,不同段分散在不连续的地址块。根据模块将程序分为若干段,每段段内地址从0-段长-1。
    • 地址结构:【段号|段内地址-偏移量】
    • 段表:记录段长和和段起始地址。
    • 寻址方式:根据段号在段表中找到起始地址,判断有无越界,加上偏移量,得到物理地址。

    <2>与分页式存储的区别:

    • 页是信息的物理单位,实现内存的离散分配,减少碎片,完全是系统行为。

       段是信息的逻辑单位,更好的满足用户需求。

    • 页的大小是固定的,由系统决定,段长是不固定的,决定于程序。
    • 分页的用户程序地址空间是一维的,分页是系统行为。分段的用户程序地址空间是二维的,需给出段号和偏移量。
    • 分段的用户程序容易实现信息的共享和保护。

    ③段页式存储管理:

    <1>先对程序分若干个段,再对每个段分页,逻辑地址【段号|页号|页内地址】

    <2>段表:【段号|页表大小|页表始址】

    3.4,虚拟存储器:

    • 具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统,其逻辑容量由内存容量和外出容量之和所决定

    其运行速度接近于内存速度,而每位成本却又接近于外存。

    • 传统存储管理方式的特征:

    ①一次性:作业必须一次性全部装入内存后才开始运行。

    ②驻留性:一旦作业装入内存,会一直驻留在内存,直至作业运行结束。

    • 局部性原理:

    ①时间局部性:如果执行了程序中某条指令,不久之后这条指令很可能再次执行。

    某个数据访问,不久后很可能再次被访问。(因为程序中有大量循环)

    ②空间局部性:一旦程序访问了某个存储单元,不久之后其附近的存储单元很可能被访问。(因为很大数据是连续存放的)

    ③局部性原理的应用:

    <1>高速缓存技术思想,将近期会频繁访问的到的数据放到更高速的存储器中,暂时用不到的数据放在更低的存储器中。

    <2>TLB快表,

    • 特性:

    ①多次性:一个作业的数据和程序允许分成多次调入内存。

    ②对换性:一个作业中的程序的数据,无需在作业运行时一直常驻内存,可换进换出

    ③虚拟性:从逻辑上扩充内存容量

    • 请求分页式存储管理方式:

    ①请求页表机制:【页号|物理块号|状态|访问字段|修改为位|外存地址】

    状态标识该页是否在内存,访问字段记录一段时间内被访问次数,修改位,若被修改换出内存时需要写回外存。

    ②缺页中断机制:

    • 当访问某页时,若该页不在内存中,产生缺页中断。
    • 中断处理:将目标页调入内存或换出页面。
    • 缺页中断为内中断
    • 一条指令可能产生多次缺页中断

    ③地址转换机构

    • 访问块表,命中则分获取物理地址
    • 未命中,查页表,在页表,则计算物理地址
    • 未查到,缺页中断,进行相应置换。
    •  页面置换算法:

    ①最佳置换算法:理论上的,无法实现,所选取的淘汰页面将是以后永远不使用的。

    ②先进先出置换算法FSFO:最直观,性能最差,应用极少

    ③LRU,(最近最久未使用)算法:赋予每个页面对应页表项中,用访问字段记录该页面自上次被访问以来经历的时间t,当需要淘汰时,

    选一个最大的t淘汰。

    ④Clock置换算法,将所有页面,当页面被分为后,访问位设1,置换算法选择淘汰页时,遍历队列检测访问位,若是0,则换成。

    若是1,将其置0,循环遍历直到找到0;

    最多经历两轮即可找到淘汰页。

    ⑤改进Clock置换算法:增加一个因素:置换代价。将一个页面换出时,若页面数据已修改,需要重新写回外存。

    访问位A,修改位:M

    <1>A=0,M=0,最近未被访问,也没被修改,最佳淘汰页。

    <2>A=0,M=1,表示最近未被访问,被修改,并不是很好的淘汰页

    <3>A=1,M=0,最近已被访问,未被修改,该页可能再被访问。

    <4>A=1,M=1,最近已被访问,已被修改,该页可能再被访问。

    【1】遍历队列,寻找第一类页面,找到则换出。

    【2】1未找到,则进行第二轮,寻找第二类,并将扫描过的页面的访问A该为0,找到则换出

    【3】2未找到,重复第一步,若失败,重复第二步,这一步一定能找到A=0,M=1的页面。

    最多经过4轮能找到。

     

    第四章  外存管理(磁盘管理+文件管理) 

    4.1,相关名词:

    • 磁盘:外存的主要构成,存放大量文件,磁盘IO速度高低,直接影响系统性能。
    • 盘面:磁盘设备(硬盘)中包括多个物理盘片,每个盘片有一个或两个盘面。
    • 磁道:每个盘面有若干磁道,磁道间有“间隙”Gap。
    • 柱面:所有盘面的相同位置磁道构成的一个住面。
    • 扇区:每条磁道又被从逻辑上划分成若干扇区,一个扇区称为一个盘块或数据块。

    4.2,磁盘访问时间:

    ①寻道时间:将磁头移到指定磁道所花费的时间。

    ②旋转延迟时间:将指定扇区移动到磁头下面的时间,不同磁盘旋转速度不一样。

    ③传输时间:指把数据从磁盘读出或向磁盘写入所经历的时间,--和磁盘旋转速度有关。

    • 其中①和②占了绝大多时间。

    4.3,磁盘调度算法:

    • 为了减少对文件的访问时间,由于磁盘访问时间主要花在寻道上,即调度算法目的是使磁盘平均寻道时间最短。

    ①先来先服务FCFS:

    ②最短寻道时间优先SSTF:保证每次寻道时间是当前队列中最短的,但无法保证平均寻道时间最短。

    • 贪心,只选择眼前最优的,可能导致饥饿。

    ③扫描算法SCAN:最短寻道时间优先实际上是一种优先级算法,优先级低的进程易饥饿。

    • 扫描算法不仅考虑下一个访问磁道与当前磁道的距离,还考虑磁头当前的移动方向。如:当前磁头正由里向外移动

    应当是再本磁道外,且距离最近的优先。扫描到最外再向里扫描。

    • 电梯调度算法。

    -:对各个部分磁道响应频率不同,边缘部分,折返时又会遍历一遍,而中部的遍历时间相对较久。

    ④Lock算法:扫描算法中,磁头每次要遍历所有磁道,当像一个方向遍历时,队列中已经没有该方向上磁道的访问了,这时磁头就可以转向另一个方向遍历了。

    Lock算法(观望)就是解决这个问题的。

    ⑤循环扫描算法C-SCAN:解决SCAN算法中对各个磁道响应频率不同。规定磁道只沿一个方向移动,到达最端后直接返回起点遍历。

    ⑥ C-Look算法:只有磁头移动的方向上没有请求了,直接返回起点。

     

    4.4,磁盘存储器(外存)管理:

     4.4.1,外存分配方式(外存的组织/管理方式):

    ①连续分配方式:将每一个文件分配一组相邻的盘块,通常是同一个磁道上。读写时不必移动磁头。

    • 顺序文件结构--顺序文件

    +:易访问,顺序访问速度快

    -:<1>内存碎片化,<2>需要预知文件大小, <3>删除文件不灵活 <4>不能动态增长文件。

    ②连接分配:将文件装入多个离散的盘块,再通过连接指针连接成链表。

    • 隐式连接:文件控制块 FCB中包含指向第一个和最后一个盘块的指针。每个盘块有指向下一盘块的指针。

    --只适合用于顺序访问,即链表的随机访问问题。

    • 显示连接:建立一张连接表,将各物理块的指针都放入,整个磁盘只设置一张。每个文件的第一个

    盘块地址作为文件地址放入FCB中。找第i块时,在FAT中遍历找到其物理块号,再去访问。

    <1>FAT技术(文件分配表),引入卷(CDEF盘,每个)

    <2>MFT

    ③索引分配:显示连接虽然解决了,离散分配随机访问的问题,但也带来了新问题:<1>不支持高效直接存取。<2>FAT占用较大空间

    • 单级索引:为每个文件分配一个索引块,顺序存放该文件用到的的盘块号,FCB中存放文件索引块的地址,不用将FAT调入内存,文件较大时适合。

    +:<1>支持直接访问,如某文件第i块,在索引块中找到盘块号得到物理地址即可。<2>无内存碎片。

    -:小文件(只占10几个块以内)采用索引分配(一个块可以存放数百个块号)

    • 多级索引:每一个索引盘块,容纳的盘块号数量有限,大文件可能需要很多盘块号。---多级索引。

    +大大加快文件查找速度。

    -:<1>所需启动磁盘的次数随索引级数的增加而增多,<2>实际情况:小文件居多,大文件较少,采用多级索引分配效果不理想。

    •  增量式索引分配:对小,中,大,特大文件,采用不同分配方式。若盘块大小为1~4KB。
    • 对于小文件(少于10个盘块1~10K,4~40K):将所有盘块地址都放入FCB--直接寻址。
    • 中等文件(11~256K,5~4MB):可采用单级索引分配--一次间址。
    • 大型文件:采用多级索引,--二次/多次间址。

     4.5,文件管理:

    4.5.1,文件分类

    ①系统文件。用户文件。库文件。

    ②源文件(ASCII或汉字)。目标文件(由源文件编译生成)。可执行文件.exe

    ③只执行文件。只读文件。读文件。

    ④普通文件。目标文件。特殊文件(指系统中各类IO设备,为统一管理,系统将所有IO设备视为文件。

     4.5.2,磁盘分区:文件区+目录区。

    ①文件目录:一种数据结构,

    • 功能:<1>按名存取<2>提高检索速度<3>文件共享<4>允许文件重名(不同路径下)
    • 为构建目录,需要对文件设置用于描述和控制的文件的数据结构。FCB

    ②FCB文件控制块:包含文件基本信息:<1>文件名<2>物理位置<3>类型,大小<4>文件结构

    ③索引节点:改进FCB,提高索引搜索效率。

    • 存储除文件名外的所有的信息。
    • 索引时用到的信息较少,不用将目录加载如内存
    • 目录中只含有文件名和指向文件索引节点的指针。

     4.5.3,文件的逻辑结构:

    • 无结构文件:由一系列二进制流或者字符流组成的“流文件”。.txt
    • 有结构文件:由记录组成。如excel,sql。记录又可分为定长记录,变长记录。

           <1>顺序文件。<2>索引文件。<3>索引顺序文件。

    ①顺序文件:

    • 链式存储:可变长/定长记录都不能实现随机存取。
    • 顺序存储:

    可变长记录:无法实现随机存取

    定长记录:可实现随机存取

      串结构:无法快速找到某关键字对应的记录。

      顺序结构:可以快速找到某关键字对应的记录。

    ②索引文件:解决可变长记录文件查找慢的问题。

    • 每个文件建立一张索引表,索引表表项为文件中的记录。
    • 适用于对信息的及时处理要求比较高的场合。
    • 可以对不同数据项建立不同索引表。

    ③索引顺序文件:

    • 让每一个记录对应一个索引表表项太过浪费。
    • 让一组记录对应一个索引表项。
    • 多级索引。

    4.5.4,文件的物理结构:外存中分配/组织方式

    ①连续分配:每个文件在磁盘上占用一组连续的块。

    +:<1>读写速度快,磁头移动距离短。<2>可随机访问

    -:<1>文件扩展不方便,(如文件后无足够大连续空间只能移动位置)<2>外存碎片。

    ②连接分配:

    • 隐式连接:FCB中有记录起始块号和结束块号。
    • 每个块有指向下一块的指针。(链表不支持随机访问问题)

    +:方便拓展,不产生碎片

    • 显式连接:维护文件分配表FAT,表项把块号和下一块块号记录下来。
    • 一个磁盘维护一张FAT,开机后,FAT读入内存并常驻内存。

    +:支持随机访问。不产生碎片

    -:维护FAT需要空间。

    ③索引分配:允许文件离散的分配在磁盘中,为每个文件建立一张索引表,记录文件的各个逻辑块对应的物理块号。记录索引表的盘块叫索引块

    • FCB中存放索引块的地址。

    +:支持随机访问,拓展方便,

    -:索引需要一定空间

    • 若文件太大一个所有块存不下:

    <1>连接方案:每个索引块有指向下一个索引块的地址

    <2>多级索引

    <3>混合索引:避免小文件情况下浪费空间。

     

    4.6,文件存储空间管理:磁盘空闲区管理:

     4.6.1:存储空间的划分:

    ①文件卷:(逻辑卷概念)CDEF盘,

    • 一个文件卷可以由多个物理磁盘组成。
    • 一个物理磁盘可以划分为多个卷。

    ②每个卷可分为

    目录区:存放:FCB,索引节点,空闲表,超级块等

     文件区:存放文件。

     4.6.2,空闲分区管理方法:

    ①空闲表法:记录每一个连续空闲分区的起始块号和块数,

    • 适用于文件文件物理结构为连续分配方式
    • 分配与回收时要合并分区,与内存分配类似。

    ②空闲链表法:

    • 空闲盘块链:以盘块为单位链起来。一个链表。

    +:分配回收简单

    -:链很长

    • 空闲盘区链:将空闲区链成一个链,盘区是相邻的空闲盘块链(标明盘区大小)
    • 分配与回收时要合并分区,与内存分配类似

          

    ③位示图法:用一位二进制,表示一个盘块的使用情况0-空闲,1-已分配

    •  用一个二位数组表示磁盘区的盘块分配情况。

    ④成组连接法:linux系统采用。

    • 文件卷的目录区中设置一个超级块(链表头,类似索引块),系统启动会将超级块读入内存。
    • 超级块中记录了下一组空闲盘块的个数和盘块号。
    • 类似空闲盘区链,只是规定每个链的长度,如100 个,每个链中的盘块是离散的
    • 盘块的分配与回收采用头插法。

     

    第五章  IO管理

    5.1,IO系统功能:

    ①方便用户使用IO设备

    ②提高CPU和IO设备的利用率

    ③用户在共享设备时提高方便

    5.2,IO设备分类

    ①按使用特性:

    • 存储设备:也称外存/辅存
    • IO设备,键盘,鼠标,扫描仪,视频摄像,打印机,绘图仪
    • 网络通信设备

    ②按传输速率:

    • 低速:键盘
    • 中速:打印机
    • 高速:磁带机,光盘机

    5.3,IO控制器

    • 接收识别CPU发出的命令
    • 向CPU报告识别状态
    • 数据交换
    • 地址识别

    5.4,IO控制方式:控制IO设备的读和写

    ①程序直接控制方式:

    • CPU向控制器发出指令,启动设备,状态:未就绪
    • (启动完成之前)轮询其他控制器状态,就绪了就可以传送数据,将数据读入CPU寄存器
    • 启动完成,报告自己状态。(已就绪)
    • 发现设备已就绪,将数据读入CPU寄存器

    +:实现简单

    -:CPU干预频繁,CPU与IO设备串行工作,利用率低

    ②中断驱动方式

    • 由于IO设备速度慢,CPU发出读写命令后,将等待IO进程阻塞,先切换其他进程执行。当IO完成后,控制器发出一个中断信号,CPU检测中断信号

    进行进程调度,处理等待IO进程。

    • CPU执行完每个指令都会检查中断
    • 中断处理耗时,太频繁降低利用率。

    +:CPU可以与IO并行,降低CPU干预

    -:频繁中断会消耗CPU时间

    ③DMA方式:直接存储器方式

    • 数据传送以块为单位
    • 数据的流向从设备直接放入内存,或内存到设备
    • CPU干预少,只在开始和结束时干预

    +:以块为单位传输数据,CPU干预进一步降低

    -:CPU每发出一条指令,只能读/写一个或多个连续的块。离散的数据块要多条指令

    ④通道方式:--一种硬件,“低配CPU”专门处理IO的处理器,能识别通道指令

    • CPU干预低,一次给通道一组读写任务,完成后才中断,请求CPU干预
    • 数据传输单位:一组数据块

    +:CPU通道,IO设备可并行工作,资源利用率高。

    -:实现复杂,需要专门的硬件支撑

    5.5,IO系统的层次结构:

    ①用户层IO软件            实现与用户交互的接口,用户可直接调用该层提供与IO相关的库函数,对设备进行操作

    ②设备独立性软件        用于实现用户程序与设备驱动器的统一接口

    ③设备驱动程序           与硬件直接相关,用于具体实现系统对设备发出的操作指令

    ④中断处理程序           用于保存被中断进程的CPU环境

    ⑤硬件

    5.6,IO核心子系统功能:

    ①假脱机技术:SPOOling

    • 脱机技术:用外围控制机和磁带缓解纸带与CPU之间的速度差
    • 假脱机:用软件的方式模拟外围控制机模拟假脱机技术
    • 实现共享独占设备

    ②设备分配与回收

    <1>设备:

    • 独占设备:打印机
    • 共享设备:磁盘
    • 虚拟设备:SPOOLing技术的共享打印机

    <2>分配方式:

    • 安全分配方式:一个进程一次只能使用一个设备,破坏“请求保持条件”,不死锁。

    分配IO的进程将阻塞,CPU与IO设备只能串行工作

    • 不安全分配方式:一个进程可以使用多个设备

    效率高,但可能会引发死锁

    • 静态分配:进程运行前为其分配所需的全部资源,不满足则阻塞,满足则运行结束释放所有资源

    不发生死锁

    • 动态分配:动态申请设备资源。

    ③通道技术

    • 一个通道可以控制多个控制器
    • 一个控制器可控制多个设备

    5.7,缓冲区管理:

    • 缓冲区:一个内存区域,可有专门的硬件组成,也可利用内存作为缓冲区。
    • 缓冲区作用:

    <1>缓和CPU与IO设备之间速度不匹配的矛盾

    <2>减少CPU的中断频率,放宽CPU中断响应时间限制

    <3>解决数据粒度不匹配问题

    <4>提高CPU与IO设备之间的并行性

    • 单缓冲:在内存中分配一个缓冲区
    • 双缓冲:交替使用,(防止出现内存或CPU等待缓冲区写满)
    • 循环缓冲区:将多个大小相等的缓冲区连接起来
    • 缓冲池:由系统中的公用缓冲区组成

     

     

     

     

     

  • 相关阅读:
    SpringBoot2整合Spring Session
    Nginx学习笔记(二)——Nginx的常用配置
    Docker学习笔记(三)——容器提交&上传镜像
    Docker容器里使用systemctl命令报错(System has not been booted with systemd as init system)
    ab(Apache Bench)测试工具安装与使用
    SpringBoot整合Spring security实现用户权限控制
    Docker学习笔记(二)——Hello world
    TensorFlow上实践基于自编码的One Class Learning
    模块度与Louvain社区发现算法
    异常检测算法--Isolation Forest
  • 原文地址:https://www.cnblogs.com/wangpan8721/p/13962885.html
Copyright © 2011-2022 走看看