首页 > 系统相关 >内存总结

内存总结

时间:2022-10-26 21:31:57浏览次数:48  
标签:总结 虚拟地址 物理地址 内存 Linux 进程 页表

为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。

每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。

那既然有了虚拟地址空间,那必然要把虚拟地址「映射」到物理地址,这个事情通常由操作系统来维护。

那么对于虚拟地址与物理地址的映射关系,可以有分段分页的方式,同时两者结合都是可以的。

内存分段是根据程序的逻辑角度,分成了栈段、堆段、数据段、代码段等,这样可以分离出不同属性的段,同时是一块连续的空间。但是每个段的大小都不是统一的,这就会导致外部内存碎片和内存交换效率低的问题。

于是,就出现了内存分页,把虚拟空间和物理空间分成大小固定的页,如在 Linux 系统中,每一页的大小为 ​​4KB​​。由于分了页后,就不会产生细小的内存碎片,解决了内存分段的外部内存碎片问题。同时在内存交换的时候,写入硬盘也就一个页或几个页,这就大大提高了内存交换的效率。

再来,为了解决简单分页产生的页表过大的问题,就有了多级页表,它解决了空间上的问题,但这就会导致 CPU 在寻址的过程中,需要有很多层表参与,加大了时间上的开销。于是根据程序的局部性原理,在 CPU 芯片中加入了 TLB,负责缓存最近常被访问的页表项,大大提高了地址的转换速度。

Linux 系统主要采用了分页管理,但是由于 Intel 处理器的发展史,Linux 系统无法避免分段管理。于是 Linux 就把所有段的基地址设为 ​​0​​,也就意味着所有程序的地址空间都是线性地址空间(虚拟地址),相当于屏蔽了 CPU 逻辑地址的概念,所以段只被用于访问控制和内存保护。

另外,Linux 系统中虚拟空间分布可分为用户态内核态两部分,其中用户态的分布:代码段、全局变量、BSS、函数栈、堆内存、映射区。

最后,说下虚拟内存有什么作用?

  • 第一,虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。
  • 第二,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。
  • 第三,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。

标签:总结,虚拟地址,物理地址,内存,Linux,进程,页表
From: https://blog.51cto.com/u_10630401/5798589

相关文章

  • 内存满了,会发生什么?
    1、内存分配的过程是怎样的?应用程序通过malloc函数(全称是memoryallocation,中文叫动态内存分配)申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。当应用程序......
  • 10月26日内容总结——第三方模块下载与requests、openpyxl模块
    目录一、第三方模块的下载与使用下载第三方模块的方式一:pip工具部分错误解决案例:下载第三方模块的方式二:pycharm中下载pip仓库地址二、网络爬虫模块之requests模块1、get()......
  • 计算中文在内存占用的字节数
    #include<iostream>usingnamespacestd;voidmain(){ //功能:计算中文在内存占用的字节数 charname[]="成都"; charnode_name[]="成都移动04节点"; co......
  • 做微服务研发工程师的一年来的总结
    前述18年的那个留校夏天,极其偶然接触到了《Docker+Kubernetes》,由纯运维的发展方向转到了云原生运维的发展方向。19年5月以《linuxhelmsmanplatform》获得IT创新大赛二......
  • 2022-2023-1 20221424《计算机基础与程序设计》第9周学习总结
    2022-2023-120221424《计算机基础与程序设计》第9周学习总结作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1......
  • 什么是测试架构师(经验总结)
    什么是测试架构师(经验总结)最近一直在招测试架构师最近一直在招测试架构师,在这段时间,对测试架构师这个工作职责以及技术要求,都有一些新的认识,同时也回顾总结了自己对测试......
  • 11-html常用标签与界面交互总结
    HTML常用标签与界面交互总结.md表格标签tablecaptiontheadthtbodytrtdtfoot<!DOCTYPEhtml><html><table><caption>表格的标题</caption><!--表头-->......
  • chap 5函数与递归 总结
    chap5函数与递归 学习总结一、函数的类型函数分为库函数和自定义函数。库函数是在编程过程中可以直接使用的函数。例如:而自义定函数则是由我们自己定义其功能并调用......
  • 2B面向对象的业务的一些总结经验(持续更新)
    面向对象表结构设计之关联场景主对象:设备属性:设备类型设备等级两者异同同:都是设备的关联属性异:类型是散列的等级是线性的结论设备类型的配置表完全可以通过id关......
  • Spring @Scheduled问题总结
    1.@Scheduled使用在SpringBoot中要想使用@Scheduled注解,先要在启动类上加上注解@EnableScheduling@Configuration@EnableScheduling publicclassScheduleCo......