热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

操作系统知识回顾(6)虚拟内存与文件分配

虚拟内存在逻辑上实现了对内存容量的扩充,既满足了用户的需要,又改善了系统性能。这篇文章总结了虚拟内存的基本概念、实现方式以及几种页面置换算法。最后是几种

虚拟内存在逻辑上实现了对内存容量的扩充,既满足了用户的需要,又改善了系统性能。这篇文章总结了虚拟内存的基本概念、实现方式以及几种页面置换算法。最后是几种文件分配方式。

基本概念

局部性原理:程序执行时,在一较短时间内,程序的执行仅仅局限于某一部分,其访问的存储空间也局限于某个区域。主要表现在两个方面:

  • 时间局限性:如果某条指令被执行,不久以后该指令可能再次执行;如果某些数据被访问,不久以后该数据可能再次被访问;
  • 空间局限性:如果某段存储单元被访问,其附近的存储单 元可能也会被访问。

基于局部性原理,在加载程序时,只需将当前执行所需的部分页面或段装入内存。程序执行时,如果要访问的页面或段不在内存中,则发生缺页中断,于是 OS 利用请求调页功能将相应的页面或段调入内存,继续执行。如果内存已满,则利用置换功能,将内存中暂时不用的页面或段调出到外存,再将所需的页面或段调入内存,使程序继续执行。

虚拟内存是指具有请求调入功能和置换功能,从逻辑上对内存容量进行扩充的一种内存系统。实现方式有三种:请求分页存储管理方式、请求段式存储管理方式和请求段页式存储管理方式。

请求分页存储管理

请求分页存储管理是在分页存储管理的基础上,增加请求调页和页面置换功能。它允许用户程序只装入部分页面就启动程序运行。在运行中如果发现所需页面不在内存中,则发出缺页中断,OS 就会将外存中相应的页面调入内存使其继续运行。每次调入和换出的基本单位是长度固定的页面。

请求分页存储管理中的地址转换与分页式相比,在页表项中添加了一些标志位:

  • 状态位:表示该页是否已调入内存。
  • 修改位:表示该页在调入内存后是否被修改过。在置换该页时,判断是否要把它写回外存。
  • 访问位:表示该页在一段时间内被访问的次数。供置换算法在选择换出页面时参考。
  • 外存地址:表示该页在外存上的地址。

请求分页存储管理系统中,在进行地址转换时,首先在快表中查找要访问的页。如果找到,便修改页表项中的访问位,供置换算法选择换出页面时参考。如果是写指令,还需要将修改位置为 1,表示该页在调入内存后被修改过。然后利用页表项中的物理块号和页内地址,得到物理地址。

如果在快表中未找到该页的页表项,则应到内存中去查找页表,再从找到的页表项中的状态位来判断该页是否调入内存。如果该页已调入,则应将该页的页表项写入快表;如果该页没有调入内存,则应该产生缺页中断,操作系统从外存中找到缺失的页面。

如果内存已满,则利用置换算法选择一页换出,如果该页被修改过,则需要将该页写回到外存中。最后将缺页从外存换入到内存中,继续运行程序。

页面置换算法

最优算法(Optimal)

置换在未来最长时间内不再被访问的页面。这只是一种理想情况,只能用来评价其他置换算法的性能。

先进先出算法(FIFO)

选择进入内存时间最长的页面进行置换。在实现时维护一个所有已调入内存的页面的链表,按照进入内存的先后次序排序,链首最早,链尾最进。在出现缺页时,选择链首的页面进行置换,将新页面添加到链尾。

这种算法实现简单。但调出的页面可能会经常访问,性能较差,一般和其他算法结合使用。

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

选择最长时间没有使用的页面进行置换。它依据的是如果某个页面长时间没有被访问,则在将来一段时间可能还不会访问。

在实现时维护一个按最近一次访问时间排序的链表,链表首是刚使用过的页面,链表尾是最久未使用的页面。在访问页面时,找到相应的页面,将其移动到链表首;在出现缺页时,删除链表尾节点,将新页面添加到链表首。

这种算法是最优算法的一种近似,但实现起来仍然比较复杂。

时钟算法(Clock)

也称为最近未使用算法(NRU)。在实现时,在页表项中增加一个访问位,表示过去一段时间内是否被访问过,初始时都置为 0,另外将页面组织成环形链表,添加一条指针指向最先被调入内存的页面。

当访问某页面时,将其访问项置为 1。在出现缺页异常时,从指针处开始查找,如果页面没有被访问过,即访问项为 0,则进行置换;如果被访问过,则将访问项置为 0,暂不换出,再将指针指向下一个页面继续查找,直到找到可以置换的页面。

最少使用算法(LFU)

置换最近一段时间访问次数最少的页面。在实现时,对每个页面设置一个访问计数,在访问页面时,对访问计数加 1;在出现缺页异常时,置换访问计数最少的页面。

文件分配

文件分配实际上是如何表示分配给一个文件的数据块的位置和顺序。主要有以下几种分配方式:连续分配、链式分配和索引分配。

连续分配

使用连续的若干个数据块来存储文件。它在文件控制块中记录起始第一个数据块的位置和长度。

采用连续分配方式,读取文件的顺序访问和随机访问效率较高,但是剩余的碎片难以利用,另外文件长度增长也比较复杂。

链式分配

将文件以数据块链表的形式存储。文件控制块中包含了第一个数据块和最后一个数据块的指针。

链式分配方式在创建、增大、缩小文件时比较容易,而且没有碎片,但是不能实现真正的随机访问,另外一个数据块被破坏,后面的数据块就都丢了。

索引分配

为每个文件创建一个索引数据块,索引数据块中存储了指向文件数据块的指针列表,文件控制块中包含了指向索引数据块的指针。

这种实现在创建文件、增大、缩小文件时比较容易,也没有碎片,也支持随机访问。但是在文件很小时,存储索引开销相对较大,在文件很大时,需要增加额外的索引快。

UFS(Unix File System)

UFS 的多级索引分配:在文件控制块中,如果数据块小于 10,采用直接索引;如果大于 10 块,第 11 块开始采用一级间接索引,它先指向一个索引块,索引块中再指向实际的数据块。如果数据块大到一定程度,会采用二级间接索引,依次类推。

多级索引分配方式大大提高了文件大小的限制阈值,可以动态分配数据块,文件扩展很容易,对于小文件开销较小,对于大文件使用间接索引也比较合理。



推荐阅读
  • Google排名优化-面向Google(Search Engine Friendly)的URL设计 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了Vim编辑器的三种主要模式及其常用命令,帮助用户更好地掌握这一强大的文本编辑工具。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
author-avatar
发出耀眼气息
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有