`
csd_ali
  • 浏览: 136074 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

linux内存模型

阅读更多

0. 内存基本知识

        我们通常称 linux的内存子系统为:虚拟内存子系统(virtual memory system),为何这样称谓呢?

        其实这个是个很牛的设计。linux充分利用了程序的局部性原理,结合线性地址的概念(虚拟地址)使得运行于操作系统上的每个进程都可以使用所有用户空间主存。而且虚拟内存还解决了内存不连续和碎片的问题(因为在程序来说线性地址都是连续的);每个进程都有各自的页表,虚拟地址空间都各自独立,互补干扰;

        那么我们的程序里申请的内存的时候,linux内核其实只分配一个虚拟内存( 线性地址),并没有分配实际的物理内存。只有当程序真正使用这块内存时,才会分配物理内存。这就叫做延迟分配和请页机制。释放内存时,先释放线性区对应的物理内存,然后释放线性区;

        什么时候内核为进程划分物理内存的呢? 当进程执行时,申请的内存只是一块虚拟内存区域,而不是实际的物理内存,只是获得了一块虚拟内存区域上线性地址区间的使用权。实际的物理内存只有当进程真的去访问新获得的虚拟地址时,才会由"请页机制"产生"缺页"异常,从而进入分配实际页框的例程。此异常会告诉内核去真正为进程分配物理页,并建立对应的页表。这之后虚拟地址才实实在在的映射到了物理内存上了。"请页机制"将物理内存的分配延后了,这样是充分利用了程序的局部性原来,节约内存空间,提高系统吞吐;

        那么cpu执行指令访存,使用的都是物理内存地址,而我们的编译器生成的二进制码实际上分配的都是逻辑内存(逻辑地址);那么线性地址是如何转换为物理内存地址的呢?我们知道内存模型里有,段,页机制来寻址内存的;(物理内存也是划分为页为单位划分的) ;我们的程序主要分为数据段,代码段;数据段存放代码里已初始化数据,代码段存放可执行代码指令;linux通过段机制将我们程序的逻辑地址转换为线性地址,又通过页机制将线性地址转换为物理地址。

 

1. 内存布局

     我们编写的程序是如何在内存中布局的呢?

     我们知道Linux内核启动起来时,如果是4G内存,那么会有大约1G被内核占用。其他3G会被用户进行使用。我们稍后会讲解内核内存如何和用户内存通信。

     一个进程对应的内存空间包含一下5个区:

     代码段:存放可执行文件的操作指令;

     数据段:存放可执行文件申请已经初始化的全局变量;

     BSS段:  存放未初始化的全局变量;

     堆:      存放用户程序运行中,动态申请的内存空间;

     栈:      存放用户程序运行中,临时创建的局部变量;我们知道CPU有寄存器是直接可以访问栈的,所以栈比堆快多了。

 

    那么既然每个进程都有各自的虚拟内存空间,各自互不相干,那么进程间如何共享内存,内核又是如何向进程空间传递数据?  都是通过映射实现的,通过将内核的虚拟内存映射到当前进程用户空间的虚拟内存,当然映射时,要新建一个页表;  

2. 虚拟内存管理

    简单的说linux的虚拟内存管理技术:让每个进程看上去可以使用整个用户空间主存。通过 线性地址加上swap机制; swap机制:如果一个正在被cpu执行的进程恰巧和另外一个进程的线性地址指向了同一块物理内存。那么Linux通过swap机制,将这块内存写到磁盘上,叫做唤出。被唤出的数据,在使用时,又被换入;

    linux还通过cache+buffer机制: 将最近使用过的数据尽量cache,buffer起来,以便稍后会使用到;这就是说我们的可用内存=free + buffer + cache;

 

 

  • 大小: 948 Bytes
  • 大小: 969 Bytes
分享到:
评论
2 楼 ljl_ss 2011-09-21  
gogole_09 写道
实际的物理内存只有当进程真的去访问新获得的虚拟地址时,才会由"请页机制"产生"缺页"异常,从而进入分配实际页框的例程。此异常会告诉内核去真正为进程分配物理页,并建立对应的页表。这之后虚拟地址才实实在在的映射到了物理内存上了。"请页机制"将物理内存的分配延后了,这样是充分利用了程序的局部性原来,节约内存空间,提高系统吞吐
对这里有点疑惑?
   如果进程真正去访问虚拟地址的时候,有没有可能虚拟地址实际对应的物理内存空间被其他进程优先占用掉呢?
  

这个时调用swap机制
1 楼 gogole_09 2011-05-25  
实际的物理内存只有当进程真的去访问新获得的虚拟地址时,才会由"请页机制"产生"缺页"异常,从而进入分配实际页框的例程。此异常会告诉内核去真正为进程分配物理页,并建立对应的页表。这之后虚拟地址才实实在在的映射到了物理内存上了。"请页机制"将物理内存的分配延后了,这样是充分利用了程序的局部性原来,节约内存空间,提高系统吞吐
对这里有点疑惑?
   如果进程真正去访问虚拟地址的时候,有没有可能虚拟地址实际对应的物理内存空间被其他进程优先占用掉呢?
  

相关推荐

    大内高手(基于linux的内存模型)

    Linux内存模型是操作系统中至关重要的一部分,它定义了内存如何被分配、管理和访问。了解这个模型对于优化程序性能、排查内存问题以及理解系统资源的使用至关重要。以下是对Linux内存模型的详细阐述: 1. **地址...

    Linux内存管理 vs. Windows 2000内存管理

    - **Linux内存模型**:Linux采用的是完全分页的内存模型,这意味着所有物理内存都被划分为固定大小的页面(通常为4KB),并且每个进程都有自己的独立地址空间。Linux支持物理内存和虚拟内存的概念,通过页表映射...

    嵌入式Linux内存使用与性能优化

    首先,理解Linux内存模型是优化的基础。Linux内核采用虚拟内存管理,包括物理内存(RAM)和交换空间(Swap)。物理内存是硬件直接支持的存储空间,而交换空间是在硬盘上预留的部分区域,用于扩展内存。当物理内存...

    Linux内存整理doc.rar

    1. **Linux内存模型**:Linux采用虚拟内存体系,将物理内存与磁盘空间结合,形成一个更大的逻辑内存空间。这种模型允许进程看到比实际物理内存更大的地址空间,同时也实现了内存交换机制。 2. **内存区域**:在...

    linuxC内存极品文章《大内高手》

    **Linux内存模型**提供了一个清晰的视角来理解程序运行时各个内存区域的位置和用途。根据地址空间的不同,可以将Linux内存划分为以下几个部分: 1. **内核虚拟存储器**(≥0xC0000000):这部分地址空间对用户态...

    一种新的适用于Nandflash的Linux内存交换模型.pdf

    【标题】:“一种新的适用于Nandflash的Linux内存交换模型.pdf” 【描述】:该文档介绍了一种针对Nandflash的新型Linux内存交换模型,旨在解决Nandflash作为内存交换空间时面临的问题。 【标签】:“Linux操作系统...

    理解Linux进程的内存使用量

    首先,我们来看一下Linux内存模型。Linux内存管理采用了虚拟内存的概念,这意味着每个进程都有自己的虚拟地址空间,它不直接映射到物理内存,而是通过页表进行映射。虚拟地址空间分为多个区域,如堆、栈、代码段、...

    浅析Linux内存架构模型.pdf

    "浅析 Linux 内存架构模型" 本文将从 Linux 内存架构模型的角度,讨论 Linux 操作系统中内存管理的机制和实现方式。操作系统的内存管理是指操作系统根据程序的请求,把内存段分配给它们,当程序不再需要内存时释放...

    Linux内存管理--Linux物理内存三级架构.pdf

    Linux内存管理采用的是一种三级架构模型,包括内存节点(node)、内存区域(zone)和物理页框(page)。这种模型设计与具体的硬件体系结构无关,保证了良好的系统可伸缩性。接下来,我们将详细解析这三级架构的具体概念...

    认识 Linux Memory

    了解Linux内存模型,可以帮助我们更好地定位和解决程序中可能出现的问题,尤其是在处理内存泄漏、内存碎片等问题时。 Linux内存模型包括数据段、BSS段、代码段、堆栈等部分。数据段包含了初始化过的全局变量和静态...

    浅析linux设备模型—(详解设备与驱动)

    此外,设备模型还涉及到中断处理、DMA(直接内存访问)管理以及电源管理等关键功能。中断处理是设备响应外部事件的主要机制,而DMA则提高了数据传输效率,避免了CPU频繁的上下文切换。电源管理则关注如何在不影响...

    易语言linux内存操作源码

    1. **内存模型**:Linux系统采用虚拟内存管理,通过地址转换机制将进程看到的逻辑地址映射到实际的物理地址。理解页表、页框以及虚拟地址和物理地址的关系是内存操作的基础。 2. **内存分配**:包括动态内存分配...

    一种Linux内存管理机制.pdf

    本文将深入探讨Linux内存管理模型、伙伴系统、Slab分配流程以及内存回收策略。 首先,Linux内存管理模型将物理内存划分为不同的区域(ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM),每个区域都有一个伙伴系统。伙伴系统...

    linux 性能调优 linux performance truning

    2. **内存管理**:书中详细讲解了Linux内存模型,包括物理内存、虚拟内存、交换空间以及页缓存的运作机制。了解这些可以让你更好地调整内存分配,避免不必要的换页操作,从而提高系统性能。 3. **磁盘I/O优化**:...

    LInux内核精髓-精通Linux内核必会的75个绝技.pdf

    2. **内存管理**:深入理解Linux内存模型,包括虚拟地址空间、页表、内存分配策略(如伙伴系统、slab分配器)以及内存的回收和交换机制。 3. **文件系统**:Linux内核支持多种文件系统,如EXT4、XFS、Btrfs等。文件...

    易语言源码易语言linux内存操作源码.rar

    1. **内存模型**:Linux采用分页内存管理,将物理内存划分为固定大小的页,通过页表映射虚拟地址到物理地址。易语言在Linux中进行内存操作,需要了解这种分页模型,以便正确地分配、释放和访问内存。 2. **动态内存...

    Linux程序设计第四版.pdf

    书中会讲解Linux内存模型,包括虚拟内存、内存映射、动态内存分配(malloc()、calloc()、free()等)和内存对齐等概念,以及如何有效地管理程序的内存空间,防止内存泄漏。 此外,书中还会涉及文件系统、设备驱动、...

    Linux高性能服务器编程

    书中会讨论Linux内存模型、虚拟内存、内存分配策略(如mmap与brk)、内存对齐以及缓存优化等。学习这部分内容能帮助开发者合理分配和使用内存,减少不必要的内存开销。 4. **并发与多线程**:并发处理能力是高性能...

Global site tag (gtag.js) - Google Analytics