linux 段页式内存管理
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 段页式内存管理的更多相关文章
- [转载]linux段页式内存管理技术
原始博客地址: http://blog.csdn.net/qq_26626709/article/details/52742470 一.概述 1.虚拟地址空间 内存是通过指针寻址的,因而CPU的字长决 ...
- 【Linux】浅谈段页式内存管理
让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...
- linux内核源码——内存管理:段页式内存及swap
os的内存管理大概可以分成两块:1.段页式管理(虚存)2.swap in 和 swap out 段页式管理 段式管理的图像:运行时重定位 多级页表的管理图像 块表加速 用户(程序员)希望用段,物理内 ...
- linux 内核源代码情景分析——i386 的页式内存管理机制
可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...
- WINDOWS页式内存管理解析
jpg 改 rar
- 初探Linux内核中的内存管理
Linux内核设计与实现之内存管理的读书笔记 初探Linux内核管理 内核本身不像用户空间那样奢侈的使用内存; 内核不支持简单快捷的内存分配机制, 用户空间支持? 这种简单快捷的内存分配机制是什么呢? ...
- [转]linux内核分析笔记----内存管理
转自:http://blog.csdn.net/Baiduluckyboy/article/details/9667933 内存管理,不用多说,言简意赅.在内核里分配内存还真不是件容易的事情,根本上是 ...
- 【av68676164(p54)】段式和段页式虚拟存储
段式存储管理 进程分段 把进程按逻辑意义划分为多个段,每段有段名,长度不定,进程由多段组成 例:一个具有代码段.数据段和堆栈段的进程 段式内存管理系统的内存分配 以段为的单位装入,每段分配连续的内存 ...
- GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...
随机推荐
- HTML5和App之争论
2013了,移动互联网火了几年,我们也看清了原生App的真面目,App很多很好,但是盈利很难,这时我们不得不把目光重新转向HTML5. 简单地说,HTML5是一个新技术,可以让开发者基于Web开发的A ...
- 基于Extjs的web表单设计器 第一节
前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...
- DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行
.net 2005下的Windows Form Application,一个DataGridView控件和4个Button,界面设置如下: 代码如下,有注解,相信大家都看得明白: ...
- RabbitMq初探——消息分发
消息分发 前言 我们在用到消息队列的场景,一般是处理逻辑复杂,耗时,所以将同步改为异步处理,接入队列,下游处理耗时任务. 队列消息数量很大,且下游worker进程(消费者)处理耗时长,所以就有了任务的 ...
- A - 最少拦截系统 (最长上升子序列)
点击打开链接 A - 最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度. ...
- SQL Server IF Exists 判断数据库对象是否存在的用法
1 判断数据库是否存在Sql代码 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] ...
- mybatis pagehelper多数据源配置的坑
我用spring boot配置了2个数据源的工程用来同步不同库的数据,发现如果配置成如下格式报错 #分页配置pagehelper: helper-dialect: mysql reasonable: ...
- [VB6.0-->VB.NET]关于VB6.0升级到VB.NET的微软官方文档
升级流程大体是这样的: 1.用VS2008打开Vb6.0的工程(此时针对语言层面自动升级). 注: VS更新多版了(当前最新VS2017),用最新版再打开2008升级后的工程的时候还是会有自动升级,相 ...
- RN 中 Native 模块的注入过程
找到所有的模块 一般来说,只要在模块中声明 RCT_EXPORT_MODULE 即可.这是个宏,展开后是声明了一个函数,定义了两个函数,如下所示. #define RCT_EXPORT_MODULE( ...
- delphi 10.2 ----memo 的例子 实现基本记事本功能
unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...