蓝盟弱电工程,Linux系统的虚拟内存结果非常好

发布者:上海IT外包 发布时间:2019/3/27 10:44:54来源:www.linemore.com

  毫无疑问,虚拟内存绝对是操作系统中最重要的概念之一。
  CPU速度太快,但容量小,功能独特。其他I/O硬件支持多种复杂功能,但与CPU相比速度太慢。所以他们需要一种润滑剂作为它们之间的缓冲区,这是记忆非常重要的地方。
  在现代操作系统中,多任务处理是标准的。多任务并行性极大地提高了CPU利用率,但会导致内存操作中多个进程之间发生冲突。虚拟内存的概念就是解决这个问题。
  上图是虚拟内存最简单,最直观的解释。
  操作系统是物理内存(中间),有两个进程(实际上更多),P1和P2的一部分,操作系统会告诉偷偷P1和P2分开,我的整个存储器是你的,只是穿够了。事实上,操作系统刚刚为他们画了一块大蛋糕。所有这些记忆都传送到P1和P2,实际上它们只给它们一个序列号。只有当P1和P2真正开始使用这些存储器时,系统才会开始使用滚动和位移,并收集进程的块。 P2认为他们正在使用内存A,实际上系统已将它们重定向到真正的B.即使P1和P2共享C内存,他们也不知道。
  这个操作系统欺骗过程的中间是虚拟内存。对于像P1和P2这样的过程,每个人都认为他们占用了所有的内存,他们使用的物理内存的哪个部分,不知道或不关心。
  分页和页表。
  虚拟内存是操作系统中的一个概念。对于操作系统,虚拟内存是一个比较表。当P1获取存储器A中的数据时,它必须转到物理存储器的地址A,而存储器B中的数据必须转到物理存储器的地址C.
  我们知道系统中的基本单位是字节字节。如果虚拟内存的每个字节对应物理内存的地址,则每个条目至少需要8个字节(32位虚拟地址 - >
  32位物理地址),在4G内存的情况下,你需要32 GB的空间来存储比较表,那么这个表将是一个真正的物理地址太大,所以操作系统引入了页面概念(页)。
  系统启动时,操作系统将所有物理内存分为4K单元。内存分配后,以页面为单位,然后对应物理内存页面映射表对应的虚拟内存页面大大减少,4G内存只需要8M映射表,某些进程不使用虚拟内存,也不需要保存分配,Linux也为大内存设计了多级页表,这可以减少内存消耗。从操作系统的虚拟内存到物理内存的映射表称为页表。内存寻址和分配
  我们知道,通过虚拟内存的机制,每个进程都认为它占用了所有的内存。当进程访问内存时,操作系统将进程提供的虚拟内存地址转换为物理地址,然后获取相应物理地址中的数据。 CPU中有一种硬件,内存管理单元MMU(内存管理单元)特别用于转换虚拟内存地址。 CPU还建立用于寻址页表的缓存策略。由于程序的位置,其缓存命中率可达到98%。
  先前的情况是将虚拟地址分配给页表中的物理地址。如果未分配进程访问的物理地址,系统将生成页面失败中断。处理中断时,系统会将内核状态切换为进程的虚拟地址。分配物理地址。
  功能
  虚拟内存不仅通过内存地址的转换解决了进程多次访问冲突的问题,而且还提供了更多的好处。
  进程内存管理。
  它有助于内存管理过程,主要表现在:
  内存的完整性:由于进程中虚拟内存的“模拟”,每个进程都认为它获取的内存是一个相邻的地址。当我们编写应用程序时,我们不必考虑大地址的分配。我们一直认为系统有足够大的内存。
  安全性:因为进程访问内存,所以必须通过页表进行定向。操作系统向页表的每个元素添加若干访问权限标识符,以实现内存权限控制。
  交换数据
  使用虚拟内存可以更轻松地进行内存和数据交换。
  当进程加载系统库时,它总是首先分配一块内存并将库文件加载到磁盘。直接使用物理内存时,即使系统发现将相同的库加载到系统中,物理内存的地址也是唯一的。两次,但每个进程指定的加载内存不同,系统无法做任何事情。
  使用虚拟内存时,系统只需要将进程的虚拟内存地址指向库文件所在的物理内存的地址。如上图所示,进程P1和P2的B地址指向物理地址C.
  通过虚拟内存使用共享内存也非常简单。系统只需要将每个进程的虚拟内存地址指向系统分配的共享内存的地址。
  SWAP
  虚拟内存允许进程“扩展”内存。
  前面我们提到虚拟内存通过页面故障中断为进程分配物理内存。记忆总是有限的。如果所有物理内存都被占用会发生什么?
  Linux提出了SWAP的概念。 Linux可以使用SWAP分区。在分配物理内存但可用内存不足时,首先将暂时未使用的内存中的数据放在磁盘上,以便首先使用所需的进程,然后进程应该使用它们。加载数据后,它将加载到内存中。通过这种“交换”技术,Linux允许进程使用更多内存。常见问题
  当我理解虚拟内存时,我也遇到了很多问题。
  32位和64位
  最常见的是32位和64位问题。
  CPU通过物理总线访问存储器,然后访问地址的范围受到机器中总线数量的限制。在32位机器中,有32个总线,每个总线具有高电位和低电位,分别代表该位的1和0。可以访问的最大地址是2 ^ 32bit=4GB,因此在32位机器中插入超过4G的内存无效,并且CPU无法访问超过4G的内存。
  但是64位计算机没有64位总线,并且它们的最大内存受操作系统的限制。 Linux目前最多支持256 G的内存。
  根据虚拟内存的概念,在32位系统中执行64位软件也是必不可少的,但由于虚拟内存地址系统的结构设计,64位虚拟地址不能用于32位系统。
  直接操纵物理内存。
  操作系统使用虚拟内存。我们想直接用内存做什么?
  Linux将每个设备分配到/dev /目录中的文件,我们可以直接从这些设备文件中操作硬件,内存也不例外。在Linux中,内存配置分配给/dev/mem,root用户可以通过读取和写入此文件来直接操作内存。
  JVM进程占用了太多的虚拟内存
  当使用TOP来查看系统的性能时,我们会发现在VIRT列中,Java进程占用了大量的虚拟内存。
  导致此问题的原因是Java使用Glibc的Arena内存池来分配大量虚拟内存,而不使用它。此外,Java读取的文件也分配给虚拟内存。在虚拟机的默认配置中,每个Java线程堆栈占用1M的虚拟内存。具体来说,您可以看到多线程程序在Linux中消耗虚拟内存的原因。
  实际占用的物理内存取决于RES(常驻)列,此列的值是实际分配给物理内存的大小。
  常用管理命令
  我们也可以自己管理Linux虚拟内存。
  查看系统内存的状态
  有很多方法可以查看系统的内存。 Free,vmstat和其他命令可以生成系统内存的当前状态。必须考虑到可用内存不仅是空闲列。由于操作系统的惰性功能,在此过程中有许多缓冲区/缓存。一旦它们不再使用,它们将不会立即清洁。如果使用它们的进程再次运行,则可以继续使用它们。如有必要,也可以使用它们。另外,cat/proc/meminfo可用于查看系统内存使用的详细信息,包括脏页面的状态。有关详细信息,请参阅拼图/PROC/MEMINFO。
  PMAP
  如果要分别查看进程虚拟内存的分布,可以使用pmap pid命令,该命令列出从低地址到高地址的虚拟内存段。
  您可以添加-XX参数以生成更详细的信息。
  修改内存配置。
  我们还可以修改Linux系统的配置,通过sysctl VM [-options] CONFIG或者直接在/proc/sys目录/VM读取和写入文件/查看和修改设置。
  SWAP操作
  虚拟内存的SWAP功能并不总是有益的。允许进程在内存和磁盘之间不断交换数据将大大消耗CPU并降低系统效率,因此有时我们不想使用交换机。
  我们可以修改vm.swappiness=0来配置内存以尽可能少地使用swap,或者只使用swapoff命令来禁用SWAP。

 

上海IT外包服务网 链接:http://www.linemore.com

>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部