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

社区网站制作教程我的世界有什么做的视频网站

社区网站制作教程,我的世界有什么做的视频网站,辽宁网站建设的网络科技公司,网络营销的优势和劣势虚拟内存 单片机的 CPU 是直接操作内存的「物理地址」 在这种情况下#xff0c;要想在内存中同时运行两个程序是不可能的 操作系统是如何解决这个问题呢#xff1f; 关键的问题是这两个程序都引用了绝对物理地址#xff0c;而这正是我们最需要避免的。 可以把进程所使用的… 虚拟内存 单片机的 CPU 是直接操作内存的「物理地址」 在这种情况下要想在内存中同时运行两个程序是不可能的 操作系统是如何解决这个问题呢 关键的问题是这两个程序都引用了绝对物理地址而这正是我们最需要避免的。 可以把进程所使用的地址「隔离」开来即让操作系统为每个进程分配独立的一套「虚拟地址」 人人都有大家自己玩自己的地址就行互不干涉 前提每个进程都不能访问物理地址至于虚拟地址最终怎么落到物理内存里对进程来说是透明的操作系统已经把这些都安排的明明白白了。 操作系统会提供一种机制将不同进程的虚拟地址和不同内存的物理地址映射起来。 如果程序要访问虚拟地址的时候由操作系统转换成不同的物理地址这样不同的进程运行的时候写入的是不同的物理地址这样就不会冲突了 我们程序所使用的内存地址叫做虚拟内存地址Virtual Memory Address 实际存在硬件里面的空间地址叫物理内存地址Physical Memory Address。 进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元MMU的映射关系来转换变成物理地址然后再通过物理地址访问内存 操作系统是如何管理虚拟地址与物理地址之间的关系 主要有两种方式分别是内存分段和内存分页 内存分段 程序是由若干个逻辑分段组成的如可由代码分段、数据分段、栈段、堆段组成。 不同的段是有不同的属性的所以就用分段Segmentation的形式把这些段分离出来。 分段机制下虚拟地址和物理地址是如何映射的 虚拟地址由两部分组成段选择因子和段内偏移量。 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。 虚拟地址中的段内偏移量应该位于 0 和段界限之间如果段内偏移量是合法的就将段基地址加上段内偏移量得到物理内存地址。 知道了虚拟地址是通过段表与物理地址进行映射的分段机制会把程序的虚拟地址分成 4 个段每个段在段表中有一个项在这一项找到段的基地址再加上偏移量于是就能找到物理内存中的地址 分段的办法很好解决了程序本身不需要关心具体的物理内存地址的问题但它也有一些不足之处 第一个就是内存碎片的问题。 第二个就是内存交换的效率低的问题。 内存分段会出现内存碎片吗 内部内存碎片和外部内存碎片。 内存分段管理可以做到段根据实际需求分配内存所以有多少需求就分配多大的段所以不会出现内部内存碎片。 但是由于每个段的长度不固定所以多个段未必能恰好使用所有的内存空间会产生了多个不连续的小物理内存导致新的程序无法被装载所以会出现外部内存碎片的问题。 解决「外部内存碎片」的问题就是内存交换。 先写到硬盘上再重新写回内存这样可以把内存的位置集中去掉碎片 分段为什么会导致内存交换效率低的问题 对于多进程的系统来说用分段的方式外部内存碎片是很容易产生的产生了外部内存碎片那不得不重新 Swap 内存区域这个过程会产生性能瓶颈。 因为硬盘的访问速度要比内存慢太多了每一次内存交换我们都需要把一大段连续的内存数据写到硬盘上。 如果内存交换的时候交换的是一个占内存空间很大的程序这样整个机器都会显得卡顿。 内存分页 分段的好处就是能产生连续的内存空间但是会出现「外部内存碎片和内存交换的空间太大」的问题。 当需要进行内存交换的时候让需要交换写入或者从磁盘装载的数据更少一点这样就可以解决问题了。这个办法也就是内存分页Paging。 分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。 这样一个连续并且尺寸固定的内存空间我们叫页Page。在 Linux 下每一页的大小为 4KB。 页表是存储在内存里的内存管理单元 MMU就做将虚拟内存地址转换成物理地址的工作。 当进程访问的虚拟地址在页表中查不到时系统会产生一个缺页异常进入系统内核空间分配物理内存、更新进程页表最后再返回用户空间恢复进程的运行。 分页是怎么解决分段的「外部内存碎片和内存交换效率低」的问题 采用了分页页与页之间是紧密排列的所以不会有外部碎片。 内存分页机制会有内部内存碎片 如果内存空间不够操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉也就是暂时写在硬盘上称为换出Swap Out 一旦需要的时候再加载进来称为换入 一次性写入磁盘的也只有少数的一个页或者几个页不会花太多时间内存交换的效率就相对比较高。 只有在程序运行中需要用到对应虚拟内存页里面的指令和数据时再加载到物理内存里面去。 分页机制下虚拟地址和物理地址是如何映射的 在分页机制下虚拟地址分为两部分页号和页内偏移。 页号作为页表的索引页表包含物理页每页所在物理内存的基地址这个基地址与页内偏移的组合就形成了物理内存地址 对于一个内存地址转换其实就是这样三个步骤 把虚拟内存地址切分成页号和偏移量 根据页号从页表里面查询对应的物理页号 直接拿物理页号加上前面的偏移量就得到了物理内存地址。 简单的分页有什么缺陷吗 有空间上的缺陷。 因为操作系统是可以同时运行非常多的进程的那这不就意味着页表会非常的庞大。 多级页表 要解决上面的问题就需要采用一种叫作多级页表Multi-Level Page Table的解决方案。 对于单页表的实现方式在 32 位和页大小 4KB 的环境下一个进程的页表需要装下 100 多万个「页表项」并且每个页表项是占用 4 字节大小的于是相当于每个页表需占用 4MB 大小的空间。 把这个 100 多万个「页表项」的单级页表再分页将页表一级页表分为 1024 个页表二级页表每个表二级页表中包含 1024 个「页表项」形成二级分页。 分了二级表映射 4GB 地址空间就需要 4KB一级页表 4MB二级页表的内存这样占用空间不是更大了吗 我们应该换个角度来看问题还记得计算机组成原理里面无处不在的局部性原理么 如果使用了二级分页一级页表就可以覆盖整个 4GB 虚拟地址空间但如果某个一级页表的页表项没有被用到也就不需要创建这个页表项对应的二级页表了即可以在需要时才创建二级页表 那么为什么不分级的页表就做不到这样节约内存呢 页表一定要覆盖全部虚拟地址空间不分级的页表就需要有 100 多万个页表项来映射而二级分页则只需要 1024 个页表项此时一级页表覆盖到了全部虚拟地址空间二级页表在需要时创建。 对于 64 位的系统两级分页肯定不够了就变成了四级目录分别是 全局页目录项 PGDPage Global Directory 上层页目录项 PUDPage Upper Directory 中间页目录项 PMDPage Middle Directory 页表项 PTEPage Table Entry TLB 多级页表虽然解决了空间上的问题但是虚拟地址到物理地址的转换就多了几道转换的工序这显然就降低了这俩地址转换的速度也就是带来了时间上的开销。 程序是有局部性的 利用这一特性把最常访问的几个页表项存储到访问速度更快的硬件。在 CPU 芯片中加入了一个专门存放程序最常访问的页表项的 Cache这个 Cache 就是 TLBTranslation Lookaside Buffer 通常称为页表缓存、转址旁路缓存、快表等。 在 CPU 芯片里面封装了内存管理单元Memory Management Unit芯片它用来完成地址转换和 TLB 的访问与交互。 有了 TLB 后那么 CPU 在寻址时会先查 TLB如果没找到才会继续查常规的页表。 段页式内存管理 内存分段和内存分页并不是对立的它们是可以组合起来在同一个系统中使用的那么组合起来后通常称为段页式内存管理。 段页式内存管理实现的方式 先将程序划分为多个有逻辑意义的段也就是前面提到的分段机制 接着再把每个段划分为多个页也就是对分段划分出来的连续空间再划分固定大小的页 地址结构就由段号、段内页号和页内位移三部分组成。 用于段页式地址变换的数据结构是每一个程序一张段表每个段又建立一张页表段表中的地址是页表的起始地址而页表中的地址则为某页的物理页号 段页式地址变换中要得到物理地址须经过三次内存访问 第一次访问段表得到页表起始地址 第二次访问页表得到物理页号 第三次将物理页号与页内位移组合得到物理地址。 增加了硬件成本和系统开销但提高了内存的利用率 Linux内存布局 页式内存管理的作用是在由段式内存管理所映射而成的地址上再加上一层地址映射。 逻辑地址和线性地址 程序所使用的地址通常是没被段式内存管理映射的地址称为逻辑地址 通过段式内存管理映射的地址称为线性地址也叫虚拟地址 逻辑地址是「段式内存管理」转换前的地址线性地址则是「页式内存管理」转换前的地址。 Linux 内存主要采用的是页式内存管理但同时也不可避免地涉及了段机制。 Linux 内核所采取的办法是使段式映射的过程实际上不起什么作用 Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间32 位环境下也就是所有的段的起始地址都是一样的。这意味着Linux 系统中的代码包括操作系统本身的代码和应用程序代码所面对的地址空间都是线性地址空间虚拟地址这种做法相当于屏蔽了处理器中的逻辑地址概念段只被用于访问控制和内存保护。 Linux 的虚拟地址空间是如何分布的 虚拟地址空间的内部又被分为内核空间和用户空间两部分 32 位系统的内核空间占用 1G位于最高处剩下的 3G 是用户空间 64 位系统的内核空间和用户空间都是 128T分别占据整个内存空间的最高和最低处剩下的中间部分是未定义的。 内核空间与用户空间的区别 进程在用户态时只能访问用户空间内存 只有进入内核态后才可以访问内核空间的内存 每个虚拟内存中的内核地址其实关联的都是相同的物理内存。这样进程切换到内核态后就可以很方便地访问内核空间内存。 用户空间分布 代码段包括二进制可执行代码 数据段包括已初始化的静态常量和全局变量 BSS 段包括未初始化的静态变量和全局变量 堆段包括动态分配的内存从低地址开始向上增长 文件映射段包括动态库、共享内存等从低地址开始向上增长 栈段包括局部变量和函数调用的上下文等。栈的大小是固定的一般是 8 MB。当然系统也提供了参数以便我们自定义大小
http://www.hkea.cn/news/14480250/

相关文章:

  • 成都行业网站怎么看一个网站是不是外包做的
  • 网站怎么做代码优化python在线编程器
  • 南京网站做的好的公司贵州省住房和城乡建设厅网网站首页
  • 北京网站设计公司新鸿儒山西网站建设费用
  • 西安手机商城网站建设提交网站收录
  • 手机app界面设计网站wordpress主题网址导航葬爱
  • 宁河网站建设品牌网站建设大概费用
  • 网站制作公司兴田德润简介网站订票策划方案
  • html怎么弄成网站wordpress钉钉登陆
  • 伊利集团网站建设怎么样呢wordpress建淘宝客
  • 兰州网站的优化企业微信用途
  • 证券公司网站建设方案互联网项目推广是什么
  • 北京做网站制作公司网站被360拦截怎么办
  • 中山网站建设文化价位成全视频免费高清观看在线电视剧
  • 漯河网站建设e阜阳 做网站
  • 有什么网站可以做代理的loop wordpress
  • 搜狗网站做滤芯怎么样重庆建设工程信息网站
  • 柳州做网站的个人网站导航模版
  • 苏州网站制作网站建设做一个中型网站需要多少钱
  • 贵州网站优化宠物网站模板下载
  • 建设网站网页打不开写一个网站需要什么技术
  • 中国建设银行信用卡官方网站wordpress 高级字段
  • 重庆快速网站推广做英文版网站
  • 曾经做网站网站代理wordpress后端响应慢
  • 做推送的网站有哪些html5 网站开发 适配
  • 福州建设网站linux增加网站
  • 海外社交网站开发百度学术官网入口网页版
  • 怎样在百度上作网站推广iis 二级网站 发布
  • seo建站公司怎么制作微信链接网页
  • gta5线下买房网站建设沈阳 网站开发