【愚公系列】软考中级-软件设计师 028-操作系统(存储管理-页式存储)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
操作系统的存储管理是指操作系统如何管理计算机的存储器,包括主存储器(RAM)和辅助存储器(硬盘、光盘等)。
主存储器是计算机中最主要的存储器,用于存放正在运行的程序和数据。操作系统通过内存管理机制来管理主存储器。常见的内存管理技术包括分区管理和页式管理。
分区管理将主存储器分为若干个固定大小的分区,每个分区可以存放一个进程或作为进程的一部分。分区管理采用静态分区分配或动态分区分配的方式,分别表示分区的大小是固定的还是可变的。分区管理还需要解决碎片问题,包括内部碎片(分区内部没有被利用的空间)和外部碎片(分区之间的空隙)。
页式管理将主存储器和进程的地址空间划分为固定大小的页,将进程的程序和数据分为若干个页框,与主存储器中的页框进行映射。通过页表来管理页和页框之间的映射关系。页式管理可以有效利用主存储器的空间,但需要额外的页表和访问开销。
除了主存储器,操作系统还需要管理辅助存储器的存储空间。辅助存储器的管理包括文件管理和虚拟存储器管理。
文件管理负责对文件的存储和访问进行管理。操作系统通过文件系统来组织和管理文件,并提供文件操作的接口,如创建、打开、读取、写入和删除文件等。
虚拟存储器管理将主存储器和辅助存储器结合起来,形成一个虚拟的、比主存储器容量更大的地址空间。操作系统通过页面置换算法将部分进程暂时存放在辅助存储器中,当需要时再将其调入主存储器。虚拟存储器管理可以提高系统的性能和资源利用率,但需要考虑页面置换算法的选择和调度策略。
🚀一、存储管理-页式存储
🔎1.页式存储
🦋1.1 概念
我们的程序往往大于内存的容量,因此在执行时,并不会一次性将所有内容都装入内存。相反,程序会被分为若干个固定大小的页,通常为4K。然后将这些页离散存储到内存中,而内存则按块划分。为了将程序中的页映射到内存中的块进行存储,我们使用页表。
在进程中,我们使用逻辑地址(虚地址)来表示地址,而在内存中,我们使用物理地址(实地址)来表示地址。
每个页被分为页号和页内地址。页号用于与块号相对应,表示存储的位置,页的大小可以表示页的数量。而页内地址表示存储的数据内容,它的大小可以表示数据的大小。通过页号和页内地址的组合,我们可以确定在内存中的具体地址。
当一个进程需要访问某个内存地址时,操作系统会首先查找进程的页表,确定该地址所对应的页。如果该页已经在内存中,操作系统直接将该页的内存地址返回给进程,进程可以直接访问。如果该页不在内存中,则发生缺页中断,操作系统会从磁盘中选择一个空闲的页面框,并将所需的页从磁盘读入到该页面框中,然后更新进程的页表,最后将页的内存地址返回给进程。
🦋1.2 优缺点
以下是页式存储的优缺点表格展示:
优点 | 缺点 |
---|---|
能够实现程序的非连续存储 | 页表管理和地址转换开销较大 |
提高了内存利用率 | 需要频繁进行页面调度和页表更新 |
方便进行进程间的共享和保护 | 存储管理的复杂性增加 |
允许在不同的进程之间动态分配和释放内存 | 可能导致内存碎片的产生 |
页面大小的选择可以灵活调整,以满足不同程序的需求 | 可能引起内存访问的局部性问题 |
实现了虚拟内存的机制,使得程序能够运行于比实际内存大小更大的地址空间 | 对于小规模程序和低配置机器,页式存储可能过于复杂和开销大 |
🔎2.页面置换算法
页面置换算法(Page Replacement Algorithm)是操作系统中用于解决内存管理中页面置换问题的一种方法。当内存不足时,操作系统需要选择一个页面将其从内存中置换出来,为新的页面腾出空间。
有时候,进程空间分为100个页面,而系统内存只有10个物理块,无法全部满足分配,就需要将马上要执行的页面先分配进去,而后根据算法进行淘汰,使100个页面能够按执行顺序调入物理块中执行完。
缺页表示需要执行的页不在内存物理块中,需要从外部调入内存,会增加执行时间,因此,缺页数越多,系统效率越低。
常见的页面置换算法有以下几种:
页面置换算法 | 优点 | 缺点 |
---|---|---|
最优算法 (OPT) | 理论上的最佳效率,保证未来执行的页面都是即将访问的 | 无法实现,只用于比较其他算法的差距 |
先进先出算法 (FIFO) | 算法简单,易于实现 | 可能产生抖动现象,即页数越多,缺页率越高 |
最近最少使用算法 (LRU) | 基于局部性原理,效率高,不会产生抖动现象 | 需要维护额外的数据结构,计算量较大 |
不同的页面置换算法有各自的优缺点,适用于不同的场景。操作系统需要根据具体的应用需求和性能要求选择合适的页面置换算法。
🔎3.快表
快表(Translation Lookaside Buffer,简称TLB)是存储管理中的一种高速缓存,用于加速虚拟地址到物理地址的转换过程。
在计算机系统中,使用虚拟内存来实现对内存的管理。虚拟内存将一个程序的地址空间划分为多个页(page),每个页的大小通常为4KB或者8KB。当程序访问某个虚拟地址时,需要将该虚拟地址转换为物理地址才能进行实际的内存访问。这个转换过程由操作系统中的页表(Page Table)来完成。
由于页表的大小可能很大,每次转换都需要访问内存,这样会导致比较高的延迟。为了加快地址转换的速度,引入了TLB。
TLB是一个高速缓存,存储了最近使用的一部分虚拟地址到物理地址的映射。当程序访问虚拟地址时,首先检查TLB是否已经缓存了对应的映射关系,如果缓存中存在,则直接使用缓存中的物理地址,从而避免了访问页表的开销。
如果TLB中不存在对应的映射关系,则需要访问页表来获取物理地址,并且将这个映射关系缓存到TLB中,以便将来的访问可以直接从TLB中获取物理地址。
TLB的大小有限,通常只能存储一部分的页表映射关系。当TLB已满并且需要存储新的映射关系时,需要进行替换。常用的替换算法包括最近最少使用(Least Recently Used,LRU)算法和随机替换算法。
TLB的存在可以大大加快地址转换的速度,提高程序的执行效率。然而,由于TLB是硬件资源,因此它的大小是有限的。如果程序的地址空间很大,TLB可能无法完全缓存所有的映射关系,这样会导致TLB的命中率降低,从而降低地址转换的速度。为了提高TLB的命中率,可以使用更高效的缓存替换算法,并且根据程序的访存模式进行优化。
快表是一块小容量的相联存储器,由快速存储器组成,按内容访问,速度快,并且可以从硬件上保证按内容并行查找,一般用来存放当前访问最频繁的少数活动页面的页号(可以看成是页表的频繁访问数据的副本)。
快表是将页表存于Cache中;慢表是将页表存于内存上。因此慢表需要访问两次内存才能取出数据,而快表是访问一次Cache和一次内存,因此更快。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)