精华内容
下载资源
问答
  • 2021-12-25 23:31:03

    在分页式虚拟存储管理中,要求通过键盘输入分配给一个作业的物理块数和作业依次访问的10个页面号,采用先进先出(FIFO)页面置换后,顺序输出缺页中断时所淘汰的页面号,并计算缺页中断率。

    #include<cstdio>
    
    using namespace std;
    
    const int maxn = 1e5 + 5;
    
    int page_now;
    int page_num, space_num;
    int flag[maxn], space_array[maxn];
    
    int main()
    {
        int i, j, num, sum;
        while(1)
        {
            num = 0; sum = 0;
    
            printf("请输入进程总页数和系统分配的物理块:");
            scanf("%d %d", &page_num, &space_num);
    
            for(i = 0; i < page_num; i++) flag[i] = 0;
            for(i = 0; i < space_num; i++) space_array[i] = -1;
    
            i = 1;
            printf("请输入调度页面序号(按‘-1’结束):\n");
            while(scanf("%d", &page_now) != 'EOF')
            {
                if(page_now == -1) break;
    
                sum++;
                if(flag[page_now]) printf("第%2d个调度:未发生中断,页面%d已在主存\n", i, page_now);
                else
                {
                    if(space_array[num % space_num] == -1) printf("第%2d个调度:发生缺页中断\n", i);
                    else
                    {
                        printf("第%2d个调度:发生缺页中断,页面%d被调出主存\n", i, space_array[num % space_num]);
                        flag[space_array[num % space_num]] = 0;
                    }
                    space_array[num % space_num] = page_now;
                    flag[page_now] = 1;
                    num++;
                }
                i++;
            }
            printf("缺页中断次数为%d,缺页中断率为%.2f%%\n\n", num, num * 1.0 / sum * 100);
        }
        return 0;
    }
    
    
    更多相关内容
  • 请求分页虚拟存储管理技术是把作业地址空间的全部信息存放磁盘上。当作业被选中运行时,先把作业的开始几页装入主存并启动运行。为此为作业建立页表时,应说明哪些页已主存,哪些页不主存。
  • 计算机操作系统实验_源码_模拟请求分页虚拟存储管理中的硬件地址变换过程.pdf
  • 本设计通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。 (1)从置换算法任选 2 种(OPT、 FIFO、LRU、Clock);(2)建立页表;(3) 设计的输入数据要能...
  • 计算机操作系统实验源码模拟请求分页虚拟存储管理中的硬件地址变换过程
  • 计算机操作系统实验源码模拟请求分页虚拟存储管理中的硬件地址变换过程.pdf
  • 计算机操作系统实验源码模拟请求分页虚拟存储管理中的硬件地址变换过程定义.pdf
  • os 虚拟存储器 请求分页存储管理方式

    请求分页系统是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能页面置换功能。相应地,每次调入和换出的基本单位都是长度固定的页面,这使得请求分页系统在实现上要比请求分段系统简单(后者在换进和换出时是可变长度的段)。因此,请求分页便成为目前最常用的一种实现虚拟存储器的方式。

    请求分页中的硬件支持

    为了实现请求分页,系统必须提供一定的硬件支持。计算机系统除了要求一定容量的内存和外存外,还需要有请求页表机制、缺页中断机构以及地址变换机构

    1.请求页表机制

    在请求分页系统中需要的主要数据结构是请求页表,其基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址。为了满足页面换进换出的需要,在请求页表中又增加了四个字段。这样,在请求分页系统中的每个页表应含以下诸项:
    在这里插入图片描述

    • (1)状态位(存在位) P :由于在请求分页系统中,只将应用程序的一部分调入内存,还有一部分仍在外存磁盘上,故须在页表中增加一个存在位字段。由于该字段仅有一位,故又称位字。它用于指示该页是否已调入内存,供程序访问时参考
    • (2)访问字段 A :用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,提供给置换算法(程序)在选择换出页面时参考。
    • (3)修改位 M标识该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,在置换该页时,若未被修改,就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的副本始终是最新的。简而言之, M 位供置换页面时参考。
    • (4)外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

    2.缺页中断机构

    在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求 OS 将所缺之页调入内存。缺页中断作为中断,它们同样需要经历诸如保护 CPU 环境、分析中断原因、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复 CPU 环境等几个步骤。但缺页中断又是一种特殊的中断,它与一般的中断相比有着明显的区别,主要表现在下面两个方面:

    • (1)在指令执行期间产生和处理中断信号。通常, CPU 都是在一条指令执行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,若发现所要访问的指令或数据不在内存时,便立即产生和处理缺页中断信号,以便能及时将所缺之页面调入内存。
    • (2)一条指令在执行期间可能产生多次缺页中断。在图5-1中示出了一个例子。如在执行一条指令 copy A to B 时,可能要产生6次缺页中断,其中指令本身跨了两个页面, A 和 B 又分别各是一个数据块,也都跨了两个页面。基于这些特征,系统中的硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处继续执行
      在这里插入图片描述

    3.地址变换机构

    请求分页系统中的地址变换机构是在分页系统地址变换机构的基础上,为实现虚拟存储器,再增加了某些功能所形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等。下图示出了请求分页系统中的地址变换过程。
    在这里插入图片描述
    在进行地址变换时,首先检索快表,试图从中找出所要访问的页。若找到,便修改页表项中的访问位,供置换算法选换出页面时参考。对于写指令,还须将修改位置成“1”,表示该页在调入内存后已被修改。然后利用页表项中给出的物理块号和页内地址形成物理地址。地址变换过程到此结束。
    如果在快表中未找到该页的页表项,则应到内存中去查找页表,再从找到的页表项中的状态位 P 来了解该页是否已调入内存。若该页已调入内存,这时应将该页的页表项写入快表。当快表已满时,则应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项;若该页尚未调入内存,这时应产生缺页中断,请求 OS 从外存把该页调入内存。


    请求分页中的内存分配

    在为进程分配内存时,将涉及到三个问题:

    • 第一,为保证进程能正常运行,所需要的最小物理块数的确定;
    • 第二,在为每个进程分配物理块时,应采取什么样的分配策略,即所分配的物理块是固定的,还是可变的;
    • 第三,为不同进程所分配的物理块数,是采取平均分配算法,还是根据进程的大小按比例分配。

    1.最小物理块数的确定

    一个显而易见的事实是,随着为每个进程所分配的物理块的减少,将使进程在执行中的缺页率上升,从而会降低进程的执行速度。为使进程能有效地工作,应为它分配一定数目的物理块,但这并不是最小物理块数的概念。
    最小物理块数是指能保证进程正常运行所需的最小物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行。至于进程应获得的最少物理块数,与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。对于某些简单的机器,若是单地址指令,且采用直接寻址方式,则所需的最少物理块数为2。其中,一块是用于存放指令的页面,另一块则是用于存放数据的页面。如果该机器允许间接寻址,则至少要求有三个物理块。对于某些功能较强的机器,其指令长度可能是两个或多于两个字节,因而其指令本身有可能跨两个页面,且源地址和目标地址所涉及的区域也都可能跨两个页面。正如前面所介绍的在缺页中断机构中要发生6次中断的情况一样,对于这种机器,至少要为每个进程分配6个物理块,以装入6个页面。

    2.内存分配策略

    在请求分页系统中,可采取两种内存分配策略,即固定可变分配策略。在进行置换时,也可采取两种策略,即全局置换局部置换。于是可组合出以下三种适用的策略。

    • 1)固定分配局部置换( Fixed Allocation , Local Replacement )
      所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从分配给该进程的 n 个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变。采用该策略时,为每个进程分配多少物理块是根据进程类型(交互型或批处理型等)或根据程序员、程序管理员的建议来确定的。实现这种策略的困难在于:应为每个进程分配多少个物理块难以确定。若太少,会频繁地出现缺页中断,降低了系统的吞吐量。若太多,又必然使内存中驻留的进程数目减少,进而可能造成 CPU 空闲或其它资源空闲的情况,而且在实现进程对换时,会花费更多的时间。
    • 2)可变分配全局置换( Variable Allocation , Global Replacement )
      所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指如果进程在运行中发现缺页,则将 os 所保留的空闲物理块(一般组织为一个空闲物理块队列)取出一块分配给该进程,或者以所有进程的全部物理块为标的,选择一块换出,然后将所缺之页调入。这样,分配给该进程的内存空间就随之增加。可变分配全局置换这可能是最易于实现的一种物理块分配和置换策略,已用于若干个 os 中。在采用这种策略时,凡产生缺页(中断)的进程,都将获得新的物理块,仅当空闲物理块队列中的物理块用完时, os 才能从内存中选择一页调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,这将导致其缺页率增加。
    • 3)可变分配局部置换( Variable Allocation , Local Replacement )
      该策略同样是基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选择一页换出,这样就不会影响其它进程的运行。如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止。反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。

    3.物理块分配算法

    在采用固定分配策略时,如何将系统中可供分配的所有物理块分配给各个进程,可采用下述几种算法;

    • (1)平均分配算法,即将系统中所有可供分配的物理块平均分配给各个进程。例如,当系统中有100个物理块,有5个进程在运行时,每个进程可分得20个物理块。这种方式貌似公平,但由于未考虑到各进程本身的大小,会造成实际上的不公平。假设系统平均分配给每个进程20个物理块,这样,一个进程只有10页,闲置了10个物理块,而另外一个进程有200页,也仅被分配了20块,显然,后者必然会有很高的缺页率。
    • (2)按比例分配算法,即根据进程的大小按比例分配物理块。如果系统中共有 n 个进程,每个进程的页面数为 Si,则系统中各进程页面数的总和为:
      S = ∑ i = 1 n S i S=\sum_{i=1}^{n}S_i S=i=1nSi
      又假定系统中可用的物理块号总数为m,则每个进程所能分到的物理块号为bi可由下式计算:
      b   i   = S   i   S × m b~i~=\frac{S~i~}{S}\times m b i =SS i ×m
      这里, bi 应该取整,它必须大于最小物理块数
    • (3)考虑优先权的分配算法。在实际应用中,为了照顾到重要的、紧迫的作业能尽快地完成,应为它分配较多的内存空间。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。在有的系统中,如重要的实时控制系统,则可能是完全按优先权为各进程分配其物理块的。

    页面调入策略

    为使进程能够正常运行,必须事先将要执行的那部分程序和数据所在的页面调入内存。现在的问题是:

    • (1)系统应在何时调入所需页面;
    • (2)系统应从何处调入这些页面;
    • (3)是如何进行调入的。

    1.何时调入页面

    为了确定系统将进程运行时所缺的页面调入内存的时间,可采取预调页策略或请求调页策略,现分述如下。

    (1)预调页策略。

    如果进程的许多页是存放在外存的一个连续区域中,一次调入若干个相邻的页会比一次调入一页更高效些。但如果调入的一批页面中的大多数都未被访问, 则又是低效的。于是便考虑采用一种以预测为基础的预调页策略,将那些预计在不久之后会被访问的页面预先调入内存。如果预测较准确,那么这种策略显然是很有吸引力的。但遗憾的是,目前预调页的成功率仅约50%。
    但预调页策略又因其特有的长处取得了很好的效果。首先可用于在第一次将进程调入内存时,此时可将程序员指出的那些页先调入内存。其次是,在采用工作集的系统中,每个进程都具有一张表,表中记求有运行时的工作集,每当程序被调度运行时,将工作集中的所有页调入内存。

    (2)请求调页策略。

    当进程在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便即提出请求,由 OS 将其所需页面调入内存。由请求调页策略所确定调入的页是一定会被访问的,再加之请求调页策略比较易于实现,故在目前的虚拟存储器中,大多来用此策略。但这种策略每次仅调入一页,故须花费较大的系统开销增加了磁盘 I / O 的启动频率

    2.从何处调入页面

    将请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方式,所以对换区的数据存取(磁盘 I / O )速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况进行:
    (1)系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件从文件区拷贝到对换区。
    (2)系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于它们未被修改,则不必再将它们重写到磁盘(换出),以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入。
    (3) UNIX 方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时应从对换区调入。由于 UNIX 系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无需再从对换区调入。

    3.页面调入过程

    每当程序所要访问的页面未在内存时(存在位为“0”),便向 CPU 发出一缺页中断,中断处理程序首先保留 CPU 环境,分析中断原因后转入缺页中断处理程序。该程序通过查找页表得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘I/O,将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法,从内存中选出一页准备换出;如果该页未被修改过(修改位为“0”),可不必将该页写回磁盘;但如果此页已被修改(修改位为“1”),则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。在缺页调入内存后,利用修改后的页表形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。

    4.缺页率

    假设一个进程的逻辑空间为 n 页,系统为其分配的内存物理块数为 m ( m ≤ n )。如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为 S ,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为 F ,则该进程总的页面访问次数为 A = S + F ,那么该进程在其运行过程中的缺页率即为
    f = F A f=\frac{F}{A} f=AF
    通常,缺页率受到以下几个因素的影响:

    • (1)页面大小。页面划分较大,则缺页率较低;反之,缺页率较高。
    • (2)进程所分配物理块的数目。所分配的物理块数目越多,缺页率越低;反之则越高。
    • (3)页面置换算法。算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页率是衡量页面置换算法的重要指标。
    • (4)程序固有特性。程序本身的编制方法对缺页中断次数有影响,根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行时的缺页程度越低

    事实上,在缺页中断处理时,当由于空间不足,需要置换部分页面到外存时,选择被置换页面还需要考虑到置换的代价,如页面是否被修改过。没有修改过的页面可以直接放弃,而修改过的页面则必须进行保存,所以处理这两种情况时的时间也是不同的。假设被置换的页面被修改的概率是 β,其缺页中断处理时间为ta,被置换页面没有被修改的缺页中断时间为 tb,那么,缺页中断处理时间的计算公式为
    t = β × t   a   + ( 1 − β ) × t   b   t=\beta\times t~a~+(1-\beta)\times t~b~ t=β×t a +(1β)×t b 


    展开全文
  • 计算机操作系统实验_源码_模拟请求分页虚拟存储管理中的硬件地址变换过程定义.pdf
  • 通过实现一个操作系统的内存管理的模拟系统,观察内存空闲分区管理、内存分配和回收过程,了解内存管理技术等特点,掌握内存管理中的分配、回收和置换算法,加深对请求调页系统的原理和实现过程的理解。
  • 5.在虚拟存储器基础上完成地址转换,缺页时能够实现页面置换; 6.页面置换过程能够模拟 FIFO、 LRU置换算法, 可将多次地址转换过程所涉 及到的页面视为进程的页面访问序列,从而计算置换次数和缺页率 。 7.OPT ...
  • C语言模拟实现虚拟存储管理请求分页存储管理

    千次阅读 多人点赞 2020-06-25 23:19:08
    本实验的目的是:通过编程模拟实现请求分页存储管理中硬件地址转换过程、缺页中断处理过程,以及先进先出页面置换算法,加深对页式虚拟存储管理的理解,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法...

    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

    展开全文
  • 1、使用下面( )存储管理方法可以实现虚拟存储。BCD A.分区 B.分页 C.分段 D.段页式 2、虚拟分页存储管理的方式包括()。AB A.请求分页 B.预调页 C.延后调页 D.强制调页 解释: 3、实现虚拟存储的目的是从物理上...

    9.1 虚拟存储技术

    1、使用下面( )存储管理方法可以实现虚拟存储。BCD
    A.分区
    B.分页
    C.分段
    D.段页式

    2、虚拟分页存储管理的方式包括()。AB
    A.请求式分页
    B.预调页
    C.延后调页
    D.强制调页

    解释:在这里插入图片描述

    3、实现虚拟存储的目的是从物理上扩充主存容量。×

    解释:
    在这里插入图片描述

    4、虚拟存储的实现是基于程序局部性原理,其实质是借助外存将内存较小的物理地址空间转化为较大的逻辑地址空间。

    5、进程的虚拟地址空间是指分配给该进程的虚拟内存。

    解释:
    在这里插入图片描述

    9.2 请求分页

    1、在请求分页存储管理中,当访问的页面不在内存时,便产生缺页中断,缺页中断是属于()。B
    A.I/O中断
    B.程序中断
    C.访管中断
    D.外中断

    2、在页式存储管理系统中,页表内容如表所列。

          页号       块号             
    
            0         2 
    
            1         1  
    
            2         6  
    
            3         3  
    
            4         7 
    

    若页的大小为4KB,则地址转换机构将逻辑地址0转换成物理地址为( )。 A
    A.8192
    B.4096
    C.2048
    D.1024

    3、在请求分页存储管理中,页面的调入、调出只能在内存和对换区之间进行。×

    4、虚拟页式存储管理基本思想是:进程开始运行之前,不是全部装入全部页面,而是装入一个或零个页面。进程运行之后,根据运行需要,动态装入其他页面。当内存空间已满,需要装入新的页面时,则根据某种算法置换内存中的某个页面,以便装入新的页面。

    5、请求分页与交换技术不同之处在于交换对象的粒度不同。交换对整个进程进行操作;而调页程序只是对进程的单个页面进行操作。

    9.3 页面置换

    1、下面( )概念在页式虚拟存储管理系统中一定用到? B
    A.紧凑
    B.缺页中断
    C.快表
    D.段表

    2、置换在内存中驻留时间最长的页面的置换算法是()。 A
    A.FIFO
    B.OPT
    C.LRU
    D.NRU

    3、人们已经观察到在两次缺页中断之间执行的指令数与分配给进程的页框数直接成比例。如果可用内存加倍,缺页中断间的平均间隔也加倍。假设一条普通指令需要1μs,但是如果发生了缺页中断,就需要2001μs (即2ms处理缺页中断),如果一个进程运行了60s,期间发生了15000次缺页中断,如果可用内存是原来的两倍,那么这个进程运行需要()时间。 B
    A.60
    B.45
    C.30
    D.15

    解释:
    设该程序共执行指令条数为n,根据题意,运行60s中发生15000次缺页中断,n必满足等式:15000×2001+(n-15000)=60000000,即n=30000000。在内存页面数加倍后,缺页中断次数降低一半,程序运行时间将为:7500×2001+(30000000-7500)=45000000μs=45s。

    4、请求分页存储管理中,页面置换算法很多,但只有最佳置换算法能完全避免进程的抖动,因此目前应用最广。其他(如改进型CLOCK)算法虽然也能避免进程的抖动,但其效率一般很低。 ×

    5、对一个进程而言,分配的页框越多,缺页率就越小。 ×

    展开全文
  • 模拟分页虚拟存储管理中硬件的地址转换和缺页中断,以及用先进先出(FIFO)页面调度算法处理缺页中断。 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。(题目四) 包含详细实验报告·
  • 请求分页系统是建立基本分页的基础上的,为了能支持虚拟存储器功能而增加了请求调页功能和页面置换功能。 相应地,每次调入和换出的基本单位都是长度固定的页面,这使得请求分页系统实现上要比请求分段系统简单...
  • 通过编写分页式存储管理的模拟程序,加深对页式存储管理方式的理解,熟悉逻辑地址到物理地址的转换过程,掌握虚拟存储管理中的页面调度算法,认识分页虚拟存储系统缺页中断的处理过程。 二、实验内容 1、设计一...
  • # include<stdlib.h> # include<stdio.h> # define pagesize 8 // 页面尺寸大小 typedef struct BLOCK // 声明一种新类型 --物理块类型 { int pagenum; // 页号 int accessed; // 访问量其值表示多久未被访问 }BLOCK...
  • 虚拟存储管理技术(分页

    千次阅读 2020-04-21 00:41:45
    虚拟存储系统的软件策略 驻留集管理 放置策略 获取策略 置换策略 缺页率 如果程序p运行访问成功的次数为s,不成功的次数为f,总次数a = s + f; F = f / a; F 为缺页中断率 - 驻留集管理 进程的驻留集:虚拟存储...
  • 虚拟存储器与请求分页系统详解

    千次阅读 2022-03-15 14:44:55
    驻留性:作业装入内存后,便一直驻留内存,直至作业运行结束 问题:一次性及驻留性程序运行时是否是必须的? 2、程序运行的局部性原理 3、虚拟存储器的定义 基于局部性原理,应用程序运行前,没有必要...
  • 这是操作系统中请求分页存储管理中的页面置换算法,有先进先出算法,OPT置换算法,LRu置换算法。
  • 模拟请求分页存储管理(OS实验)

    千次阅读 2021-05-17 16:46:00
    模拟请求分页存储管理(操作系统实验) 1. 实验要求 内存总容量4MB,页面大小4KB。 用户自定义创建进程(进程名和所需存储空间),随机生成该进程的页面访问序列。 实现页面序列的访问过程,记录页面状态、访问...
  • 模拟请求分页存储管理一、实验内容二、实验要求三、实验过程1、设计思想2、数据结构四、实验代码五、实验结果 一、实验内容 模拟请求分页存储管理方式。 二、实验要求 1、模拟请求分页存储管理方式,采用最近最久未...
  • 通过编写分页式存储管理的模拟程序,加深对页式存储管理方式的理解,熟悉逻辑地址到物理地址的转换过程,掌握虚拟存储管理中的页面调度算法,认识分页虚拟存储系统缺页中断的处理过程。 实验内容 设计一个分页...
  • 文章目录1.1 虚拟存储器的定义1.2 虚拟存储器的特征1.3 虚拟内存技术的实现1.4 请求分页管理方式1.4.1 页表机制1.4.2 缺页中断机构1.4.3 地址变换机构1.5 页面置换算法1.6 页面分配策略1.6.1 驻留集大小1.6.2 调入...
  • 操作系统原理 实验名称 虚拟页式管理 姓 名 学号 专业班级 实验日期 成 绩 指导教师 实验目的实验原理主要仪器设备实验内容与步骤实验数据记录与处理实验 结果与分析问题建议 实验二 模拟请求页式存储管理中硬件的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,216
精华内容 12,086
关键字:

在请求分页虚拟存储管理中