精华内容
下载资源
问答
  • 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
  • 存储管理分页原理与算法 存储管理器:记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配,在使用完之后释放。 1. 无存储器抽象   这是一种将地址暴露给进程使得直接操作内存的方法,无存储器...

    存储管理之分页原理与算法

    存储管理器:记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配,在使用完之后释放。

    1. 无存储器抽象

      这是一种将地址暴露给进程使得直接操作内存的方法,无存储器抽象下运行多道程序的尝试:IBM 360,内存被划分为2K块,每个块被分配一个4位的保护键,通过PSW(Program Status Word,程序状态字)来保护内存,PSW中一个4位码,程序只能访问保护键与PSW四位码相同的内存块,否则操作系统会捕捉到非法访问这一事件。只有操作系统能修改保护键。带来的问题是重定向问题,程序都引用了绝对物理地址。
      多道程序运行时的问题在于都引用了绝对地址,IBM 360的解决方案是采用“静态重定向”技术,比如当程序加载到地址16384时,常数16384被加到每一个程序地址上,但是这种方法有两个弊端,1.加载时会影响装载速度,2.装载器需要一定的方法来区分地址和常数。
      由此可见,无存储抽象面临着亮点难题:保护与重定向。

    2. 存储器抽象-地址空间

    2.1地址空间概念

      地址空间为程序创建了一个抽象的内存,地址空间是一个进程可用于寻址的一套地址集合,每个进程都有一个自己的地址空间,并且这个地址独立于其他进程的地址空间(除了在一些特殊情况下进程还需要共享他们的地址空间外)。
      地址空间解决了安全的问题:避免一个进程访问另一个进程的地址。

    2.2 基址寄存器与界限寄存器

      动态重定位:把每个进程的地址空间映射到物理内存的不同部分,当使用基址寄存器和界限寄存器时,程序装载到物理内存时不需要重定位;当一个进程运行时,程序的起始物理地址装载到基址寄存器,程序长度装载到界限寄存器。
      每次一个进程访问内存时,取一条指令,读或写一个数据字,CPU硬件会把地址发送到内存总线之前自动把基址寄存器的值加到进程发出的地址值上,同时检查提供的地址是否等于或大于界限寄存器里的值,如果超过界限,则产生错误并中止访问。

    2.3 交换技术

      交换(swapping)技术即是,把一个进程完整调入内存,使进程运行一段时间,然后把它存回磁盘。空闲进程主要存在于磁盘上,所以它们不运行时就不会占用内存,

    2.3.1 空闲空间管理

    2.3.1.1 位图管理

      使用位图方法,内存被划分成小到几个字或大到几千字节的分配单元,每个存储单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。
      在决定把一个占k个分配单元的进程调入内存时,存储管理器搜索位图,在位图中找到有k个连续0的串。查找位图中指定长度的连续0串是耗时的操作,这是位图的缺点。

    2.3.1.2 使用链表管理

      维护一个记录已分配内存段和空闲内存段的链表,每个链表节点或者包含一个进程,或者是两个进程间的空闲区域,链表每个节点都包含以下域:空闲区(H)或进程(P)的指示标志、起始地址、长度或指向下一节点的指针。
      链表管理的分配算法包括:首次适配(first fit)、下次适配(next fit)、最佳适配(best fit)和最差适配(worst fit);
      如果为进程和空闲区维护各自独立的链表,上述四个算法速度都能提高,但是代价是增加复杂度和内存释放速度变慢。

    2.4 虚拟内存

      交换技术面临这个一个问题:“软件膨胀”,内存不足以装下程序;
      虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块被称为一页或页面(page)。每一页有自己的地址范围。这些页被映射到物理内存。
      虚拟内存适合多道程序设计,许多程序的片段同时保存在内存中,当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。

    2.4.1 分页

      对虚拟内存进行管理的工具是‘内存管理单元’(Memory Management Unit, MMU),当虚拟地址被送到MMU,MMU把虚拟地址映射为物理内存地址。

    图片描述

      MMU通常作为CPU的一部分,不过从逻辑上看,它可以是一片单独的芯片;但是逻辑上,它可以是一个单独的芯片,并且早就是这样了。
      虚拟地址空间按照固定大小划分成‘页面’(page)的若干单元;在物理内存中与之对应的单元被称为‘页框’(page frame),页面和页框大小通常一样。
      RAM与磁盘之间的交换总是以整个页面为单元进行。
      原理演示:虚拟地址8192(二进制是0010000000000100),输入的16位虚拟地址分为4位的页号和12位的偏移量(计算方法:根据页面大小4K需要12位来确定页内偏移,剩下4位作为页面号码)。
      用页号作为也表的索引,得出对应于该虚拟号的页框号,并且用一个标志位表示该页面是否存在于页框中。

    图片描述

    2.4.2 页表

      虚拟地址被分成虚拟页号(高位部分)和偏移量(低位部分),页表的作用是把虚拟页面映射为页框。

    图片描述

      “在/不在”位:这一位是1时表示该表项是有效的,可以使用;如果是0,表示该表项对应的虚拟页面现在不在内存中,访问该页面会引起一个缺页中断。
    “保护(protection)位”:指出页面允许什么类型的访问;最简单的使用一个位表示,0表示读/写,1表示只读;另一种是用三位表示,各个位分别表示读、写、执行该页面。
    “修改(modified)位和访问(referenced)位”:在写入一页时由硬件自动设置修改位,操作系统在重新分配页框时,如果修改位被设置,则该页是脏的,必须被写回到磁盘,若该位没被设置,则该页框是干净的,只需要简单的丢弃即可。
    “高速缓存禁止位”用来保证硬件从设备中读取数据而不是访问一个旧的被高速缓存的副本;但是具有独立IO空间而不使用内存映射IO的机器不需要这一位。
    虚拟内存本质上是用来创造一个新的抽象概念-地址空间,虚拟内存的实现是将地址空间分解成页,并将每一页映射到物理内存的某个页框或者(暂时)解除映射。

    2.4.3 加速分页过程

      分页系统的设计需要考虑的两个问题:1)虚拟地址到物理地址的映射必须非常快;2)如果虚拟地址空间非常大,页表也非常大。

    2.4.3.1 转换检测缓冲区

      页表一般位于内存中,可以为计算机设置一个小型的硬件设备,将虚拟地址直接映射到武林地址,而不必再访问页表,这种硬件设备被称为转换硬件缓冲区(Translation Lookaside Buffer, TLB),这是利用了局部性原理。

    2.4.3.2 软件TLB管理

      TLB表项被操作系统显式的装载,当生成一个TLB失效并将问题交给操作系统解决。系统必须先找到该页面,然后从TLB中删除一个表项,接着装载一个新的项,最后再执行先前出错的指令。
      当一个页面访问在内存中而不在TLB中时,将产生软失效(soft miss),此时只需要更新一下TLB,不需要产生磁盘IO;当页面本身不在内存中时,将产生硬失效,此时需要一次磁盘存取以装入该页面。

    2.4.4 针对大内存的页表

      引入TLB的目的是加速虚拟地址到物理地址的转换,另一个问题是如何处理巨大的虚拟地址空间。

    2.4.4.1 多级页表

    图片描述

      32位地址被划分成10位的PT1域、10位的PT2域和12位的Offset(偏移量)域。
      引入多级页表的目的是避免把全部页表一直保存在内存中,特别是那些从不需要的页表就不应该保留。
      这个虚拟地址空间超过100万个页面,实际上只需要四个页表:顶级页表以及0~4M(正文段)、4M~8M(数据段)和顶端4M(堆栈段)的二级页表,顶级页表中1021个表项的“在/不在”位都被设为0,当访问它们时将产生缺页中断。

    2.4.4.2 倒排页表

      在实际内存中,每一个页框有一个表项,而不是每一个虚拟页面一个表项。倒排页表的不足之处是:从虚拟地址到物理空间的转换非常困难,当进程n要访问虚拟内存p时,必须搜索整个倒排列表查找一个表项(n,p),并且对每一次内存操作都要执行一次。

    图片描述

      解决方案:使用TLB加速,对于TLB失效的情况,建立一张散列表,用虚拟地址来散列,通过链表处理冲突。

    2.5 页面置换算法

      页面置换就是调出不常使用的页面来腾出空间,为新的页面提供空间。
      存在的问题:当需要从内存中换出某个页面时,它是否只能是缺页进程本身的页面?这个要换出的页面是否可以属于另外一个进程?

    2.5.1 最优页面置换算法

      在缺页中断发生时,有些页面在内存中,其中一个页面很快将被访问,其它页面可能要到10、100或者1000条指令后才被访问,每个页面都可以用在该页面首次被访问所要前所要执行的指令数作为标记,它应该置换标记最大的页面。
      缺点:无法被实现,因为无法预知各个页面中下一次将在什么时候被访问;虽然可以通过仿真程序跟踪一次页面访问情况,但是也只是针对某个具体的程序和输入数据。

    2.5.2 最近未使用页面置换算法

      系统为每个页面设置了两个状态位,R位:页面被访问时(读或写)设置,M位:当页面(即修改页面)被写入时设置。
      工作原理:启动进程时,所有页面两个状态位都被设置为0,一旦页面被访问,发生中断,设置R位,修改页表项,并设置为READ ONLY模式,R位被定期清零,当发生修改时,产生中断,设置页面M位,并将页表项改为READ/WRITE模式。根据R位和M位的组合分为以下4类:
      第0类:没有被访问,没有被修改。
      第1类:没有被访问,已被修改。
      第2类:已被访问,没有被修改。
      第3类:已被访问:已被修改。
      NRU(Not Recently Used,最近未使用)算法随机从编号最小的非空类中选择一个页面淘汰。
      优点:易于理解,能够被有效的实现,虽然性能不是最好的,但是够用。

    2.5.3 先进先出页面置换算法

      FIFO(First-In First-Out,先进先出)算法:操作系统维护一个当前所有在内存中的链表,最新进入的页面放在表尾,最久进入的页面放在表头,发生缺页中断时,淘汰表头的页面并将新调入的页面加到表尾。
      缺点:淘汰的目标不确定,很少使用纯粹的FIFO算法。

    2.5.4 第二次机会页面置换算法

    图片描述

      第二次机会(second chance)算法改进了FIFO算法,维持一个链表,检查最老页面的R位,如果这个页面没有被访问,如果该位为0,即没有被使用,则立刻置换掉;如果是1,则将该位清0,并把该页面放在链表的尾端,修改它的装入时间,然后继续搜索。

    2.5.5 时钟页面置换算法

      Second chance算法维护一个链表的代价太高,因此通过时钟环来取代链表;发生缺页中断时,如果它的R位是0就淘汰,并且把新页面插入到这个位置,然后把表针前移一个位置;如果是1,则清除R位并把指针前移直到找到了一个R位为0的页面。

    图片描述

    2.5.6 最近最少使用页面置换算法

      LRU(Least Recently Used,最近最少使用)算法是最优算法一种近似。有两种使用特殊硬件实现LRU的方法:
    1) 要求硬件有一个64位计数器C,每次运行一条指令,这个计数器加一,访问一个页框时,这个计数器保存到对应的页表项中,当发生缺页中断时,找到最小的计数的页面进行淘汰。
    2) 在一个有n个页框的机器中,系统维持一个初始值为0的矩阵,访问页框k时,将k行全部设置为1,然后把k列设置为0,发生缺页中断时找到二进制数值最小的行将其淘汰。

    图片描述

    2.5.7 用软件模拟LRU

      由于很少有硬件支持LRU硬件,因此通常使用软件模拟,一种方案被称为NFU(Not Frequently Used,最不常用)算法;
      原理:每个页面有一个软件计数器,初值为0,每次时钟中断,将扫描所有页面,将其R位(记住:每次时钟中断都将该位清零)加到此页面的计数器上,发生缺页中断时,淘汰计数器最小的页面。
      缺陷:从不忘记任何事情,受之前程序的运行的影响太深。
      改进:老化(aging)算法,在R位被加进去之前先将计数器右移一位,然后将R位加到最左端的位而不是最右端。

    图片描述

      LRU算法与老化算法的两点区别:
    1) 因为LRU算法在每个时钟滴答中只记录了一位,所以无法区分哪个页面在较早的时间被访问以及哪个页面在较晚的时间被访问,而老化算法能记录先后顺序。
    2) 老化算法的计数器只有有限位数,这就限制了对以往页面的记录;这是合理的,比如一个时钟滴答周期是20ms,计数器是8位,若该页面已经有160ms没有被访问,那么它可能就不重要。

    2.5.8 工作集页面置换算法

      请求调页(demand paging):启动一个进程时,CPU取第一条指令就会产生缺页中断,操作系统转入含有第一个指令的页面,之后对其他数据和指令的访问会依次产生缺页中断,一段时间后,大部分页面都在内存中。
      工作集(working set):一个进程当前正在使用的页面的集合。
      颠簸(thrashing):每执行几条指令就发生一次缺页中断。
      工作集模型(working set model):分页系统设法跟踪进程的工作集,以确保在让进程运行之前,它的工作集就已在内存中。
      预先调页(prepaging):在让进程运行之前预先装入工作集页面。
      计算工作集有两种方法:
    1) 在任一时刻t,都存在一个集合,它包含所有最近k次内存访问所访问过的页面,这个集合我w(k, t)就是工作集。
    2) 另一种开销小的方法,不是向后找最近k次的内存访问,而是考虑其执行时间,进程的工作集被称为在过去t秒实际运行时间中它所访问过的页面的集合。

    “当前实际工作时间”定义:如果一个进程在T时刻运行,在(T+100)ms的时刻使用了40ms CPU时间,对工作集而言,它的时间就是40ms,一个进程从它开始执行到当前实际使用的CPU时间总数被称为当前实际工作时间。

    图片描述

    2.5.9 工作集时钟页面置换算法

    图片描述

      刚开始,该表是空的,随着更多页面加入,形成一个环,发生缺页中断时,先检查指针指向的页面,如果R为1,则重置R位,将指针指向下一个页面;如果R位为0,如果生存时间大于t且页面干净,则它已不在工作集,把新页面放入这里;如果该页面被修改过,为了避免磁盘操作引起的进程切换,指针继续往前走,对下一个页面进行操作。

    2.5.10 页面置换算法小结

      最好的两种算法是老化算法和工作集时钟算法,分别给予LRU和工作集,具有良好的调度性能,且可以被有效实现。

    展开全文
  • 【操作系统】分页存储管理方式

    万次阅读 多人点赞 2016-12-12 21:16:25
    分页存储管理:离散分配的基本单位是页 分段式存储管理:离散分配的基本单位是段 段页式存储管理:离散分配的基本单位是段、页 页面和物理块空间划分 将一个用户进程的地址空间(逻辑空间)划分成若干个大小相等的...

    离散分配方式

    连续分配存储管理方式产生的问题:

    • 要求连续的存储区
    • 碎片问题

    变连续分配为离散分配,允许将作业离散放到多个不相邻接的分区中。

    • 分页式存储管理:离散分配的基本单位是页
    • 分段式存储管理:离散分配的基本单位是段
    • 段页式存储管理:离散分配的基本单位是段、页

    页面和物理块

    空间划分

    • 将一个用户进程的地址空间(逻辑空间)划分成若干个大小相等的区域,称为页或页面,各页从 0 开始编号。
    • 内存空间也分成若干个与页大小相等的区域,称为块(物理块)或页框(frame) ,同样从 0 开始编号。

    内存分配

    • 在为进程分配内存时以块为单位,将进程中若干页装入到多个不相邻的块中,最后一页常装不满一块而出现页内碎片。

    地址结构

    图示

    已知逻辑地址求页号和页内地址

    给定一个逻辑地址空间中的地址为 A,页面的大小为L,则页号 P 和页内地址 d(从 0 开始编号)可按下式求得:

    图示

    其中,INT 是整除函数,mod 是取余函数。

    例:系统的页面大小为 1 KB,设 A = 2170 B,则由上式可以求得 P = 2,d = 122。

    页表

    为了便于在内存找到进程的每个页面所对应块,分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。

    页表存放在内存中,属于进程的现场信息。
    用途:1.记录进程的内存分配情况 2.实现进程运行时的动态重定位。
    访问一个数据需访问内存 2 次 (页表一次,内存一次)。
    页表的基址及长度由页表寄存器给出。
    图示

    图示

    页面大小

    若页面较小

    • 减少页内碎片和总的内存碎片,有利于提高内存利用率。
    • 每个进程页面数增多,使页表长度增加,占用内存较大。
    • 页面换进换出速度将降低。

    若页面较大

    • 每个进程页面数减少,页表长度减少,占用内存较小。
    • 页面换进换出速度将提高。
    • 增加页内碎片,不利于提高内存利用率。

    基本分页存储管理方式

    在分页存储管理方式中,如果不具备页面对换功能,不支持虚拟存储器功能,这种存储管理方式称为纯分页或基本分页存储管理方式。

    在调度作业运行时,必须将它的所有页面一次调入内存,但逻辑上连续的各个页所对应的内存块可以不连续。

    特殊的固定分区 + 离散分配

    地址变换机构

    地址变换机构

    • 将用户地址空间中的逻辑地址变换为内存空间中的物理地址。
    • 实现逻辑地址向物理地址的转换(页号 ⇒ 块号)
    • 地址变换借助页表来完成。

    地址变换机构种类

    • 基本的地址变换机构
    • 具有快表的地址变换机构

    基本地址变换机构

    地址变换借助页表来完成,页表驻留内存。

    为了提高地址变换的速度,系统中设置一个页表寄存器PTR (Page-Table Register)。

    每个进程对应一页表,其信息(如长度、始址)放在PCB 中,执行时将其装入页表寄存器。

    在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。

    基本地址变换机构

    当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分。

    将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,产生地址越界中断。

    将页表始址与页号和页表项长度的乘积相加,得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。

    将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。

    图示

    • 逻辑地址: 把相对地址分为页号和页内地址两部分。
    • 越界中断: 页号与页表长度做比较。
    • 页表定位:页表始址 + 页号 × 页表项长度。{查询页表:读出块号。
    • 物理地址:块号 + 块内地址。 (块内地址 = 页内地址)

    图示

    地址变换例题

    例:若在一分页存储管理系统中,某作业的页表如下表所示,已知页面大小为 1024B,试将十进制逻辑地址 1011,2148,5012 转化为相应的物理地址。

    图示

    设页号为 P,页内位移为 W,逻辑地址为 A,内存地址为 M,页面大小为 L,则
    P = int ( A / L )
    W = A mod L
    对于逻辑地址 1011
    P=int(1011/1024)=0
    W=1011 mod 1024=1011
    A=1011=(0,1011)
    查页表第 0 页在第 2 块,所以物理地址为 M=1024*2+1011= 3059。

    图示

    对于逻辑地址为 2148
    P= int (2148/1024)=2
    W=2148 mod 1024=100
    A=2148=(2,100)
    查页表第 2 页在第 1 块,所以物理地
    址为 M=1024*1+100=1124。
    对于逻辑地址 5012
    P= int ( 5012/1024)=4
    W=5012 mod 1024=916
    页号超过页表长度,该逻辑地址非法。

    例:存储器的用户空间共有 32 个页面,每页 1KB,内存16KB。假定某时刻系统为用户的第 0、1、2、3 页分别分配的物理块号为 5、10、4、7,试将逻辑地址 0A5C 和093C 变换为物理地址。

    图示

    具有快表的地址变换机构

    基本的地址变换机构存在的问题

    • 地址变换速度低(两次访问内存)

    具有快表的地址变换机构

    • 目的:为提高地址变换速度。
    • 快表:又称为联想寄存器、联想存储器 (AssociativeMemory) 、IBM-TLB (Translation Lookaside Buffer)。
    • 快表是一种特殊的高速缓冲存储器(Cache) ,内容是页表中的一部分或全部内容。
    • CPU 产生逻辑地址的页号,首先在快表中寻找,若命中就找出其对应的物理块;若未命中,再到页表中找其对应的物理块,并将之复制到快表。若快表中内容满,则按某种算法淘汰某些页。

    图示

    图示

    图示

    访问内存的有效时间

    有效访问时间(Effective Access Time ,EAT) 是指从给定逻辑地址,经过地址变换,到在内存中找到对应物理地址单元并取出数据所用的总时间。

    基本地址变换机构

    图示

    具有快表的地址变换机构

    图示

    例:有一页式系统,其页表存放在内存中。(1)如果对内存的一次存取需要 100ns,试问实现一次页面访问的存取时间是多少?(2)如果有快表,对快表的一次存取需要20ns, 平均命中率为 85%,试问此时的存取时间为多少?

    页表放内存中,则实现一次页面访问需 2 次访问内存。
    所以实现一次页面访问的存取时间为:100ns*2=200ns

    系统有快表,则实现一次页面访问的存取时间为:
    0.85*(20ns+100ns)+(1-0.85)*(20ns+2*100ns)=135ns

    多级页表

    若逻辑地址空间很大 (2^32 ∼2^64 ) ,则划分的页比较多,页表就很大,占用的存储空间大(要求连续) ,实现较困难。

    例如,对于 32 位逻辑地址空间的分页系统,如果规定页面大小为 4 KB 即 2^12 B,则在每个进程页表就由高达2^20 页组成。设每个页表项占用一个字节,每个进程仅仅页表就要占用 1 MB 的内存空间。

    解决问题的方法

    • 动态调入页表: 只将当前需用的部分页表项调入内存,其余的需用时再调入。
    • 多级页表

    两级页表

    将页表再进行分页,离散地将各个页表页面存放在不同的物理块中,同时也再建立一张外部页表用以记录页表页面对应的物理块号。

    正在运行的进程,必须把外部页表调入内存,而动态调入内部页表。只将当前所需的一些内层页表装入内存,其余部分根据需要再陆续调入。

    图示

    图示

    图示

    将外层页表再进行分页,也将各外层页表页面离散地存放在不同的物理块中,再利用第 2 级的外层页表来记录它们之间的对应的关系。

    图示

    反置页表

    图示

    解决问题的方法

    • 动态调入页表
    • 多级页表
    • 反置页表(Inverted page tables )

    一般页表的表项是按页号进行排序,页表项中的内容是物理块号。

    反置页表是为每一个物理块设置一个页表项并按物理块号排序,其中的内容是页号 P 及隶属进程标志符 pid。

    利用反置页表进行地址变换

    • 用进程标志符和页号去检索反置页表。
    • 如果检索完整个页表未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统产生请求调页中断,若无此功能则表示地址出错。
    • 如果检索到与之匹配的表项,则表项的序号 i 便是该页的物理块号,将该块号与页内地址一起构成物理地址。

    图示

    • 反置页表可以有效地减少页表占用的内存,但反置页表中只包含已经调入内存的页面,未包含那些未调入内存的各个进程的页面,因此必须为每个进程建立一个外部页表 (External Page Table)。发现页面不在内存时才访问外部页表。
    • 外部页表存放各页在外存中的物理位置。通过外部页表可将所需要的页面调入内存。
    • 反置页表中是为每一个物理块设置一个页表项,通常页表项的数目也很大,通常又利用 Hash 表来检索。

    页的共享与保护

    页的共享:各进程把需要共享的数据/程序的相应页指向相同物理块。

    图示

    页的保护

    页式存储管理系统提供了两种方式:

    • 地址越界保护
    • 在页表中设置保护位(定义操作权限:只读,读写,执行等)

    共享带来的问题

    若共享数据与不共享数据划在同一块中,则:

    • 有些不共享的数据也被共享,不易保密。
    • 计算共享数据的页内位移较困难。

    实现数据共享的最好方法:分段存储管理。

    展开全文
  • C语言模拟实现虚拟存储管理(请求分页存储管理

    千次阅读 多人点赞 2020-06-25 23:19:08
    C语言模拟实现虚拟存储管理(请求分页存储管理)使用FIFO算法 一、实验目的 存储管理的主要功能之一是合理的分配空间。请求分页存储管理是一种常用的虚拟存储管理技术。本实验的目的是:通过编程模拟实现请求分页...

    C语言模拟实现虚拟存储管理(请求分页存储管理)使用FIFO算法
    1)实验目的
    2)实验内容
    3)实验基本原理和解决方案
    4)数据结构、模块划分
    5)画出程序的基本结构框图和流程图(包括主程序流程图、模块详细设计流程图等),对程序的每一部分要有详细的设计分析说明,说明设计实现所用的原理。
    6)源代码,要求格式规范,适当加注释,以有助于说明问题为宜,注释不少于三分之一。
    7)运行的结果,要求有对结果的分析
    8)参考资料
    一、实验目的
    存储管理的主要功能之一是合理的分配空间。请求分页存储管理是一种常用的虚拟存储管理技术。本实验的目的是:通过编程模拟实现请求分页存储管理中硬件地址转换过程、缺页中断处理过程,以及先进先出页面置换算法,加深对页式虚拟存储管理的理解,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法;通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

    二、实验内容
    阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
    (1)用C语言实现对分页式存储管理中的硬件的地址转换和产生缺页中断。
    (2)设计页表。
    页式虚拟存储系统是把作业的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:
    页 号 标志 主存块号 修改标志 在磁盘上的位置

    其中:
    标志——用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存中,标志位=0,则表示该页尚未装入主存。
    主存块号——用来表示已经装入主存的页所占的物理块号。
    修改标志——用来表示已经装入主存的页是否被修改过。为,则表示该页装入主存后被修改过;为0,则表示该页该页装入主存后未被修改过。
    在磁盘上的位置——用来指出作业副本的每一页被存放在磁盘上的位置。
    可根据页面置换算法的不同,页表的内容可以作适当的增删。

    三、实验基本原理和解决方案
    (1)地址计算。
    作业执行时,先根据指令中的逻辑地址算出参加运算的操作数存放的页号和页内地址,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,根据关系式:
    绝对地址=块号*块长+页内地址
    计算出欲访问的主存单元地址。按计算出的绝对地址可以取到操作数,完成一条指令的执行。若访问的页标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由OS按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
    (2)设计“地址转换”程序模拟硬件的地址转换工作。
    当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断,执行缺页中断程序。该模拟程序的算法如下图所示。

    地址转换模拟流程图
    (3) 缺页中断模拟。
    在页式虚拟存储系统中,当硬件发出缺页中断请求后,引起操作系统来处理这个中断事件。如果主存有空闲物理块,则调入该页并修改页表;如果主存中没有空闲物理块,则可用FIFO页面置换算法或者LRU页面置换算法从该作业中在主存的页面中选一页淘汰,被淘汰的页是否需要重新写回磁盘,由修改标志决定。然后再把当前要访问的页装入该块。调出和装入后都要修改页表中的相应信息。
    四、数据结构、模块划分
    (1)存放页表的结构体
    struct info //页表信息结构体
    {
    int pageno;
    int flag; //页标志,1表示该页已在主存,0表示该页不在主存
    int block; //块号
    char disk[10]; //在磁盘上的位置
    int dirty; //更新标志(修改标志)

    }pagelist[SizeOfPage];
    (2)存放操作数、逻辑地址以及页表信息的结构体
    struct work{
    char operands[10];
    long adress;
    int pagenum; //页号
    int page_local;//页内地址
    int sign; //标志
    int Block;
    int page_adress;//物理地址
    int page_out; //淘汰页号
    int page_back;

    }worklist[12];

    (3)使用数组进行模拟分配的三个物理块,po始终指向最先进去的页号,模拟FIFO算法
    long po=0; //队列标记
    long P[M]={0,1,2}; //假设内存中最多允许M=3个页面
    (4)使用文本文件进行内存空间初始化
    存放操作数文本文件:
    在这里插入图片描述
    存放页表信息文本文件:
    在这里插入图片描述
    void init_ex1() //内存空间初始化。
    {
    FILE *fp = fopen(“page.txt”,“r”), *fq = fopen(“task.txt”,“r”);
    int i = 0;
    int a = 0, b = 0, c=0, d=0;
    char e[10];
    while(fscanf(fp,"%d%d%d%d%s",&a,&b,&c,&d,&e)!=EOF)
    {
    pagelist[i].pageno=a;
    pagelist[i].flag=b;
    pagelist[i].block=c;
    pagelist[i].dirty=d;
    strcpy(pagelist[i].disk, e);
    i++;
    }
    char s[10];
    long n = 0;
    int k=0;
    while(fscanf(fq,"%s%ld",&s,&n)!=EOF)
    {
    if(k >= 12)
    break;
    strcpy(worklist[k].operands, s);
    worklist[k].adress=n;
    k++;
    }

    fclose(fp);
    fclose(fq);
    

    }
    (5)输出函数
    void print()
    {
    /* char operands[10];
    long adress;
    int pagenum; //页号
    int page_local;//页内地址
    int sign; //标志
    int Block;
    int page_adress;//物理地址
    int page_out; //淘汰页号
    int page_back; //是否写回
    */
    printf(“以下数据1表示是,0表示否\n”);
    printf(“操作数\t逻辑地址\t页号\t页内地址\t是否命中\t物理块号\t物理地址\t淘汰页号\t是否写回\n”);
    for(int i=0;i<12;i++)
    {
    printf("%s\t%ld\t\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d",worklist[i].operands,worklist[i].adress,worklist[i].pagenum,worklist[i].page_local,worklist[i].sign,worklist[i].Block,worklist[i].page_adress,worklist[i].page_out,worklist[i].page_back);
    printf("\n");
    }
    }

    (6)模拟FIFO页面调度算法
    void work_FIFO()
    {
    int i,j;
    for(i=0;i<12;i++)
    {
    worklist[i].pagenum=worklist[i].adress / 128;
    worklist[i].page_local=worklist[i].adress % 128;
    worklist[i].page_back = 0;

    	for(j=0;j<7;j++)
    	{
    		if(pagelist[j].pageno == worklist[i].pagenum)
    		{
    			if(pagelist[j].flag==1)
    			{
    				worklist[i].Block = pagelist[pagelist[j].pageno].block;
    				worklist[i].sign=1;
    				worklist[i].page_adress=(pagelist[pagelist[j].pageno].block* SizeOfBlock + worklist[i].page_local);//worklist[i].Block
    				worklist[i].page_out=-1;
    				if(!(strcmp(worklist[i].operands,"存")))
    				{
    					pagelist[worklist[i].pagenum].dirty = 1;		//是否写回磁盘,修改页表
    					worklist[i].page_back = 1;
    				}
    
    				
    			}
    			else
    			{
    				//printf("*%d\n",worklist[i].pagenum);
    				pagelist[P[po]].flag=0;   //将flag标志位置0,表示当前页面已被置换出去
    				worklist[i].page_out=P[po];
    				worklist[i].Block=pagelist[P[po]].block;
    				pagelist[j].block=pagelist[P[po]].block;
    				worklist[i].page_adress=(worklist[i].Block*SizeOfBlock+worklist[i].page_local);
    		   	  
    			   pagelist[j].flag=1;
    			   worklist[i].sign=0;
    			   P[po]=pagelist[j].pageno;   //保存当前页面所在的位置
    			   po=(po+1)%M; 
    
    			   if(!(strcmp(worklist[i].operands,"存")))
    				{
    					pagelist[worklist[i].pagenum].dirty = 1;		//是否写回磁盘,修改页表
    					worklist[i].page_back = 1;
    				}
    
    			}
    		}
    		else
    		{
    			continue;
    		}
    	}
    
    }
    

    }
    (7)主函数
    int main()
    {
    init_ex1();
    work_FIFO();
    print();
    return 0;
    }
    五、画出程序的基本结构框图和流程图(包括主程序流程图、模块详细设计流程图等),对程序的每一部分要有详细的设计分析说明,说明设计实现所用的原理。
    main()函数

    init_ex1()函数

    使用文本文件进行内存初始化工作
    (1)在程序所在目录下创建两个文本文件page.txt和task.txt
    (2)读取文件内容,用循环将文件内容赋值给页表结构体的成员(pagelist)和存放操作数等结构体的成员(worklist)
    work_FIFO()

    使用双重循环
    (1)逻辑地址进行计算页号和页内地址
    (2)进行条件判断,如果页号标志位1,即在主存中,进行物理地址转换,否则进行缺页中断处理,使用P[M]数组模拟三个分配的物理块,po始终指向最先进去的页号

    六、源代码,要求格式规范,适当加注释,以有助于说明问题为宜,注释不少于三分之一。
    #include<stdio.h>
    #include
    #define SizeOfPage 7
    #define SizeOfBlock 128
    #define M 3
    struct info //页表信息结构体
    {
    int pageno;
    int flag; //页标志,1表示该页已在主存,0表示该页不在主存
    int block; //块号
    char disk[10]; //在磁盘上的位置
    int dirty; //更新标志(修改标志)

    }pagelist[SizeOfPage];

    struct work{
    char operands[10];
    long adress;
    int pagenum; //页号
    int page_local;//页内地址
    int sign; //标志
    int Block;
    int page_adress;//物理地址
    int page_out; //淘汰页号
    int page_back;

    }worklist[12];

    long po=0; //队列标记
    long P[M]={0,1,2}; //假设内存中最多允许M=3个页面

    void init_ex1() //内存空间初始化。
    {
    //memset(pagelist,0,sizeof(pagelist)); 内存空间初始化,第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。

    FILE *fp = fopen("page.txt","r"), *fq = fopen("task.txt","r");
    int i = 0;
    int a = 0, b = 0, c=0, d=0;
    char e[10];
    while(fscanf(fp,"%d%d%d%d%s",&a,&b,&c,&d,&e)!=EOF)
    {
    	pagelist[i].pageno=a;
    	pagelist[i].flag=b;
    	pagelist[i].block=c;
    	pagelist[i].dirty=d;
    	strcpy(pagelist[i].disk, e);
    	i++;
    }
    char s[10];
    long n = 0;
    int k=0;
    while(fscanf(fq,"%s%ld",&s,&n)!=EOF)
    {
    	if(k >= 12)
    		break;
    	strcpy(worklist[k].operands, s);
    	worklist[k].adress=n;
    	k++;
    }
    
    fclose(fp);
    fclose(fq);
    

    }

    void print()
    {
    /* char operands[10];
    long adress;
    int pagenum; //页号
    int page_local;//页内地址
    int sign; //标志
    int Block;
    int page_adress;//物理地址
    int page_out; //淘汰页号
    int page_back; //是否写回
    */
    printf(“以下数据1表示是,0表示否\n”);
    printf(“操作数\t逻辑地址\t页号\t页内地址\t是否命中\t物理块号\t物理地址\t淘汰页号\t是否写回\n”);
    for(int i=0;i<12;i++)
    {
    printf("%s\t%ld\t\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d",worklist[i].operands,worklist[i].adress,worklist[i].pagenum,worklist[i].page_local,worklist[i].sign,worklist[i].Block,worklist[i].page_adress,worklist[i].page_out,worklist[i].page_back);
    printf("\n");
    }
    }
    void work_FIFO()
    {

    int i,j;
    for(i=0;i<12;i++)
    {
    	worklist[i].pagenum=worklist[i].adress / 128;
    	worklist[i].page_local=worklist[i].adress % 128;
    	worklist[i].page_back = 0;
        
    	for(j=0;j<7;j++)
    	{
    		if(pagelist[j].pageno == worklist[i].pagenum)
    		{
    			if(pagelist[j].flag==1)
    			{
    				worklist[i].Block = pagelist[pagelist[j].pageno].block;
    				worklist[i].sign=1;
    				//printf("物理块:%d\n",worklist[i].Block);
    				worklist[i].page_adress=(pagelist[pagelist[j].pageno].block* SizeOfBlock + worklist[i].page_local);//worklist[i].Block
    			//	printf("物理地址:%d\n",worklist[i].page_adress);
    				worklist[i].page_out=-1;
    				if(!(strcmp(worklist[i].operands,"存")))
    				{
    					pagelist[worklist[i].pagenum].dirty = 1;		//是否写回磁盘,修改页表
    					worklist[i].page_back = 1;
    				}
    
    				
    			}
    			else
    			{
    				//printf("*%d\n",worklist[i].pagenum);
    				pagelist[P[po]].flag=0;   //将flag标志位置0,表示当前页面已被置换出去
    				worklist[i].page_out=P[po];
    				worklist[i].Block=pagelist[P[po]].block;
    				pagelist[j].block=pagelist[P[po]].block;
    				worklist[i].page_adress=(worklist[i].Block*SizeOfBlock+worklist[i].page_local);
    		   	  
    			   pagelist[j].flag=1;
    			   worklist[i].sign=0;
    			   P[po]=pagelist[j].pageno;   //保存当前页面所在的位置
    			   po=(po+1)%M; 
    
    			   if(!(strcmp(worklist[i].operands,"存")))
    				{
    					pagelist[worklist[i].pagenum].dirty = 1;		//是否写回磁盘,修改页表
    					worklist[i].page_back = 1;
    				}
    
    			}
    		}
    		else
    		{
    			continue;
    		}
    	}
    
    }
    

    }

    int main()
    {
    init_ex1();
    work_FIFO();
    print();

    return 0;
    

    }
    七、运行的结果,要求有对结果的分析
    结果分析:
    页号=int(逻辑地址/每块长度(128)) 页内地址=逻辑地址%每块长度(128)
    初始内存时,存在主存的页号有0,1,2号页。下面进行三个举例验证输出结果是否正确:
    ①第一个操作数为“+”,逻辑地址为:389,页号=int(389/128)=3,页内地址=389%128=5
    此时,3号页不在主存中,未命中(为0),产生缺页中断,使用FIFO算法进行页面调度,淘汰最先进入主存的页号,即0页,故0号页淘汰,将淘汰页的物理块赋值给调入页号的物理块,极为5,物理地址为:5128+5=645,操作数不为“存”,不写回外存。
    ②第二个操作数为“+”,逻辑地址为:150,页号=int(150/128)=1,页内地址=150%128=22
    此时,在主存是页号有3,1,2,故命中(为1),物理块号为8,物理地址为:8
    128+22=1046,命中,无淘汰页号,即记为-1,操作数不为“存”,不写回外存。
    ③第四个操作数为“存”,逻辑地址为:78,页号=int(78/128)=0,页内地址=78%128=78
    此时,在主存中的页号有1,2,3,未命中,产生缺页中断,根据FIFO算法,淘汰1号页,调入0号页,物理块号为8,物理地址为:8*128+78=1102,操作数为“存”,写回外存,记为1。以此类推,现不再重复验证。
    八、主要参考资料
    [1] 汤子瀛等. 计算机操作系统(第三版). 西安:西安电子科技大学出版社2007
    [2] [美]William Stallings. 操作系统――内核与设计原理. 北京:电子工业出版社 2001
    [3] [美]Abraham Silberschatz等. 操作系统概念(第六版) 北京:高等教育出版社 2004
    [4] [荷]Andrews Tanenbaum. 现代操作系统(第2版)北京:机械工业出版社 2005
    [5] 谭浩强. C程序设计(第四版). 北京:清华大学出版社2010

    展开全文
  • 2、分页 3、页表 连续分配内存的缺点: 1、分配给一个程序的物理内存是连续的 2、内存利用率较低 3、有外碎片、内碎片问题 非连续分配内存的优点 1、一个程序的物理地址空间是非连续的 2、更好的内存利用...

    参考视频:传送门

    非连续内存分配

    为什么需要非连续内存分配? 种类:

    1、分段

    2、分页

    3、页表

    连续分配内存的缺点:

    1、分配给一个程序的物理内存是连续的

    2、内存利用率较低

    3、有外碎片、内碎片问题

     

    非连续分配内存的优点

    1、一个程序的物理地址空间是非连续的

    2、更好的内存利用和管理

    3、允许共享代码和数据

    4、支持动态加载和动态链接

     

    非连续分配内存的缺点:

    1、如何建立虚拟地址和物理地址之间的转换?开销很大

    软件方案

    硬件方案

     

    两种硬件方案

    分段

    分页

     

     

     

    分段

    程序的分段地址空间

    分段寻址方案

     

    段访问机制

    新概念:一个段:一个内存“块”

         一个逻辑地址空间

    程序访问内存地址需要  一个二元组(s,addr)

    s:一个段号

    addr:段内偏移

    来个简单题:

     

    分页管理基本原理

    页的尺寸是固定的

    划分物理内存至固定大小的帧

    大小是2的幂次方

     

    划分逻辑地址空间至相同大小的页

    大小是2的幂次方

     

    物理内存被分割为大小相等的帧

    一个内存物理地址是一个二元组(f,o)  

    f-帧号(F位 共有2^F个帧)

    o-帧内偏移(S位,每帧有2^S字节)

    物理地址=2^S*f+o

    罕见的有题目练习:

    页内偏移大小=帧内偏移大小

    页号大小=帧号大小

     

    分段和分页的区别

    以下来自百度百科

    1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

    段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。

    2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。

    段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

    3、分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。

    分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

     

     

    我总结:最大的区别就是分页管理的每一页的大小是都是一样的,分段管理每一段都是不定的

    展开全文
  • 从本文开始就介绍不连续分配的几种方式,本文主要介绍基本分页存储管理。 连续分配:为用户进程分配的必须是一个连续的内存空间。 非连续分配:为用户进程分配的是一些分散的内存空间。 1 将连续分配改造成非连续...
  • 算法描述: 该算法的实质是选择作业中在主存驻留时间最长的一页淘汰,这种算法容易实现,例如分配一个作业的存储块数为m,则只需建立一张m个元素的队列表Q(0)、Q(1)、…、Q(m-1)和一个替换指针。这个队列是按页调入...
  • 3.1.4.1 基本分页存储管理方式

    千次阅读 2016-07-13 23:58:02
    分页存储管理方式中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行分为基本分页存储管理方式和请求分页存储管理方式。 1、基本分页存储管理方式 固定分区会产生内部碎片,动态分区会产生外部碎片,这...
  • 编写一个请求页式存储管理模拟程序,通过对页面置换过程的模拟,加深对请求页式存储管理方式基本原理及实现过程的理解。 要求: 1. 从键盘输入页面访问序列及分配给进程的内存块数; 2. 分别采用OPT、FIFO和LRU...
  • 操作系统基本分页存储管理方式

    千次阅读 2014-05-01 22:54:03
    操作系统基本分页存储管理方式 连续分配内存方式会形成许多“碎片”,通过紧凑的方式将碎片拼接成一块大的空间,但是拼接过程系统开销太大。如果允许将一个进程直接分散地装入到许多不相邻的分区中,那么就不需要再...
  • ZUCC操作系统原理习题 存储管理

    千次阅读 2020-06-13 03:21:32
    分页存储管理方式和固定分区分配存储管理方式 B 分页存储管理方式和分段存储管理方式 C 分页存储管理方式和动态分区分配存储管理方式 D 分段存储管理方式和动态分区分配存储管理方式 2.首次适应算法要求空闲...
  • 在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
  • 操作系统实验--存储管理

    千次阅读 2020-05-12 08:27:40
    设计一个请求页式存储管理方案,并编写模拟程序实现。淘汰算法采用两种不同的算法如:FIFO和LRU,并比较它们的不同之处。 三、实验原理和设计思路         不同的置换算法...
  • 分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame)...
  • 华中科技大学计算机组成原理慕课答案

    万次阅读 多人点赞 2020-01-26 00:09:18
    问主存第3000号单元所在主存块对应的cache组号是( A ) A.13 B.29 C.1 D.5 47、下列关于MMU的叙述中,错误的是( C ) A.MMU是存储管理部件 B.MMU参与虚拟地址到物理地址的转换 C.MMU负责主存地址到Cache地址的映射...
  • MyBatis面试题(2020最新版)

    万次阅读 多人点赞 2019-09-24 16:40:33
    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 ...
  • 虚拟页式存储管理

    2020-12-14 11:07:13
    计算机并不解决问题,它们只是执行解决方案。 --Laurent Gasser
  • 存储管理

    千次阅读 2015-12-05 16:50:58
    推动存储管理方式从固定分区到动态分区,进而又发展到分页存储管理方式的主要动力在于满足内存利用率提高的系统管理需求。而分段存储管理的引入则主要是为了满足用户在以下五方面的需要: ①方便编程。通常,一个...
  • 操作系统-内存管理-基本分页内存管理方式1.分页管理方式的引入 连续分配方式会形成大量的碎片(零头),虽然可以通过拼接(紧凑)的方式将碎片(零头)拼接成大的分区(一段连续的内存空间),但是拼接(紧凑)技术...
  • 在下列存储管理方案中,不适用于多道程序的是( )。 A. 单一连续分配 B.固定式分区分配 C.可变式分区分配 D.段页式存储分配 8. 在动态分区式内存管理中,能使内存空间中空闲区分布较均匀的算法是( )  A...
  • 操作系统原理:页式存储管理

    千次阅读 2017-02-09 16:27:46
    为了解决这些问题,人们又提出了“页式存储管理方案”。它的基本出发点 是打破存储分配的连续性,使一个程序的逻辑地址空间可以分布在若干个离散的内存块上,从而达到充分利用内存,提高 内存利用率的作用。 页式...
  • 二、存储管理模拟:动态分区分配、分页存储地址转换 三、文件系统模拟 如有需要,请前往Gitee进行源码的下载: https://gitee.com/JJJZZZYYY/operating-system-principle Tip:如需转发或引用此博文及相关内容,请...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    写的更原理,所以较为难懂。 3、根据情况创建复合索引,复合索引可以提高查询效率。 因为复合索引的基数会更大。 4、避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率。 5...
  • 虚拟存储管理

    千次阅读 2018-07-08 00:29:58
    必要性:前面的各种存储管理方式必须一次性全部装入内存才可以运行,直至作业运行结束才能释放全部内存资源,所以存在: (1)内存不满足作业地址空间要求时就不能运行 (2)大量作业要求运行时只有少数作业装入...
  • 关键词:操作系统、分段存储管理、段页式存储管理、虚拟存储管理、页面置换算法、最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)等。
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    3、幻读:在一个事务里面的操作中发现了未被操作的数据,系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条新的学生成绩具体分数的记录,当系统管理员A改结束后...
  • 知识回顾Knowledge Review 分段方式与分页方式比较 分段是信息的逻辑单位...虚拟存储管理 虚拟存储器的基本原理 为提高主存的利用率作业投入运行时一次只把当前运行所需的部分程序或数据装入主存其他部分存储于辅存当需
  • 请求分页与请求分段管理方式

    千次阅读 2020-05-12 11:56:45
    请求分页与请求分段管理方式 请求分页管理方式 1 概述 请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    OnePerson虽然存储的是Person类对象地址,但不是C中的指针,不能象指针那样可以进行加减运算,也不能转换为其它类型地址,它是引用型变量,只能引用(代表)Person对象,具体意义参见以后章节。和C、C++不同,C#只能用...
  • 日期 内核版本 架构 ...1 前景回顾前面我们讲解了操作系统段式存储管理的主要内容. 32位,在保护方式下,其能够访问的线性地址空间可达4GB,而且允许几乎不受存储空间限制的虚拟存储器程序。虚拟存

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,205
精华内容 8,082
关键字:

分页存储管理方案原理