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

(两百七十六)《OperatingSystems:ThreeEasyPieces》读书笔记(四)

第16章分段之前的基址寄存器界限寄存器会达到内部碎片和外部碎片的问题,内部碎片是由于堆栈可能内存空间使用不充分,中间有空闲内存,但仍分配

 第16章 分段

之前的基址寄存器+界限寄存器会达到内部碎片和外部碎片的问题,内部碎片是由于堆栈可能内存空间使用不充分,中间有空闲内存,但仍分配了对应的物理内存。外部碎片指分配完程序所需的内存空间后,整块内存中间有大大小小的碎片,即为外部碎片。

 

分段解决了内部碎片问题,为代码、堆和栈分别设置了基址寄存器+界限寄存器。即泛化的基址/界限

那带来了问题,如何确定代码堆栈和寄存器的对应关系呢?


  • 显示(将虚拟地址分为分割成段标识+偏移,段标识意指00 01 10 11)
  • 隐式(地址由程序计数器产生,地址在代码段,基于栈或基址指针,则在栈,否则在堆)

外部碎片可通过最优匹配、最坏匹配、首次匹配和伙伴算法或定期紧凑内存

 

分段仍不能很好解决堆大而稀疏的问题,还是会由内存碎片问题

 


第17章 空闲空间管理

问题:变长的分配请求怎么管理内存?什么策略碎片最小化?相对应的时间空间开销?

 

假设


  • 策略主要关心外部碎片
  • 内存分配后不可重定位到其他位置
  • 分配程序管理的是连续区域,可以要求其生长

另外分配内存时需要内存大小,但是释放时不需要时由于内存块有个头部,会记录当前分配的内存块大小,当释放时读取即可。

组成部分为:头块(size+magic,hptr指向)+请求分配区域(ptr指向)

 

基本策略:

最优匹配策略:找到和请求内存大小最接近的内存块,优点是避免浪费,缺点是时间复杂度高,性能损耗大

最差匹配:目的是保留较大的块,而不是像最优匹配一样剩很多小块,策略是找到最大的块进行分割

首次匹配:找到第一个足够大的块即进行分割

下次匹配:在首次匹配的基础上继续向后遍历首次匹配,多维护一个上次分配地址的指针,避免对列表开头频繁分割

分离空闲列表:管理类似相同的分配请求列表,实际应用当内核启动时,为频繁请求的内核对象创建了一些对象缓存,这些对象缓存每个分离了特定大小的空闲列表,因此可以快速响应和释放

伙伴系统:用户合并内存很方便,地址只需要改一位(分配内存时2的次幂,会有内部碎片问题)

 


第18章 分页

 分片:意为将内存分割成固定长度的分片

页表:虚拟内存页定位到对应的页帧上,映射关系存储在内存中

地址空间地址组成: VPN(虚拟页面号) + Offset(偏移量)

 


第19章  分页:快速地址转换(TLB)

分页:有性能消耗问题,会多一次对页表的内存访问,TLB用来优化该问题

 

大概流程:从虚拟地址中提取页号,然后检查TLB中是否由该VPN的转换映射,如果有,则有了TLB命中,这意味这TLB有该页的转换映射,接下来就从相关TLB项中取出页帧号(PFN),与原来虚拟地址中的偏移量组合形成期望的物理地址(PA),并访问内存。

如果没有命中,则硬件访问页表寻找转换映射,并将该转换映射更新TLB,TLB更新后会重新执行该整个流程。

 

总结来看就是TLB相对于页表进行了缓存,访问过一次后即命中后,可加快虚拟地址向物理地址的转换

 


第20章 分页:较小的表

分页还有另外一个问题:由于页号太多,页表会很大,进而消耗内存过高

策略

1.更大的页:减少了页,但是会带来内部碎片问题

2.混合方法:分段+分页,地址空间分割为 seg + VPN +offset,但对大而稀疏的堆处理的不大好

3.多级页表:页目录(+页次级目录)+页表(思想不局限于特定功能分段,而是将地址空间分成几块,分别对应于目录的映射,分的快速取决于总体页数除以每页能存储的页数)

 

时间和空间的折中

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 百度服务再次遭遇技术问题,疑似DNS解析故障
    近日晚间,百度多项在线服务出现加载异常,包括移动端搜索在内的多个功能受到影响。初步迹象表明,问题可能与DNS服务器解析有关。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • ThinkPHP框架中处理JS和CSS缓存问题的解决方案
    本文探讨了在ThinkPHP框架中,当启用调试模式(APP_DEBUG)时,删除public文件夹中的CSS和JS文件后页面仍然显示旧样式的问题,并提供了一种有效的解决方法。 ... [详细]
author-avatar
wo缘相聚在空间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有