http://blog.chinaunix.net/uid-24227137-id-3723898.html

页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率从;或者说,分页是由于系统管理的需要,而不是用户的需求。短是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需求。

进程是如何使用内存的

对于任意一个普通的进程都会涉及到5种不同的数据段,

代码段:存放代码

数据段:存放程序静态分配的变量和全局变量

BSS:未初始化的全局变量

堆:用于存放进程运行中被动态分配的内存段,大小不固定。Malloc分配内存时,新分配的内存的添加到堆上(堆扩张),free释放内存时称为堆缩减。

栈:存放局部变量,函数调用时传入的参数和返回的参数都保存在栈中。

如图所示:数据段、bss、堆段通常是被连续存储的,内存位置上是连续的。而代码和栈往往会被独立存放。栈向下生长,堆向上生长。

进程内存空间

Linux中采用虚拟内存管理技术,用户看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用虚拟地址使得用户不能直接访问物理内存,进程间也各自互不干涉,起到保护的作用;另一方面,用户程序可使用比实际物理内存更大的地址空间。4G进程空间分为两个部分,1-3G为用户空间,4G为内核空间,用户通常情况不能访问内核空间,只有用户进程进行系统调用等时刻时可以访问内核空间。

进程内存管理

进程内存管理的对象是进程线性地址空间上的内存镜像,这些内存镜像其实就是进程使用的虚拟内存区域。进程的虚拟空间是个32位或64位的地址空间,空间大小取决于体系结构。如果要查看某个进程占用的内存区域,可以使用linux 下的/proc/maps获得。

注意:你一定会发现进程空间只包含三个内存区域,没有上面提到的堆、bss等,事实上,程序内存段和进程地址空间中的数据段内存区域是种模糊对应,也就是说,堆、bss、数据段(初始化过的)都在进程空间中由数据段内存区域表示。

进程内存的分配和回收?

创建进程fork(),程序载入execve(),映射文件mmap(),动态内存分配malloc()/brk()都需要分配内存给进程。不过这时进程申请和获得的还不是实际内存,而是虚拟内存,准确的说是“内存区域”,进程对内存区域的分配最终都会归结到do_mmap()函数上来。

进程所能直接操作的地址都是虚拟地址,当进程需要内存时,从内存获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程并没有获得物理内存,获得的仅仅是对一个新的线性地址的使用权。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会有“请求页机制”产生缺页异常,该异常是虚拟内存机制赖以生存的基本保证,它会告诉内核去真正为进程分配物理页,并建立对应的页表,根据页表机制虚拟地址才实实在在的映射到了系统的物理内存上。

页面置换算法(LRU):最近最少使用算法

地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,os必须选择一个页面将其移出内存,而用来选择淘汰哪一页的规则叫做页面置换算法。LRU算法算法选择过去一段时间里最久未使用的页面。LRU算法存在如何实现的问题,需要实际硬件支持,计数器和栈的实现都会造成多次访问内存的软件开销,实际中使用LRU的近似实现clock算法。

静态链接和动态链接

静态链接和动态链接都是共享代码的方式。

采用动态链接库,lib中的指令都会全部直接包含在最终生成的EXE文件中。但是若使用DLL,DLL不必包含在最终的EXE文件中,动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。而静态链接库就是把所有用到的函数都全部链接到exe文件中。

linux 段页式内存管理的更多相关文章

  1. [转载]linux段页式内存管理技术

    原始博客地址: http://blog.csdn.net/qq_26626709/article/details/52742470 一.概述 1.虚拟地址空间 内存是通过指针寻址的,因而CPU的字长决 ...

  2. 【Linux】浅谈段页式内存管理

    让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...

  3. linux内核源码——内存管理:段页式内存及swap

    os的内存管理大概可以分成两块:1.段页式管理(虚存)2.swap in 和 swap out 段页式管理 段式管理的图像:运行时重定位 多级页表的管理图像  块表加速 用户(程序员)希望用段,物理内 ...

  4. linux 内核源代码情景分析——i386 的页式内存管理机制

    可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...

  5. WINDOWS页式内存管理解析

    jpg 改 rar

  6. 初探Linux内核中的内存管理

    Linux内核设计与实现之内存管理的读书笔记 初探Linux内核管理 内核本身不像用户空间那样奢侈的使用内存; 内核不支持简单快捷的内存分配机制, 用户空间支持? 这种简单快捷的内存分配机制是什么呢? ...

  7. [转]linux内核分析笔记----内存管理

    转自:http://blog.csdn.net/Baiduluckyboy/article/details/9667933 内存管理,不用多说,言简意赅.在内核里分配内存还真不是件容易的事情,根本上是 ...

  8. 【av68676164(p54)】段式和段页式虚拟存储

    段式存储管理 进程分段 把进程按逻辑意义划分为多个段,每段有段名,长度不定,进程由多段组成 例:一个具有代码段.数据段和堆栈段的进程 段式内存管理系统的内存分配 以段为的单位装入,每段分配连续的内存 ...

  9. GC与显式内存管理

    C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...

随机推荐

  1. Tcp编程常见问题及解决方法总结

    问题1.粘包问题 解决方法一:TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满: 解决方法二:发送固定长度的消息 解决方法三 ...

  2. nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署(实用)

    原文地址: http://www.cnblogs.com/i80386/p/3540389.html 参考网站:http://blog.csdn.net/weijonathan/article/det ...

  3. system.data.oracleclient 需要 8.17 需要oracle客户端问题

    1.下载 2.程序引用   Oracle.DataAccess.dll  其他引用放在debug下

  4. PostgreSQL递归查询

    原料 --创建组织架构表 create table "Org"( "OrgId" ) primary key, "ParentId" ), ...

  5. SparkSQL大数据实战:揭开Join的神秘面纱

    本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...

  6. ISE14.7生成.bit文件和mcs文件

    1.FPGA bit文件加载步骤(加载到FPGA的RAM中,用于在线调试,掉电丢失) 第一步:选择Tools->IMPCAT->选择OK: 第二步:双击Boundary Scan-> ...

  7. HTTP 缓存机制详解

    从这里看的 http://mp.weixin.qq.com/s/8UXEMQBkV9hHwtu9R7mV5w

  8. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  9. SAE实践——用SVN命令行同步/提交代码

    1. 同步应用到本地 注:首次使用svn需要输入安全认证密码 在终端输入以下命令 svn co https://svn.sinaapp.com/nyhello nyhello替换为自己的应用名称. 用 ...

  10. css效果小计

    在工作学习中总能发现一些新鲜的页面效果可以用不同的css完成,在这里将遇到的一些css做下记录,以便日后翻阅,如果其中的写法不对,或者有更优写法欢迎留言,不胜感激 1.关于用一个div做出双边框(由于 ...