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

网站框架建设网络广告效果评估

网站框架建设,网络广告效果评估,建筑工程有限公司招聘信息,自己做个网站需要什么内存分段 程序是由若干个逻辑分段组成的#xff0c;比如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的#xff0c;所以就用分段的形式把这些分段分离出来。 分段机制下#xff0c;虚拟地址和物理地址是如何映射的#xff1f; 分段机制下的虚拟地址由…内存分段 程序是由若干个逻辑分段组成的比如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的所以就用分段的形式把这些分段分离出来。 分段机制下虚拟地址和物理地址是如何映射的 分段机制下的虚拟地址由两部分组成段选择因子和段内偏移量 段选择因子保存在段寄存器里面。段选择因子里面最重要的是段号用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。 虚拟地址中的段内偏移量应该位于 0 和段界限之间如果段内偏移量是合法的就将段基地址加上段内偏移量得到物理内存地址。 上图中展示了虚拟地址与物理地址通过段表映射关系分段机制会把程序的虚拟地址分成 4 个段每个段在段表中有一个项在这一项找到段的基地址再加上偏移量于是就能找到物理内存中的地址如下图 如果要访问段3中偏移量为 500 的虚拟地址我们可以计算出物理地址为7000(段3基地址) 500(偏移量) 7500。 分段的方法很好解决了程序本身不需要关心具体的物理内存地址的问题但是也有一些不足之处 内存碎片问题内存交换的效率低 分段产生的内存碎片问题 假设有 1 G的物理内存用户执行了多个程序其中 游戏占用了 512MB 内存浏览器占用了 128MB 内存音乐占用了 256 MB 内存 这个时候如果我们关闭了浏览器空闲内存还有1024-512-256 256MB。 如果这个256MB不是连续的被分成了两段128MB内存这就会导致没有空间再打开一个200MB的程序。 内存分段会出现内存碎片吗 内存碎片主要分为内部内存碎片和外部内存碎片 内存分段管理可以做到段根据实际需求分配内存所以有多少需求就分配多大的段所以就不会出现内部内存碎片。 但是由于每个段的长度不固定所以多个段未必能恰好使用所有的内存空间会产生多个不连续的小物理内存导致新的程序无法被装载所以会出现外部内存碎片的问题。 解决[外部内存碎片]的问题就是内存交换。 可以把音乐程序占用的那256MB内存写到硬盘上然后再从硬盘上读回内存里。不过再读回时不能装载到原来的位置而是紧紧地跟在已经被占用的512MB内存后面。这样就能空缺出连续的256MB内存空间于是新的200MB程序就可以装载进来。 这个内存交换空间在Linux系统里也就是常看到的Swap空间这块空间是从硬盘划分出来的用于内存与硬盘的空间交换。 分段导致的内存交换效率低的问题 对于多进程的系统来说用分段这个方式外部内存碎片是很容易产生的产生了外部内存碎片那不得不重新 Swap 内存区域这个过程会产生性能瓶颈。 因为硬盘的访问速度比内存慢太多了每一次内存交换都需要把一大段连续的内存数据写到硬盘上。 所以如果内存交换的时候交换的是一个占用内存空间很大的程序这样整个机器就会显得卡顿。 为了解决内存分段的[外部内存碎片和内存交换效率低]的问题就出现了内存分页。 内存分页 分段的好处是能产生连续的内存空间但是会出现 [外部内存碎片和内存交换·的空间太大] 的问题。 要解决这些问题那么就要想出能少一些内存碎片的办法。另外当需要进行内存交换的时候让需要写入或者从磁盘装载的数据更少一点这样就解决问题了。这个办法也就是内存分页 分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间我们叫页。在Linux下每一页的大小为 4KB 。 虚拟地址与物理地址之间通过页表来映射如图 页表是存储在内存里的内存管理单元(MMU)就做将虚拟内存地址转换成物理地址的工作。 当进程访问的虚拟地址在页表中查不到时系统会产生一个缺页异常进入系统内核空间分配物理内存更新进程页表最后再返回用户空间恢复进程的运行。 分页如何解决[外部内存碎片和内存交换效率低]的问题 内存分页是由于内存空间都是预先划分好的也就不会像内存分段那样在段与段之间产生间隙非常小的内存这正是分段会产生外部内存碎片的原因。而采用了分页页与页之间是紧密排列的所以不会有外部碎片。 但是因为内存分页机制分配内存的最小单位是一页即使不足一页大小我们最少只能分配一页所以页内会出现内存浪费所以针对内存分页机制会有内部内存碎片的现象 如果内存空间不够操作系统会把其他正在运行的进程中的[最近没被使用]的内存页面给释放掉也就是暂时写在硬盘上称为换出wap out。一旦需要的时候再加载进来称为换入swap in。所以一次性写入磁盘的也只有少数的一个页或者几个页不会花太多时间内存交换的效率就相对比较高。 更进一步地分页的方式使得我们在加载程序的时候不再需要一次性把程序都加载到物理内存中。我们完全可以在进行虚拟内存和物理内存的页之间的映射之后并不真的把页加载到物理内存里而是只有在程序运行中需要用到对应虚拟内存页里面的指令和数据时再加载到物理内存里面去。 分页机制下虚拟地址和物理地址是如何映射的 在分页机制下虚拟地址分为两部分页号和页内偏移。页号作为页表的索引页表包含物理页每页所在物理内存的基地址这个地址与页内偏移的组合就形成了物理内存地址如下图 总结:对于一个内存地址转换其实就是这样三个步骤 把虚拟内存地址切分成页号和偏移量根据页号从页表里面查询对应的物理号直接拿物理页号加上前面的偏移量就得到了物理内存地址。 但放到实际的操作系统重这样简单的分页肯定是有问题的。 简单分页的缺陷 有空间上的缺陷。 因为操作系统是可以同时运行非常多的进程的这就意味着页表会非常庞大。 在32位的环境下虚拟地址空间有 4 GB 假设一个页的大小是 4KB那么就需要大约100万个页每个[页表项]需要四个字节大小来存储那么整个4GB空间的映射就需要有4MB的内存来存储页表。 这4MB大小的页表看起来不是很大但是要知道每个进程都是有自己的虚拟地址空间的也就是说都有自己的页表。那么 100 个进程的话就需要 400MB 的内存来存储页表这已经是非常大的内存了更别说64位系统了。 多级页表 要解决上面的问题就需要采用一种叫做多级页表的解决方案。可以理解为将单级页表进行分组下面例子中是每1024个单级页分为一组如果某一组页表项没被用到就不需要创建该组的二级页表节省了页表的总空间 在前面我们知道了对于单页表的实现方式在32位和页大小为4KB的环境下一个进程的页表需要装下100多万个[页表项]并且每个页表项是占用 4 字节大小的于是相当于每个页表需占用 4MB 大小的空间。 我们把这个100多万个[页表项]的单级页表再分页将页表(一级页表)分为 1024 个页(二级页表)每个表(二级页表)中包含1024个[页表项]形成二级分页 分了二级表映射4GB地址空间就需要4KB一级页表4MB二级页表的内存这样占用空间不是更大了吗 如果4GB的虚拟地址都映射到了物理内存上的话二级分页占用空间确实更大了但是我们往往不会为一个进程分配那么多的内存。 每个进程都有4GB的虚拟地址空间而显然对于大多数程序来说其使用的空间远达不到4GB因为会存在部分对应的页表项都是空的根本没有分配对于已分配的页表项如果存在最近一定时间未访问的页表在物理内存紧张的情况下操作系统会将页面换出到硬盘也就是说不会占用物理内存。 如果使用了二级分页一级页表就可以覆盖整个 4GB 虚拟地址空间但如果某个一级页表的页表项没有被用到也就不需要创建这个页表对应的二级页表了即可以在需要时才创建二级页表。做个简单计算假设只有20%的一级1页表项被用到了那么页表占用的内存空间就只有4KB(一级页表) 20%*4MB(二级页表) 0.804MB这对比单级页表的 4MB 节省了大量的空间。 为什么不分级的页表就做不到这样节约内存呢 我们从页表的性质来看保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址。假如虚拟地址在页表中找不到对应的页表项计算机系统就不能工作了。所以页表一定要覆盖全部的虚拟地址空间不分级的页表就需要有100多万个页表项来映射而二级分页则只需要1024个页表项此时一级页表覆盖了全部的虚拟地址空间二级页表在需要时创建 对于64位的系统两级分页肯定不够就变成了四级目录分别是 全局页目录项 PGD上层页目录项 PUD中间页目录项 PMD页表项 PTE TLB 多级页表虽然解决了空间上的问题但是虚拟地址到物理地址的先转换就多了几道转换的工序显然就降低了这两地址的转换速度也就是带来了时间上的开销。 程序是有局部性的即在一段时间内整个程序的执行仅限于程序中的某一部分。相应地执行所访问的存储空间也局限于某个内存区域。 我们就可以利用这一特性把最常访问的几个页表存储到访问速度更快的硬件于是在CPU芯片中加入了一个专门存放程序最常访问页表项 的 cache这个cache就是TLB 通常成为页表缓存、转址旁路缓存、快表等。 在CPU芯片里面封装了内存管理单元(MMU)芯片它用来完成地址转换和TLB的访问和交互 有了TLB后CPU寻址时会先查TLB如果没找到才会继续查常规的页表。 TLB的命中率其实是很高的因为程序最常访问的页就那么几个。 段页式内存管理 内存分段和内存分页并不是对立的它们是可以组合起来再同一个系统中使用的那么组合起来后通常成为段页式内存管理。 段页式内存管理实现方式 先将程序划分为多个有逻辑意义的段也就是前面提到的分段机制接着再把每个段划分为多个页也就是对分段划分出来的连续空间再划分固定大小的页 这样地址结构就由 段号、段内页号和页内位移 三部分组成。 用于段页式地址变换的数据结构是每个程序一张段表每个段又建立一张页表段表中的地址是页表的起始地址而页表中的地址为某页的物理页号如图 段页式地址变换中要得到物理地址须经过三次内存访问 第一次访问段表得到页表起始地址第二次访问页表得到物理页号第三次将物理页号与页内位移组合得到物理地址。 可用软、硬件相结合的方法实现段页式地址的变换这样虽然增加了硬件成本和系统开销但提高了内存的利用率。 Linux内存布局 intel处理器额的发展历史   早期的intel的处理器从80286开始使用的是段式内存管理。但是很快发现光有段式内存管理而没有页式内存管理是不够的这会使X86系列失去市场的竞争力。因此在不久以后得80386中就实现了页式内存管理。也就是说80386除了完成并完善从80286开始的段式内存管理的同时还实现了页式内存管理。    但是这个80386的页式内存管理设计时没有绕开段式内存管理而是建立在段式内存管理的基础上这就意味着页式内存管理的作用是在由段式内存管理所映射而成的地址上再加上一层地址映射。 此时由段式内存管理映射而成的地址不再是 物理地址 了Intel就称之为 线性地址 也称为虚拟地址于是段式内存管理先将逻辑地址映射成线性地址然后再由分页内存管理将线性地址映射成物理地址。 程序所使用的地址通常是没被段式内存管理映射的地址称为逻辑地址通过段式内存管理映射的地址称为线性地址或者虚拟地址 Linux内存主要采用的是页式内存管理但同时也不可避免地涉及了段机制。 这主要是上面Intel处理器发展历史导致的因为Intel X86CPU一律对程序中使用的地址先进行段式映射然后才能进行页式映射。 但事实上Linux内核所采取的办法是使段式映射的过程实际上不起什么作用。 Linux系统中的每个段都从0地址开始的整个 4GB 虚拟空间32位环境下也就是所有的段的起始地址都是一样的。这意味着Linux系统中的代码包括操作系统本身的代码和应用程序代码所面对的地址空间都是线性地址空间虚拟地址这种做法相当于屏蔽了处理器中逻辑地址的概念段只被用于访问控制盒内存保护。 Linux的虚拟地址空间如何分布 在Linux操作系统中虚拟地址空间的内部又被分为内核空间和用户空间两部分不同位数的系统地址空间的范围也不同。比如常见的32位和64位系统如下图所示 这里可以看出 32 位系统的内核空间占 1G 位于最高处剩下的 3G 是用户空间64 位系统的内核空间和用户空间都是128T分别占据整个内存空间的最高和最低处剩下的中间部分是未定义的。 内核空间和用户间的区别 进程在用户态时只能访问用户空间内存只有在进入内核态的时候才能访问内核空间的内存 虽然每个程序都有自己独立的虚拟地址但是每个虚拟内存中的内核地址其实关联的都是相同的物理内存这样进程在切换到内核态后就可以很方便地访问内核空间内存。 进一步了解虚拟空间的划分情况用户空间和内核空间划分的方式是不同的。 以32位操作系统为例用户空间分布的情况如图所示 通过这张图可以看到用户空间内存从低到高分别是6种不同的内存段 代码段包括二进制可执行代码数据段包括已初始化的静态常量和全局变量BSS段包括未初始化的静态变量和全局变量堆段包括动态分配的内存从低地址开始向上增长文件映射段包括动态库、共享内存等从低地址开始向上增长栈段包括局部变量和函数调用的上下文等。栈的大小是固定的一般是 8MB。当然系统也提供了参数以便我们自定义大小 上图中的内存布局可以看到代码段下面还有一段内存空间(灰色部分)这一块区域是[保留区]之所以要有保留区是因为在大多数系统里我们认为比较小数值的地址不是一个合法地址。例如我们通常在C的代码里会将无效的指针赋值位NULL。因此这里会出现一段不可访问的内存保留区防止程序因为出现BUG导致读或写了一些小内存地址的数据。 总结 为了在多进程的环境下使得进程之间的内存地址不受影响相互隔离于是操作系统就为每个进程单独分配一套虚拟内存地址每个程序只关心自己的虚拟地址就可以实际上大家的虚拟地址都是一样的但分布到的物理内存地址是不一样的。 每个进程都有自己的虚拟空间而物理内存只有一个所以当启用了大量的进程物理内存必然会很紧张于是操作系统会通过内存交换技术把不常使用的内存暂时存放到硬盘(换出)在需要的时候再装载回物理内存(换入)。 既然有了虚拟内存地址那必然要把虚拟地址[映射]到物理地址这个过程通常由操作系统维护。 那么对于虚拟地址和物理地址的映射关系可以有分页和分段的方式同时结合两者[段页式]也可以。 内存分段是根据程序的逻辑角度分成了栈段、堆段、数据段、代码段等这样可以分离出不同属性的段同时是一块连续的空间。但是每个段的大小都不是统一的这就会导致外部内存碎片和内存交换效率低的问题。 于是就出现了内存分页把虚拟空间和物理空间分成大小固定的页如在 Linux 系统中每一页的大小为 4KB。由于分了页后就不会产生细小的内存碎片解决了内存分段的外部内存碎片问题。同时在内存交换的时候写入硬盘也就一个页或几个页这就大大提高了内存交换的效率。 为了解决简单分页产生的页表过大的问题就有了多级页表它解决了空间上的问题但这就会导致 CPU 在寻址的过程中需要有很多层表参与加大了时间上的开销。于是根据程序的局部性原理在 CPU 芯片中加入了 TLB负责缓存最近常被访问的页表项大大提高了地址的转换速度。 Linux 系统主要采用了分页管理但是由于 Intel 处理器的发展史Linux 系统无法避免分段管理。于是 Linux 就把所有段的基地址设为 0也就意味着所有程序的地址空间都是线性地址空间虚拟地址相当于屏蔽了 CPU 逻辑地址的概念所以段只被用于访问控制和内存保护。 另外Linux 系统中虚拟空间分布可分为用户态和内核态两部分其中用户态的分布代码段、全局变量、BSS、函数栈、堆内存、映射区。
http://www.ho-use.cn/article/10817331.html

相关文章:

  • wordpress 列表 分类厦门网站seo
  • 柳州做网站价格莱芜住房和城乡建设厅网站
  • 做网站有免费的服务器吗物联网今天正式开网
  • 织梦网站被做跳转大石桥做网站
  • 点开图片跳到网站怎么做的企业网络营销推广方案策划
  • 无极任务平台网站进入中企动力网站开发
  • 上海建设银行青浦分行网站甘肃建设网站首页
  • 入门做外贸是先建网站还是先参展软件外包学院
  • 网站登录页面购物网站策划案
  • 温州网站开发流程网站官网认证怎么做的
  • 工厂网站建设公司有什么有用的网站
  • 站长 网站对比网站开发答辩
  • 网站开发asp怎样做运营一个网站
  • 医疗网站建设及优化wordpress app 登录注册
  • 如何做企业网站建设wordpress好用的插件推荐
  • 老网站删除做新站会影响收录吗广州建站费用
  • 想做个外贸网站免备案虚拟空间
  • 美乐乐网站首页如何修改做网站的空间和服务器
  • 电商网站服务排名武宁县建设工程招标公告门户网站
  • 网站密码忘记了怎么办做网站汉狮网络
  • 网站关键词提升市场调研公司和咨询公司
  • 洛阳制作网站哪家好绵竹seo
  • 当牛做吗网站源代码分享做视频找空镜头那个网站比较全
  • 网站怎么收费动画设计招聘信息
  • 网站建设销售渠道全球门户中企动力
  • 缠绕机东莞网站建设技术支持淘宝运营工作内容
  • 网站优化升级网站开发必看书籍
  • wordpress建站多个域名北京网站建设手机号
  • 网站模板修改器微信公众号怎么创建要多少钱
  • 360元网站建设 网络服务wordpress能注册