热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【操作系统(一)】虚拟内存

本文内容总结于《操作系统概念》PeterBaerGalvin.GregGagne著,郑扣根译这本书讲的很详细,翻译的也很好,非常的全面&#

本文内容总结于《操作系统概念》 Peter Baer Galvin . Greg Gagne 著, 郑扣根 译
这本书讲的很详细,翻译的也很好,非常的全面,拿来用来学习操作系统足矣。
在未来的 2-3 月内,我将以此书为向导,以内核源码为依托,对操作系统刨根问底。





本系列文章与我的内核源码与Android系列分析与解读 系列文章相辅相成。感兴趣的人可以多翻阅。





操作系统简述这个文档只是对操作系统的简单的总结。





  • 使用虚拟内存,每个进程都有属于自己的虚拟地址空间,显著优点就是程序可以比物理内存大。同时将用户看到的逻辑地址和物理内存分开。允许程序员不受内存存储的限制。也允许进程间共享文件和地址空间,还为创建进程提供了有效机制。

1. 背景

很多情况下不需要将程序都加载到物理内存。

优点:


  • 程序不再受物理内存空间限制。
  • 每个用户程序使用更少的物理内存,更多的程序可以同时执行,CPU使用率也相应增加,响应时间和周转时间并不增加。
  • 载入或交换每个用户程序到内存所需的IO会更少,用户程序会运行更快。


虚拟内存将用户逻辑内存和物理内存分开,需要内存管理单元MMU将逻辑页映射到内存的物理页帧。



虚拟内存也允许文件和内存通过共享页而为两个或多个进程所共享。


  • 通过共享对象映射到虚拟地址空间,系统库可为多个进程所共享。
  • 虚拟内存允许进程共享。(通过共享内存)
  • 虚拟内存允许在系统调用fork()创建进程期间共享页,从而加快进程创建。

2. 按需调页(demand paging)

当需要执行进程时,将所需要的页从磁盘交换至内存,使用懒惰交换(lazy swapper)。将所需要的页通过调页程序加载至内存。



**首先需要区分哪些页在内存,哪些在磁盘。**页表的有效位和无效位(valid-invalid)可以用于这一目的。当该位设置为有效时,该值表示相关的页既合法且也在内存中。当该位设置为无效(也就是,不在进程的逻辑地址空间内),或者有效但是在磁盘上。对于调入内存的页,其页表条目的设置和平常一样;但是对于不在内存的页,其页表条目设置为无效,或包含该页在磁盘的地址。

**对标记为无效的访问会产生页错误陷阱(page-fault trap)。**分页硬件,在通过页表转换地址时,将发现已设置了无效位,会陷入操作系统。这种陷阱是由于操作系统未能将所需的页调入内存引起的。处理这种页错误的程序比较简单。

处理页错误的步骤




  1. 检查进程的内部页表(通常与PCB一起保存),以确定该引用是合法还是非法的地址访问。
  2. 如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,那么现在应调入
  3. 找到一个空闲帧(从空闲帧链表中选一个)。
  4. 调度一个磁盘操作,以便将所需要的页调入刚分配的帧。
  5. 当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。
  6. 重现开始因陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。

按需调页的性能:

页的错误率为:P(0~1)
有效访问时间: = (1-p) * ma + p x 页错误时间。

ma 指 内存访问时间。



其中页错误时间为8ms&#xff0c; 性能降低不超过10%&#xff0c; p <0.0000025




2. 写时复制&#xff08;copy on write&#xff09;

写时拷贝技术&#xff0c;最先看到这个名词时是在看fork技术的时候。讲的时由于fork子进程创建为父进程的复制品&#xff0c;但是子进程在创建之后通常会马上执行系统调用exec(), 所以这种复制进程地址空间没有必要。
写时复制允许父子进程共享页面&#xff0c;这些页面被标记为写时复制页&#xff0c;即如果任何一个进程需要对页进行写操作&#xff0c;那么就创建一个共享页的副本。


3.页面置换

页置换&#xff1a; page replacement &#xff08;当页面过度分配时&#xff0c;会产生没有空闲帧&#xff0c;所有内存都在使用&#xff0c;此时可以终止进程&#xff0c;也可以交换出一个进程。更常用的方法是页置换。&#xff09;

为了实现按需调页&#xff0c;必须解决两个问题&#xff1a; 帧分配算法&#xff08;frame-allocation algorithm&#xff09;和页置换算法&#xff08;page-replacement algorithm&#xff09;。 这里重点说页置换算法。



指标&#xff1a; 最小的页错误率&#xff01;&#xff01;&#xff01;&#xff01;


  1. FIFO &#xff1a; 性能并不总是很好&#xff01;

Belady异常&#xff1a; 帧数越多页错误率反而越高。。。。页错误率可能会随着分配的帧数的增加而增加&#xff0c;原期望为增加内存会改善其性能。


  1. 最优置换算法&#xff08;OPT optimal page-replacement algorithm&#xff09;

置换出最长时间不会使用的页&#xff01;

弱点&#xff1a; 难以实现。常用来比较&#xff01;


  1. LRU页置换&#xff08;Least-recently-used algorithm&#xff09;

  • 最近最少使用算法。可使用1. 计数器实现&#xff08;记录时间戳&#xff09; 2. 栈
  • 注意&#xff0c;如果只有标准TLB寄存器而没有其他硬件支持&#xff0c;这两种LRU实现都是不可能的。每次内存引用都必须更新始终域或栈。如果对每次引用都采用中断&#xff0c;以允许软件更新这些数据结构&#xff0c;那么它就会使内存引用慢至少10倍&#xff0c;进而使用户进程慢10倍。几乎没有系统可以忍受如此程度的内存管理开销。

  1. 近似LRU页置换

    1. 附加引用位算法
      内存页表中的页保留8位的字节。从高位开始置位&#xff0c;将其他位向右移动&#xff0c;并抛弃最低位。所以这8位移位寄存器包含着该页在最近8个时间周期内的使用情况。值为11000100的移位寄存器的页要比值为01110111的页更为最近使用。具有最小值的页为LRU页&#xff0c;可以被置换。
    2. 二次机会算法
      基本算法是FIFO置换算法。当选择一个页时&#xff0c;引用位为0&#xff0c;则直接置换此页&#xff0c;否则给其第二次机会&#xff0c;并选择下一个FIFO页。当一个页获得第二次机会时&#xff0c;其引用位清零&#xff0c;其到达时间设为当前时间。
    3. 增强型二次机会算法
      通过将引用位和修改位作为一个有序对来考虑&#xff0c;可以改进二次机会算法。每个页有以下四种可能类型。
      1. &#xff08;0&#xff0c; 0&#xff09;最近没有使用也没有修改----用于置换的最佳页
      2. &#xff08;0&#xff0c; 1&#xff09;最近没有使用&#xff0c;但修改过----不是很好&#xff0c;因为在置换之前需要将页写出到磁盘。
      3. &#xff08;1&#xff0c; 0&#xff09;最近使用&#xff0c;但没修改----他很有可能再次被使用
      4. &#xff08;1, 1&#xff09;最近使用&#xff0c;并修改----很有可能再次被使用&#xff0c;在置换之前需要将页写出到磁盘。

这种方法与简单时钟算法的主要差别是&#xff0c;给那些已经修改过的页以更高的级别。从而降低了所需 I/O 的数量。


  1. 基于计数的页置换算法

    1. 最不经常使用页置换算法&#xff08;least frequently used &#xff08;LFU&#xff09;page-replacement algorithm&#xff09;&#xff0c;要求置换计数最小的页。可能有很多页在开始时大量使用&#xff0c;之后不再使用&#xff0c;可以定期地将次数寄存器右移一位&#xff0c;以形成指数衰减的平均使用次数。
    2. 最常使用页置换算法&#xff08;most frequently used (MFU&#xff09; page-replacement algorithm), 具有最小次数的页可能刚刚调进来&#xff0c;且还没有使用。

这两种算法都不常用&#xff0c;很费时&#xff0c;不能很好地接近OPT置换算法。


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
mobiledu2502931437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有