当前位置: 首页 > news >正文

网站建设一条龙全包顶呱呱珠海做网站的公司

网站建设一条龙全包顶呱呱,珠海做网站的公司,正规seo排名外包,app软件开发策划书操作系统核心知识点整理--内存篇按段对内存进行管理内存分区内存分页为什么需要多级页表TLB解决了多级页表什么样的缺陷?TLB缓存命中率高的原理是什么?段页结合: 为什么需要虚拟内存#xff1f;虚拟地址到物理地址的转换过程段页式管理下程序如何载入内存#xff1f;页面置… 操作系统核心知识点整理--内存篇按段对内存进行管理内存分区内存分页为什么需要多级页表TLB解决了多级页表什么样的缺陷?TLB缓存命中率高的原理是什么?段页结合: 为什么需要虚拟内存虚拟地址到物理地址的转换过程段页式管理下程序如何载入内存页面置换总结推荐阅读本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱每小节参考文章链接都已经在小节末尾给出如果大家有疑问可以评论区留言或者直接去阅读原文。 按段对内存进行管理 为什么程序要按段载入内存? 如果我们直接将程序代码全部放到内存中这不利于内存的利用和程序的运行因为通常程序被编译后都会分为多个段各个段都有其各自的特点如: 代码段只读栈段和堆可以动态扩展。因此通常会将程序分段载入内存中来如果不进行分段载入如果程序栈空间不足需要扩展就需要复制整个程序代码到新分配好的更大的内存空间才可以。 内存分段管理是怎么个玩法 ? 每个进程需要关联一个段表用于记录当前进程对应程序的各个段信息如: 段的基址段的限长段的特权级等 程序分段载入内存这个过程中需要不断为每个段在内存中寻找空闲分区同时在对应进程的段表中添加一条表项记录当前段的存放位置等信息 内存分区 如果我们采用内存分区的方式来对物理内存进行管理那么此时我们有两种选择: 固定分区可变分区 显然我们程序的各个段的大小都是不固定的因此固定分区可以排除。 如果采用可变分区进行管理我们需要使用空闲分区表或者空闲分区链表的方式来记录当前内存中各个空闲分区块。 当接受到一个段内存申请请求时我们可以采用: 首次适配最佳适配最差适配首次循环适配等算法来进行内存的分配。 但是无论采用何种分配算法都容易导致内存碎片的产生随着分配次数的增加内存碎片越来越多当某个内存申请请求发起后发现只有内部内存碎片才能完成内存分配时这时候就需要进行内存紧缩。 内存紧缩需要花费的时间开销很大这个过程中cpu无法访问内存给用户的感觉就是操作系统死机了。 内存分页 想要解决内存分区导致的内存碎片问题最简单的方法就是采用内存分页针对每个段的内存请求系统一页一页的分配给这个短加入这个段需要3页半的大小的内存那我就分配给他四整页的内存。 当我们将段数据打散存放到多个页中时由于四个物理页的顺序未必是连续的所以我们需要将分配给段0的页进行编号这里的编号我们称为虚页号那么下一个问题就来了如何根据虚页号定位物理页号呢 页表: 存放虚页号到物理页号的映射关系 如果对物理内存采用分页管理那么此时我们程序发出的逻辑地址就由虚页号页内偏移组成了通过查询页表将虚页号转换为对应的物理页号最终计算出物理地址: 为了实现页表的快速查询在页表中虚页号不直接提供而是作为页表数组的索引隐含其中但是这就意味着页表必须要连续的内存存储。 为什么需要多级页表 以Linux 0.11中每页4K进行计算对于32位操作系统而言其发出的32位的虚拟地址最多可以定位到1M的页数。 那么就意味着页表需要维护1M个虚拟页号和物理页号的映射关系那么页表占据的内存就会很大。 解决这个问题有两种思路: 由于大部分逻辑地址用不到因此我们只在页表中存储用到的虚页号如果采取这个办法那么我们就无法通过虚页号快速定位到页表中的具体表项了可能需要多出几千次额外内存访问。– 页表必须是顺序排列的没用到的虚页号也必须保留这样才能够以一次访存的代价定位到具体的表项。多级页表: 我们目前遇到的困境是: 页表项太多并且要求页表中的页表项是连续存放的不管当前虚页号是否用到。 解决思路: 借鉴书目录与小节的思想将页表项分散存储到多个页表中各个页表内的页表项是连续存储的然后通过页目录管理多个页表确保多个页表之间的顺序性从而就保证了页表项整体顺序性。 引入了多级页表中我们的页目录中的页目录项都是连续存放的每个页目录项指向一个页表这保证了多个页表之间的顺序性。 当前进程只需要载入自己需要的页目录项指向的页表到内存即可至于自己用不到的页目录项则无需载入其对应的页表到内存这样可以大大节约内存并且访问次数也只需要两次即可。 同时只有一级页表才总是需要缓存在内存中的对于二级页表而言也只会在需要用到的时候才申请内存进行创建这对于一个普通程序而言在虚拟地址空间大部分都是未分配的情况下会节约大量的内存。 TLB解决了多级页表什么样的缺陷? 多级页表的缺陷: 相比于单级页表层级每增加一级都需要多出一个访问内存的开销。 但是为了保证页表项的整体连续性并且还要减少页表对内存的浪费就必须采用多级页表的形式但是多级页表时间上的不足就需要通过缓存来弥补了也就是TLB。 通过CPU内部的TLB寄存器来缓存最近使用到的页并且因为TLB采用的是相联存储设计硬件可以直接通过虚页号定位到缓存中某个表项然后直接得到对应的物理页号从而计算出物理地址。 TLB缓存命中率高的原理是什么? 程序访问存在局部性原理通常在某个时间段内只会频繁某几个页面号那么因为TLB缓存了对应的页面号所以命中率就很高。 段页结合: 为什么需要虚拟内存 首先我们的程序需要按段载入内存如果按照上面最终敲定的内存分页方案那么我们程序的各个段都会被打散存放到多个不相邻或者相邻的物理页上,当然还需要给每个物理页编排一个虚拟页号用于还原段这个过程中使用页表完成虚页号到物理页号的映射关系: 这种方式对于内存的管理而言非常友好不会造成内存碎片但是站在程序的视角来看段内的内存是不连续的。 我们开发者更希望看到的进程内存图是各个段在内存上连续存放: 问题: 能否站在程序员的视角看来程序分段存放在内存上的模样是连续的但是站在物理内存视角看来却是分页管理的呢 为了实现呈现给上层用户段连续存放的内存图模型操作系统提供了对应虚拟内存来解决这个问题。 有了虚拟内存的之后用户写的程序首先在虚拟内存中划分出对应的空间来存放但是实际程序载入内存时却会根据先前划分的虚拟地址空间分别打散存储到对应多个物理页上。 当用户想要访问内存时也只需要面向虚拟内存操作即可用户发出的地址都是虚拟地址但是操作系统通过将虚拟地址映射到物理地址后用户就可以正常读取和设置物理内存中的数据了对于用户而言操作虚拟内存和物理内存无区别。 段页结合的关键在于用户能够看到的虚拟内存中段是连续存放在内存中而实际的物理内存依然采用分页管理所以对应各个程序段依然会被打散存储到各个物理页中这个过程对用户无感。 虚拟地址到物理地址的转换过程 引入段页结合内存管理后用户程序发出的虚拟地址重定向到物理地址的过程也发生了很大变化: 首先用户发出的虚拟地址由段号段内偏移组成通过查询段表获得段基址拼接段内偏移得到虚拟地址虚拟地址经过MMU计算得到虚拟页号然后查询对应的页表得到真实的物理页号通过真实的物理页号页内偏移得到最终物理地址 具体通过MMU完成虚拟地址到物理地址转换过程可以参考本文 段页式管理下程序如何载入内存 首先在虚拟内存中通过分区适配算法找到一块空闲分区来存放程序中的段这里实际是在对应的段表中新增一条表项记录当前段在虚拟内存中的段基址和段限长等信息。将虚拟内存中分配的段空间打散按照对应的分页机制映射到若干物理页上由对应的页表保存虚页号到物理页号的映射关系。配合磁盘读写将程序分段读入到对应的物理页上。 当用户需要访存时首先通过段号查询段表得到段基址 然后拼接段内偏移地址得到虚拟地址再通过对应的分页机制解析出虚拟地址对应到页表中哪一个表项然后得到对应的物理页号通过物理页号就可以轻松计算出物理页号的基址加上页内偏移地址最终计算出实际的物理地址。 页面置换 地址映射过程中如果访问页表访问对应的页面不在内存或者还未建立映射关系则会发生缺页中断。 当发生缺页中断时如果当前内存中没有空闲页面操作系统就必须在内存中选择一个页面移出内存以便为即将调入的页面让出空间。 具体选择淘汰哪一个页的规则叫做页面置换算法常见的有: 先进先出(FIFO)最近最久未使用(LRU)Clock算法LRU的近似实现 操作系统内存换出—15 包括还需要限制每个进程所能分配到的页面数即当前进程的工作集每次要置换页面时只会在当前进程的工作集中选择并进行淘汰。 总结 谈谈内存分段管理和分页管理的联系 我们编写的程序编译后都是分段的因此程序载入内存的过程也应该是分段载入但是分段对内存进行管理会产生大量内存碎片并且内存紧缩的过程也非常耗时。 所以采用分页管理后内存空间利用率会提供不会产生外部碎片只会有少量页内碎片。 但是分页管理的缺点在于不方便按照模块实现信息的共享和保护而采用分段的方式则非常容易实现。 所以最终的一个解决方案是程序按段载入内存然后被打散存储到各个物理页上通过页表完成虚拟页号到物理页号的映射关系。 聊聊多级页表的作用吧 在Linux 0.11环境下每个物理页大小为4k那么在32位系统环境下其发出的32位虚拟地址最多可以定位到1M的页数。那么就意味着我们的页表需要连续存放1M个页表项页表会占据很多内存。 引入多级页表可以解决页表占据内存过大的问题通过引入页目录层我们的进程只需要加载那些使用到的页目录项指向的页表到内存即可其他页目录项指向的页表则无需载入内存从而可以大大减少页表占据的内存。 并且也只需要将页目录缓存在内存中其中的页目录项指向的页表也可以得到第一次使用到时才申请内存进行创建。 tlb有什么作用呢 多级页表可以减少页表占据内存过大的问题但是也导致一次访存请求会额外多出n次多级页表查询请求为了解决这个问题就引入了缓存来弥补多级页表在时间上不足。 tlb作为CPU内部的相联存储寄存器用来缓存最近访问过的虚拟页号和物理页号的映射关系利用的是程序执行的局部性原理可以有很高的命中率。 什么是虚拟内存为什么需要虚拟内存虚拟内存有什么好处? 什么是虚拟内存: 虚拟内存为每个进程提供了一个一致性连续的私有的地址空间它让每个进程产生了一种自己在独享主存的错觉。 为什么需要虚拟内存: 为了给用户呈现出一个按段加载并且各个段在内存中连续存放的内存视图,方便用户编写程序。 虚拟内存好处: 给用户呈现一个连续的一致性内存视图使程序编写难度降低。把内存范围扩展到了硬盘: 加载程序时可以只加载需要使用到的段,并且程序运行过程中也可以将不常访问的段换出到磁盘存储。有的操作系统还可以在内存不足的情况下将某一进程内存全部放入硬盘空间中并在切换到进程时再从硬盘读取。对于共享库的实现非常方便只需要将不同进程对应的虚拟地址空间中划分出一块地址空间映射到同一个物理内存区域即可。 推荐阅读 CSAPP,操作系统导论哈工大操作系统课程 虚拟内存的那点事儿
http://www.yingshimen.cn/news/828/

相关文章:

  • 口碑好门户网站开发网站建设修饰商品
  • 怎么做网站文字优化美篇制作app下载安装免费
  • 扬州 网站建设wordpress视频主题推荐
  • 海安网站优化做网站充值系统
  • 如果做网站运营电商网站建设考试
  • 网站统计查询宝德科技专业嘉兴网站建设
  • 外贸自助建站哪个好商城网站都有什么功能
  • 网站制作建设兴田德电子元器件网站建设
  • 北京网站建设好不好天怎么在百度上创建网站
  • 从化网站开发wordpress怎么换log
  • 做视频网站盈利模式电子工厂网站建设
  • 怎么提高网站的流量外贸企业邮箱哪个好用
  • 梧州网站建设流程有链接的网站
  • 域名备案时网站名称行业关键词查询
  • 网站运营费用预算网商网官网
  • 如何做设计网站页面设计应用frontpage制作教学网站
  • 建设银行etc的网站是哪个好织梦网站去除技术支持
  • 东网站建设vue.js做个人网站
  • 饰品交易网站怎么做温州市建设安监局网站
  • 公司做网站好优惠建设网站
  • 怎么给公司注册网站济南网络推广公司电话
  • 网站中的知识 视频从哪里来的做的比较简约的网站
  • 最好的网站建设系统石家庄免费自助建站模板
  • 公司网站制作有哪些南宁网站建设找建站通
  • 常州市中大建设工程有限公司网站贵阳网站建设报价
  • 金华网站开发建设建设网站应该加什么服务
  • 什么网站动物和人做的做淘客网站需要多大空间
  • 住房城乡建设部网站主页chrome wordpress
  • 西安建设网站公司哪家好网站建设主要包括哪些
  • 养老网站建设 中企动力旅游网站建设报价方案