转自:http://pengpeng.iteye.com/blog/875521

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;

最新文章

  1. maven热部署到tomcat
  2. MVC Castle依赖注入实现代码
  3. div水平垂直居中
  4. iOS开发——View的透明属性hidden、alpha、opaque
  5. spring mvc DispatcherServlet详解之一---处理请求深入解析(续)
  6. 常用网站--前端开发类+网页设计类+平面素材类+flash类
  7. 按自己的想法去理解事件和泛型(C#)
  8. 高效判断奇偶性,利用位运算符&
  9. 如何实现简单的位数组(bit array)(转)
  10. PHPstorm 如何新增项目
  11. Java数据类型之byte、char
  12. java关于redis的快速配置
  13. 云服务jdk 升级为 OpenJDK11
  14. 【原理、应用】Quartz集群原理及配置应用
  15. java基础巩固之java实现文件上传
  16. C# 敏捷1
  17. 如何使用git管理代码
  18. cxGrid控件过滤排序和TClientDataSet同步
  19. C++原型模式和模板模式
  20. JAVA构造方法与方法是啥意思,方法重载方法覆盖俗谈

热门文章

  1. ylbtech-QQ(腾讯)-群
  2. 用physdiskwrite在VMware虚拟机上安装m0n0wall【转】
  3. NewtonPrincipia_物体的运动_求向心力
  4. 【LeetCode】58 - Length of Last Word
  5. centos6.3 安装配置redis
  6. WS之cxf与spring整合2
  7. 正整数N是否是素数
  8. the behavior of the UICollectionViewFlowLayout is not defined because:
  9. Ubuntu 创建开机自启动脚本的方法
  10. 杭电1010Tempter of the Bone