精华内容
下载资源
问答
  • 在分页系统环境中
    千次阅读
    2021-12-22 14:47:28

    项目运行环境:Spring Boot + Mybatis/Mybatis-plus + PageHelper

    项目前提:本项目引入了一个由其它Spring Boot项目打包成的JAR包(这个很关键

    问题描述

    在IDEA中调试程序,分页正常;但通过WAR包部署时报错:“在系统中发现了多个分页插件,请检查系统配置”,具体报错信息如下:

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.lang.RuntimeException: 在系统中发现了多个分页插件,请检查系统配置!
    ### Cause: java.lang.RuntimeException: 在系统中发现了多个分页插件,请检查系统配置!
    

    错误的解决方法

    根据网上的方法尝试设置@SpringBootApplication(exclude = PageHelperAutoConfiguration.class),之后独立WAR包部署的项目可以正常运行,但是在IDEA中分页功能却失效了。

    解决方法

    上面的解决方法虽然没能最终解决问题,但是提供了一个思路,提示可能是自动配置的过程中出了问题

    在上面的解决方法中设置@SpringBootApplication(exclude = PageHelperAutoConfiguration.class)之后独立WAR包部署的项目可以正常运行,但是在IDEA中分页功能却失效了。说明确实是自动配置的问题,自动配置是需要的,但是如果配置两次的话就会报出“多个分页插件”的错误!

    问题分析

    1. 不管是在IDEA中调试还是独立WAR包部署,测试环境和生产环境基本一致,唯一不同是本地测试用的是Spring Boot的内置Tomcat启动的,而生产环境是运行在独立Tomcat中的。
      而用内置Tomcat启动类启动没有问题,但是WAR包部署到独立Tomcat就会出现这个报错,所以要看看有什么区别。

    2. 在将Spring Boot项目打包成WAR包时需要配置Application启动类继承SpringBootServletInitializer,并重写configure方法,而configure方法的作用就是要指定启动资源。

    3. 根据前面的分析可以猜测,是PageHelper相关的资源被指定了两次,所以启动的时候加载了两次这个资源,两次都自动配置了PageHelper插件,从而导致报错。所以可以根据这个思路去寻找项目中有哪些地方继承了SpringBootServletInitializer,并重写了configure方法

    4. 很简单地,可以猜到可能是自己引入的那个由其它Spring Boot项目打包成的JAR包出的问题。
      正常来说,将一个Spring Boot项目打包成JAR包时要删除其Application启动类,但是在某次打包时由于疏忽忘记了这个步骤,所以导致之后生成的WAR包中有两个继承了SpringBootServletInitializer的类,所以导致PageHelper插件被配置了两次。
      在这里插入图片描述

    5. 修改将被打包成JAR包的Spring Boot项目,去掉多余的Application,即可解决问题。

    说明

    本人追溯到的原因只是一种情况,但是可以按照这个思路去找问题。


    拓展部分

    PageHelper的自动配置类源码分析:PageHelperAutoConfiguration

    @Configuration
    @ConditionalOnBean(SqlSessionFactory.class)
    @EnableConfigurationProperties(PageHelperProperties.class)
    @AutoConfigureAfter(MybatisAutoConfiguration.class)
    public class PageHelperAutoConfiguration {
     
        @Autowired
        private List<SqlSessionFactory> sqlSessionFactoryList;
     
        @Autowired
        private PageHelperProperties properties;
     
        /**
         * 接受分页插件额外的属性
         *
         * @return
         */
        @Bean
        @ConfigurationProperties(prefix = PageHelperProperties.PAGEHELPER_PREFIX)
        public Properties pageHelperProperties() {
            return new Properties();
        }
     
        @PostConstruct
        public void addPageInterceptor() {
            PageInterceptor interceptor = new PageInterceptor();
            Properties properties = new Properties();
            //先把一般方式配置的属性放进去
            properties.putAll(pageHelperProperties());
            //在把特殊配置放进去,由于close-conn 利用上面方式时,属性名就是 close-conn 而不是 closeConn,所以需要额外的一步
            properties.putAll(this.properties.getProperties());
            interceptor.setProperties(properties);
            for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
                sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
            }
        }
    }
    
    1. 从源码也可以看出两次自动配置会加入了两个拦截器PageInterceptor,所以才会提示“多个插件”;
    2. 加上exclude=PageHelperAutoConfiguration.class之后,相当于排除了PageHelperAutoConfiguration.class,即不让PageHelper自动配置,所以取消自动配置后又出现分页失效的问题。

    参考

    https://blog.csdn.net/ejiao1233/article/details/83995511

    更多相关内容
  • 模拟请求分页系统中的地址变换过程 创建请求页表,通过编程模拟缺页中断和地址变换,实现请求调页功能和页面置换功能。 环境 JDK8+eclipse 步骤 (一)请求页表及快表的创建 0 1 2 3 4 5 页号 物理块号 状态...

    模拟请求分页系统中的地址变换过程

    创建请求页表,通过编程模拟缺页中断和地址变换,实现请求调页功能和页面置换功能。

    环境

    JDK8+eclipse

    步骤

    (一)请求页表及快表的创建

    012345
    页号物理块号状态位P访问字段A修改位M外存地址

    物理块号:当页在外存时为外存的物理块号,在内存时为内存的物理块号。
    状态位P:0为此页在外存,1为此页在内存。
    访问字段A:该页被访问的次数。
    修改位M:0为该页未被修改,1为该页被修改。
    外存地址:等于该页的外存物理块号。

      分析页表发现由于涉及多行多列数据的输入输出,所以需要创建一个二维数组,一行作为一页,各列作为组成页表的状态位P、修改位M等元素。但通过实际操作发现,在调用页表的i页中某一元素时,需要通过page[i][j]的方式,这样很难区分各个元素。因此将页表的各个元素分别用一维数组表示,页号用一维数组的下标表示,便解决了区分困难的问题,例如:页号为i的页的访问字段“visitA[i]”。

      而分析快表发现其结构与页表相同,因此只需要创建一个一维数组来存放从页表中调入的页的页号即可。

    (二)分析请求分页系统中的地址变换过程(下面出现的各方法均在(三)中展示)

    分析流程图整理编程思路:
    在这里插入图片描述
      在进行地址变换时,首先输入请求访问的逻辑地址然后pageNum()方法计算出页号,if判断此页页号是否大于页表长度,如果大于则越界中断。(下图)
    在这里插入图片描述

      如果小于则for循环检索快表,if语句判断所要访问的页是否在快表里,如果找到,则修改访问位和修改位并输出物理地址(由于此操作需要在代码中多次出现所以将其写成一个方法,即方法changeAM())。(下图)
    在这里插入图片描述

      如果在快表中未找到要访问页,则应到内存中去查找该页,即if判断该页的页表项中状态位statusP[pageNum()]是否为1。若为1则表示已调入内存,这时应将该页写入快表(修改快表的方法为changeFast()),然后修改访问位和修改位并输出物理地址。(下图)
    在这里插入图片描述
      若该页尚未调入内存,即状态位statusP[pageNum()]为0,这时应产生缺页中断(缺页中断方法为MPI()),请求OS从外存把该页调入内存。(下图)
    在这里插入图片描述
      缺页中断(方法MPI()),请求OS将所缺之页调入内存,这时需要 if 判断内存是否已满,即内存大小 inStore 是否等于0,不为0则内存未满,将此页调入内存,内存空间大小减去为此页分配的空间(下图),
    在这里插入图片描述
      修改页表,修改快表,形成物理地址。为0则内存已满,需要将内存中访问次数(即访问位 visitA[])最少的页换出,即将状态位 statusP[min] 置为0,并将换出页所占的内存物理块分配给换入页。(下图)
    在这里插入图片描述
      同时需要 if 判断换出页是否被修改,即判断修改位 ChangeM[min] 是否为1,为1则被修改,将该页写回内存,为0则未被改变。(下图)
    在这里插入图片描述
      修改页表,修改快表,形成物理地址。(下图)
    在这里插入图片描述
    (三)构建的方法
    1、pageNum() 方法:页号等于逻辑地址整除页面大小,返回页号(下图)
    在这里插入图片描述
    2、pageAdd() 方法:偏移量等于逻辑地址除以页面大小取余,返回偏移量(下图)
    在这里插入图片描述
    3、changeAM() 方法:修改访问位和修改位,形成物理地址(下图)
    在这里插入图片描述
    4、changePage() 方法:从外存读缺页,将请求页换入内存,修改页表,即换入页的状态位置为1( statusP[pageNum()]=1 )(下图)
    在这里插入图片描述
    5、changeFast() 方法:修改快表
    (1)如果快表满(下图)
    在这里插入图片描述
    (2)如果快表未满(下图)
    在这里插入图片描述
    6、TrueAdd() 方法:形成物理地址(下图)
    在这里插入图片描述
    7、putFP() 方法:输出快表方法(下图)
    在这里插入图片描述
    8、putPage() 方法:输出页表方法(下图)
    在这里插入图片描述
    (四)运行结果示范

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      (注:页表中物理块号和外存地址相同时,说明该页在外存,此时的物理块号是此页在外存的物理块号,当该页被调入内存后,物理块号才会变成分配给它的内存物理块号)

    结论

      想要实现模拟请求分页系统中的地址变换,首先要分析页表的各个元素所代表的含义以及页表与外存、内存和快表之间的联系。页表就相当于一个记录本,上面记录着各个页的当前状态,系统通过检索页表上页的状态来对页进行调入调出操作。

    代码文件下载

    链接: https://download.csdn.net/download/qq_49101550/15481871

    展开全文
  • 请求分页虚拟存储管理技术是把作业地址空间的全部信息存放磁盘上。当作业被选中运行时,先把作业的开始几页装入主存并启动运行。为此为作业建立页表时,应说明哪些页已主存,哪些页不主存。
  • 操作系统 请求分页管理(续)

    千次阅读 2020-12-23 13:19:19
    系统分配的物理块数少于此值时,进程将无法运行 进程应获得的最小物理块数与计算机的硬件结构有关,取决于指令的格式、 功能和寻址方式 对于单地址指令且采用直接寻址方式的机器,则所需最少2个物理块。其中,一块...

    页分配和页置换策略

    最小物理块数的确定

    • 指保证进程正常运行所需的最小物理块数。当系统分配的物理块数少于此值时,进程将无法运行
    • 进程应获得的最小物理块数与计算机的硬件结构有关,取决于指令的格式、 功能和寻址方式
    • 对于单地址指令且采用直接寻址方式的机器,则所需最少2个物理块。其中,一块存放指令页面,另一块则存放数据页面
    • 允许间接寻址的机器,至少要求有3个物理块
    • 对于长度是两个或多于两个字节指令的机器,其指令本身可能跨两个页面,且源和目标地址所涉及的区域也可能跨两个页面,至少需要6个物理块
      在这里插入图片描述

    物理块的分配策略

    • 在请求分页系统中,可采取两种内存分配策略,即固定可变分配策略。在进行置换时,也可采取两种策略,即全局置换局部置换。于是- 可组合出以下三种适用的策略
      • 固定分配局部置换(Fixed Allocation, Local Replacement)
        问题:分配块数难确定,太少,缺页频繁,吞吐量降低;太多,内存驻留进程数减少,CPU或其它资源可能空闲
      • 可变分配全局置换(Variable Allocation, Global Replacement)
        先分配给各进程一定数的物理块,系统有一空闲物理块队列,缺页时从空闲队列取,若空闲队列空时,在选页调出
      • 可变分配局部置换(Variable Allocation, Local Replacemen
        先分配给各进程一定数的物理块,缺页时从该进程在内存的页选一换出,若其频繁缺页,系统再分配若干附加物理块

    物理块分配算法

    • 平均分配算法

      • 这是将系统中所有可供分配的物理块,平均分配给各个进程
      • 例如,当系统中有100个物理块,有5个进程在运行时,每个进程可分得20个物理块。这种方式貌似公平,但实际上是不公平的,因为它未考虑到各进程本身的大小。如有一个进程其大小为200页,只分配给它20个块,这样,它必然会有很高的缺页率;而另一个进程只有10页,却有10个物理块闲置未用
    • 按比例分配算法

      • 这是根据进程的大小按比例分配物理块的算法。如果系统中共有n个进程,每个进程的页面数为Si,则系统中各进程页面数的总和为:
        在这里插入图片描述
        又假定系统中可用的物理块总数为m,则每个进程所能分到的物理块数为bi,将有:
        在这里插入图片描述
        b应该取整,它必须大于最小物理块数
    • 考虑优先权的分配算法

      • 在实际应用中,为了照顾到重要的、紧迫的用户程序能尽快地完成, 应为它分配较多的内存空间
      • 通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权适当地增加其相应份额后,分配给各进程
      • 在重要的系统,如实时控制系统,则可能是完全按优先权为各进程分配其物理块的

    何时调入页面

    • 预调页策略
      • 采用一种以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面预先调入内存,成功率50%
    • 请求调页策略
      • 当进程在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便提出请求,由OS将其所需页面调入内存
      • 目前的虚拟存储中大多采用此种策略

    从何处调入页面

    • 在请求分页系统中的外存分为两部分:

      1. 用于存放文件的文件区
      2. 用于存放对换页面的对换区

      通常,由于对换区是采用连续分配方式,而文件是采用离散分配方式,故对换区的磁盘I/O速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况。

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

    页面调入过程

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

    在这里插入图片描述

    调页的时机

    页面缓冲算法(PBA:Page Buffering Algorithm)

    • 虽然LRU和Clock置换算法都比FIFO算法好,但它们都需要一定的硬件支持,置换一个已修改的页的开销要大。而页面缓冲算法则既改善分页系统的性能,又可采用一种较简单的置换策略。
      特点:淘汰的页只是修改标志;若页被修改过,则在欲复盖它时回写,否则成批回写。
      在欲重访问该页时,若页换出则只需修改标志
    • 采用了可变分配局部置换方式,置换算法采用FIFO
    • 算法规定将一个被淘汰的页放入两个链表中的一个,即如果页面未被修改,就将它直接放进空闲链表中;否则,便放入已修改页面的链表中

    在这里插入图片描述

    PBA算法的主要特点是:

    1. 显著地降低了页面换进、换出的频率,使磁盘I/O的操作次数大为减少,因而减少了页面换进、换出的开销;
    2. 正是由于换入换出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出(FIFO)算法,它不需要特殊硬件的支持,实现起来非常简单。

    由于请求分页式虚拟存储器系统的性能优越,在正常运行情况下,它能有效地减少内存碎片,提高处理机的利用率和吞吐量,故是目前最常用的一种系统。

    但如果在系统中运行的进程太多,进程在运行中会频繁地发生缺页情况,这又会对系统的性能产生很大的影响,故还须对请求分页系统的性能做简单的分析。

    工作集及抖动现象的消除

    性能问题

    • 颠簸(抖动)
      在虚存中,页面在内存与外存之间频繁调度,以至于调度页面所需时间比进程实际运行的时间还多,此时系统效率急剧下降,甚至导致系统崩溃。这种现象称为颠簸或抖动
    • 原因
      • 页面淘汰算法不合理,分配给进程的物理页面数太少
      • 具体的说,同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。这会使得在系统中排队等待页面调进/调出的进程数目增加。造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。
        在这里插入图片描述
    • 进程发生缺页率的时间间隔与进程所获得的物理块数有关。
      在这里插入图片描述

    工作集的定义

    • 所谓工作集,是指在某段时间间隔Δ里,进程实际所要访问页面的集合。

    窗口为3、4、5时进程的工作集
    在这里插入图片描述

    采取局部置换策略

    • 在页面分配和置换策略中,如果采取的是可变分配方式,则为了预防发生“抖动”,可采取局部置换策略。

    把工作集算法融入到处理机调度中

    • 当调度程序发现处理机利用率低下时,它将试图从外存调入一个新作业进入内存,来改善处理机的利用率。

    利用“L=S”准则调节缺页率

    • Denning于1980年提出了“L=S”的准则来调节多道程序度,其中L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。
    • 如果是L远比S大,说明很少发生缺页,磁盘的能力尚未得到充分的利用;反之,如果是L比S小,则说明频繁发生缺页,缺页的速度已超过磁盘的处理能力。
    • 只有当L与S接近时,磁盘和处理机都可达到它们的最大利用率。理论和实践都已证明,利用“L=S”准则,对于调节缺页率是十分有效的。

    选择暂停的进程

    • 当多道程序度偏高时,已影响到处理机的利用率,为了防止发生“抖动”,系统必须减少多道程序的数目。

    优缺点

    优点

    1. 不要求进程的程序和数据在内存中连续存放,有效地解决了外部碎片问题。
    2. 提供了虚拟存储器,不要求进程中的程序和数据一次性全部装入内存,因此提高了内存的利用率,有利于多道程序的运行。

    缺点

    1. 增加了硬件成本。必须有相应的硬件支持,如地址转换机构、缺页中断机构和选择淘汰页等都需要硬件支持。
    2. 可能因逻辑地址空间过大或多道程序的个数过多而造成系统抖动现象的产生。
    3. 虽然消除了外部碎片,但进程的最后一页还存在内部碎片问题。
    展开全文
  • 操作系统--------分页存储管理

    千次阅读 2021-03-20 17:31:24
    连续分配方式会形成许多“碎片”,如果允许一个进程直接分散地装入到许多不相邻接的分区,便可充分地利用内存空间。所以产生了离散的分配方式,根据离散时分配地址空间的基本单位不同,可分为三种,这里我们只讲解...

    连续分配方式会形成许多“碎片”,如果允许一个进程直接分散地装入到许多不相邻接的分区中,便可充分地利用内存空间。所以产生了离散的分配方式,根据离散时分配地址空间的基本单位不同,可分为三种,这里我们只讲解分页存储管理。

    1.  页面和物理块

    (1)页面。分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存的物理地址空间分成若干个块,同样也为他们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位,将进程中的若干个页分别装入到多个不相邻的物理块中。由于进程的最后一页经常装不满一块,而形成了不可利用的碎片,称为“页内碎片”。

    (2) 页面大小。在分页系统中,若选择过小的页面大小,虽然一方面可以减小内存碎片,起到减少内存碎片总空间的作用,有利于内存利用率的提高,但另一个方面却会造成每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存。此外,还会降低页面换进换出的效率。然而,如果选择的页面过大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应是2的幂,通常为1KB~8KB。

    2.地址结构

    分页地址中的地址结构如下:

    它包含两个部分内容,前一部分为页号P,后一部分为位(偏)移量W,即页内地址。图中的地址长度为32位,其中0~11位为页内地址,即每页大小为4KB,12~31位为页号,地址空间最多允许有1M页。

    对某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:

                                                       P = INT[ A/L] ,    d = [A] MOD L

    其中,INT是整除函数,MOD是取余函数。例如,其系统的页面大小为1KB,设A = 2170B,则由上式可以求得P = 2,d = 122。

    3. 页表

    在分页系统中,允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程依然能够正确运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内所有页(0~n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见下图,在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。

      

    地址变换机构

    为了能将用户地址空间中的逻辑地址转换为内存空间中的物理地址,在系统中必须设置地址变换机构。该机构的基本任务是实现从逻辑地址到物理地址的转换。由于页内地址和物理地址是一一对应的(如,对于页面大小是1KB的页内地址是0~1023,其相应的物理块内地址也是0~1023,无需再进行转换),因此,地址变换机构的任务实际上只是将逻辑地址中的页号转换为内存中的物理块号。又因为页面映射表的作用就是用于实现从页号到物理块号的变换,因此,地址变换任务是借助于页表来完成的。

    1. 基本的地址变换机构

    进程在运行期间,需要对程序和数据的地址进行变换,即将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行变换,因此需要采用硬件实现。页表功能是由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址转换速度;但由于寄存器成本高,且大多数现代计算机的页表有可能很大,使业表项的总数达到几千甚至几十万个,显然这些页表项不可能都用寄存器实现。因此,页表大多驻留在内存中。在系统中只设置一个页表寄存器PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。平时,程序未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此在单处理机环境下,虽然系统中可以运行多个进程,但只需要一个页表寄存器。

    当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,于是这一错误将被系统发现,并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表长度的乘积想加,便得到该表项在页表中的位置,于是从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,在将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。见下图

    2. 具有块表的地址变化机构

    由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存,第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是第一次所得地址中获得所需数据(或向此地址写入数据)。因此,采用这种方式将使计算机的处理速度降低1/2。

    为了提高地址变换速度,可在地址变换机构中增设一个具有并行查询能力的特殊高速缓冲器,又称为“联想寄存器”或称为“快表”,在IBM系统中又取名为TLB,用以存放当前访问的那些页表项。此时的地址变换过程是:在CPU给出有效地址后,由地址变换机构自动将页号P送入告诉缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在快表中未找到对应的页表项,则还需再访问内存中的页表,找到后,把从页表项中读出的物理块号送往地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则os必须找到一个老的且已被认为是不再需要的页表项将它换出。见下图

    由于成本关系,快表不可能做的很大,通常只存放16~512个页表项。

    两级和多级页表

    由于现在计算机都支持非常大的逻辑地址空间,在这样的环境下,页表变得非常大,占用非常大的内存空间,而且要求是连续的,这显然是不现实的,为了解决这一问题,我们可以采用这两个方法来解决这一问题:1. 对于页表所需的内存空间,可采用离散分配方式,以解决难以找到一块连续的大小内存空间的问题;2. 只需将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。

    1. 两级页表

    针对于难以找到大的连续的内存空间来存放页表的问题,可利用将页表进行分页的方法,使每个页面的大小与内存物理块的大小相同,并为它们进行编号,即依次为0#页、1#页,····,n#页,然后离散地将各个页面分别存放在不同的物理块中。同样,也要为离散分配的页表再建立一张页表,称为外层页表,在每个页表项中记录了页表页面的物理块号。下面以32位逻辑地址空间为例来说明。当页面大小为4KB时(12位),若采用一级页表结构,应具有20位的页号,即页表项应有1M个;在采用两级页表结构时,再对页表进行分页,使每页中包含2^10(即1024)个页表项,最多允许有2^10个页表项;或者说,外层页表中的外层页内地址P2为10位,外层页号P1为10位。此时的逻辑地址如下图:

    由图可以看出,在页表的每个表项中,存放的是进程的某页在内存中的物理块号,如0#页存放在1#物理块中,1#页存放在4#物理块中。而在外层页表项中所存放的是某页表分页的首址,如0#页存放在1011#物理块中。我们可以利用外层页表和页表这两项页表来实现进程从逻辑地址到内存中物理地址的变换。

    为了方便地址转换,在地址转换机构中,同样需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号作为外层页表索引,从中找到指定页表分页的始址,再利用P2作为指定页表分页的索引,找到指定的页表实现,其中既含有该页在内存的物理块号,用该块号P和页内地址d即可构成访问的内存物理地址。下图为两级页表时的地址变换机构。

    上述对页表实行离散分配的方法,虽然解决了对于大页表无需大片连续存储空间的问题,但未解决用较少的内存空间去存放大页表的问题。能用较少的内存空间存放页表的唯一方法是,仅把当前需要的一批页表项调入内存,以后再根据需要陆续调入。在采用两级页表结构的情况下,对于正在运行的进程,必须将其外层页表调入内存,而对于页表则只需调入一页或几页。为了表示某页的页表是否已经调入内存,还应在外层页表项中增设一个状态位S,其值若为0,表示该页表分页不在内存中,否则说明其分页已调入内存。进程运行时,地址变换机构根据逻辑地址中的P1去查找外层页表;若找到的页表项中的状态位为0,则产生一个中断信号,请求OS将该页表分页调入内存。

    3. 反置页表

    (1). 反置页表的引入

    在分页系统中,为每个进程设置了一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中,通常允许一个进程的逻辑地址空间非常大,因此就需要有许多的页表项,而因此也会占用大量的内存空间。为了减少页表占用的内存空间,引入了反置页表。一般页表的页表项是按页号进行排序的,页表项中的内容是物理块号,而反置页表则是为每一个物理块号设置了一个页表项,并将他们按物理块的编号排序,其中的内容则是页号和其所隶属进程的标识符。

    (2). 地址变换

    再利用反置页表进行地址变换时,是根据进程标识符和页号,去检索反置页表。如果检索到与之匹配的页表项,则该页表项中的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。若检索了整个反置页表仍未找到匹配的页表项,则表明此页尚未装入内存。对于不具有请求调页功能的存储器管理系统,此时则表示地址出错。对于具有请求调页功能的存储器管理系统,此时应产生请求调页中断,系统将把此页调入内存。

    虽然反置页表可有效地减少页表占用的内存,例如,对于一个具有64MB的机器,如果页面大小为4KB,那么反置页表只占用64KB,然而在该表中只包含已经调入内存的页面,并未包含未调入内存的页面。因此,还必须为每一个进程建立一个外部页表。该页表与传统的页表一样,当所访问的页面在内存时,并不需要访问外部页表,仅当发现所需之页面不在内存时才使用它。在页表中包含了各个页在外存的物理位置,通过它可将所需之页面调入内存。

    由于在反置页表中是为一个物理块设置了一个页表项,当内存容量很大时,页表项的数目还是会非常大的。要利用进程标识符和页号去检索这样大的一张线性表是相当费时的。于是可利用Hash算法来进行检索,这样可以很快找到在反置页表中的相应页表项。

    页面置换算法

    不适当的算法可能会导致进程发生“抖动”,即刚被换出的页很快又要被访问,需要将它重新调入,此时又需要再选一页调出;而此刚被调出的页很快又被访问,又需要将它调入,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上,我们称该进程发生了“抖动”

    1. 最佳(Optimal)置换算法

    最佳置换算法是一种理论上的算法,其所选择的被淘汰的页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。但由于人们目前还无法预知,一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的

    2. 先进先出(FIFO)页面置换算法

    该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,使他总是指向最老的页面。

    3. 最近最久未使用算法(LRU)

    LRU置换算法选择最近最久未使用的页面予以淘汰。该算法赋予每一个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当只需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

    4. Clock置换算法

    (1) 简单的Clock置换算法

    当利用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1.置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,给予该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。如下图,由于该算法是循环地检查各页面的使用情况,故称为Clock算法,但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时将未使用过的页面换出,故又把该算法称为最近未用算法或NRU(Not Recently Used)算法。

    (2) 改进型Clock算法

    在将一个页面换出时,如果该页已被修改过便需将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。换言之,对于修改过的页面,在换出时所付出的开销比未修改过的页面大,或者说,置换代价大。在改进型Clock算法中,除须考虑页面的使用情况外,还须再增加一个因素——置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面;

    1 类(A = 0,M = 0):表示该页最近即未被访问,又未被修改,是最佳淘汰页。

    2 类(A = 0,M = 1): 表示该页最近未被访问,但已被修改,并不是很好的淘汰页。

    3 类(A = 1,M = 0):表示最近已被访问,但未被修改,该页有可能再被访问。

    4 类(A = 1,M = 1):表示最近已被访问且被修改,该页可能再被访问。

    在内存中的每个页,都必定是这四类页面之一。在进行页面置换时,可采用与简Clock算法相类似的算法,其差别在于该算法必须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程分成以下三步:

    (1) 从指针所指示的当前位置开始,扫面循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为选中的淘汰页。在第一次扫描期间不改变访问位A。

    (2) 如果第一步失败,即查找一轮后未遇到第一类页面,则开始第二轮扫描。寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面访问位都置0。

    (3) 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,即寻找A=0且M=0的第一类页面,如果仍失败,必要时再重复第二步,寻找A=0且M=1的第二类页面,此时就一定能找到被淘汰的页。

    该算法与简单Clock算法比较,可减少磁盘的I/O操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。              

    展开全文
  • 文章目录一、分页存储管理方式1. 分页存储管理的基本方法2. 地址变换机构3. 访问内存的有效时间4. 两级和多级页表5. 反置页表二、分段存储管理方式1....根据离散分配时所分配的地址空间的基本单位不同,将离
  • 请求分页系统是建立基本分页的基础上的,为了能支持虚拟存储器功能而增加了请求调页功能和页面置换功能。 相应地,每次调入和换出的基本单位都是长度固定的页面,这使得请求分页系统在实现上要比请求分段系统简单...
  • ** 【操作系统】基本分页和分段存储管理方式 ...在分页存储管理方式,如果不具备页面对换功能,不支持虚拟存储器功能,这种存储管理方式称为纯分页或基本分页存储管理方式。 调度作业运行时,必须将它的所有页面一
  • 请求分页系统工作机制

    千次阅读 2016-11-13 15:53:01
    请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。作业执行过程,当所要访问的页面不内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,...
  • 操作系统大作业 分页式存储管理 页面置换算法,是我自己最近刚写的,这是第二次写这个程序了,感觉写得比上次好多了,挺不错的。
  • Windows 分页文件 环境 Windows7 64位 一、定义介绍   分页一词由Paging翻译而来。所谓的分页,其本质是对页的一种操作。页是磁盘和内存间传输数据块最小单位
  • 内存管理-请求分页分配方式-设计方案报告 ​ 目录 文章目录内存管理-请求分页分配... 开发环境3. 项目结构4. 操作说明5. 系统分析5.1 置换算法5.1.1 FIFO算法5.1.2 LRU算法5.2 指令产生方式6. 系统设计6.1 类设计6.1.
  • 【操作系统分页存储管理方式

    万次阅读 多人点赞 2016-12-12 21:16:25
    变连续分配为离散分配,允许将作业离散放到多个不相邻接的分区分页式存储管理:离散分配的基本单位是页 分段式存储管理:离散分配的基本单位是段 段页式存储管理:离散分配的基本单位是段、页 页面和物理块空间...
  • 主要介绍了Django Rest framework三种分页方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • VB演示使用ADO控件分页的例子,这例子或许对编写信息系统的有用,分页是必不可少的,使用ADO的若不知道如何对Datagrid分页的话,这个例子就相当适合你了。数据采用SqlServer。 运行环境:VB6+MSSQL
  • 操作系统13————存储器管理之分页存储 一.目录 操作系统13————存储器管理之分页存储 一.目录 二.概述 三.分页存储管理的基本方法 1.页面和物理块 2.地址结构 3.页表 四.地址变换机构 ...
  • 基本分页存储管理的原理分区存储管理,要求把作业放在一个连续的存储区,因而会产生许多碎片,固定分区会产生内部碎片,动态分区会产生外部碎片。尽管通过拼接技术可以解决碎片问题,但代价较高。分页存储...
  • 计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充主存储器称为虚拟存储器。通过本实验帮助...
  • 一、 物理地址和逻辑地址 物理地址:加载到内存地址寄存器的地址,内存单元的真正...物理地址是明确的、最终用总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege c...
  • 本文将对Paging分页组件的设计和实现进行一个系统整体的概述,强烈建议 读者将本文作为学习Paging 阅读优先级最高的文章,所有其它的Paging中文博客阅读优先级都应该靠后。
  • 基本分页存储管理一、实验内容及要求二、实验环境三、设计思想四、数据结构五、实验代码六、运行结果 一、实验内容及要求 模拟分页存储管理方式; 模拟分页存储管理方式,定义地址变换机构函数; 程序要添加适当的...
  • latex多行表格分页问题

    千次阅读 2020-12-23 06:42:42
    展开全部可以采用e5a48de588b...使用它提供的longtable跨页表格环境:\begin{longtable}[位置]{列格式}表格行...\end{longtable}除了[位置]可选参数不同外,[列格式]和[表格行]的设置方法与tabu...
  • pbootcms 程序自带的分页样式为: {page:bar} ,时间长了发现难以满足不同网站仿制时分页的要求,系统zidai {page:bar} 系统内置的完整分页条 {page:current} 当前页码 {page:count} 总页数 {page:...
  • 40请求分页管理方式

    2021-01-27 09:45:18
    请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。作业执行过程,当所要访问的页面不内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,...
  • 上一节所讨论的各种内存管理策略都是为了同时将多个进程保存内存以便允许多道程序设计。它们都具有以下两个共同的特征: 1) 一次性 作业必须一次性全部装入内存后,方能开始运行。这会导致两种情况发生: 当...
  • 早期的计算机系统中,主存容量很小,虽然主存仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生,这一矛盾可以用覆盖技术来解决。 覆盖的基本思想是:由于程序运行时并非任何时候都要访问程序及...
  • java汽车租赁系统.zip

    2021-03-09 13:21:56
    系统名称 汽车租赁系统 carRental ...开发环境 操作系统:Windows 10 编程语言:Java 开发工具:IDEA、Navicat、Git 项目构建:Maven 3.5.2 服务器:Tomcat 8.5 数据库:MySQL 代码托管平台:GitHub
  • 操作系统课后答案第四章

    千次阅读 2022-04-10 14:10:18
    微处理机内部设置各种缓冲存储器,减轻对存储器存取的压力。增加CPU寄存器数量大大缓解对存储器压力。 2、可采用哪几种方式将程序装入内存?它们分别适用于何种场合? 答:(1)绝对装入方式,只适用于单道程序...
  • 请求分页与请求分段管理方式

    千次阅读 2020-05-12 11:56:45
    请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。作业执行过程,当所要访问的页面不内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,669
精华内容 41,467
关键字:

在分页系统环境中