当前位置:首页>编程日记>正文

【读书笔记】程序员的自我修养总结(七)

【读书笔记】程序员的自我修养总结(七)

标签: 【编程开发】


声明:引用请注明出处http://blog.csdn.net/lg1259156776/


说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容。
本文主要介绍可执行文件的装载与进程


ELF文件的链接视图和执行视图

当段的数量增多时,会产生空间浪费的问题:因为ELF文件被映射时时以系统的页长度作为单位的,那么每个段在影射时的长度应该都是系统页长度的整数倍,如果不是,那么多余部分将占用一个页,而一个ELF文件中往往有十几个段,那么内存空间将噪声浪费。

解决方法:
操作系统在装载可执行文件时,可以发现主要关心的是段的权限(可读,可写,可执行)等。比如:

  • 以代码段为代表的权限为可读可执行的段;
  • 以数据段和BSS段为代表的权限为可读可写的段;
  • 以只读数据段为代表的权限为只读的段;

所以,可以将相同权限的段,合并到一起当作一个段进行映射,可以明显减少页面内部碎片,节省内存空间。在目标文件链接为可执行文件时,链接器会尽量将相同权限属性的段分配在同一空间。被称为Segment。
所以,会有ELF文件会有链接视图和执行视图的概念,链接视图以section,而执行视图为Segment,两者区别就是相同特性之间的段之间的合并。

堆和栈

堆(heap)和栈(stack)在进程的虚拟空间中的表现也是以VMA的形式存在的。C语言中最常用的malloc就是从堆中分配的,堆由系统库管理。栈一般也叫做堆栈,每个线程都有自己的堆栈,对于单线程程序来讲,这个VMA堆栈全归它使用。那么一个进程基本上可以分为如下几种VMA区域:

  • 代码VMA,权限只读、可执行;有映像文件。
  • 数据VMA,权限可读写、可执行;有映像文件。
  • 堆VMA,权限可读写、可执行;无映像文件,匿名,可向上扩展。
  • 栈VMA,权限可读写、不可执行;无映像文件,匿名,可向下扩展。

堆的最大申请数量

Linux下虚拟地址空间分给进程本身的是3GB,windows大概是默认2GB。可以测试一下malloc函数进行地址空间的申请,到底能申请多大内存?

#include<stdio.h>
#include<stdlib.h>
unsigned maximum = 0;
int main()
{unsigned blocksize[] = {1024 * 1024, 1024, 1};int i, count;for(i = 1; i < 3; i++)for(count = 1; ; count++){void *block = malloc(maximum + blocksize[i] * count);if(block){maximum = maximum + blocksize[i] * count;free(block);}else{break;}}printf("maximum malloc size = %u bytes
", maximum);}

经测试,得到的输出为:

maximum malloc size = 1826488009 bytes

大约是1.7GB左右。

段地址对齐

要映射一段物理内存和进程虚拟地址空间之间建立映射关系,这段内存空间的长度必须是4096的整数倍,并且这段空间在物理内存和进程虚拟地址空间中的起始地址必须是4096的整数倍。最简单的方法就是每个段分开映射,不足一个页的占据一个页,这样当然会造成内部碎片。而有些UNIX采用各个段接壤部分共享一个物理页面,然后将该物理页面分别映射两次。

进程栈初始化

进程刚开始启动的时候,须知道一些进程运行的环境,最基本的就是系统环境变量和进程的运行参数。很常见的做法是操作系统在进程启动前将这些信息提前保存到进程的虚拟空间的栈中。
进程在启动以后,程序的库部分会把堆栈里的初始化信息中的参数信息传递给main(),也就是main函数中的两个argc和argv两个参数,分别对应命令行中参数数量和命令行参数字符串指针数组。


2015-11-01读书笔记 张朋艺


http://www.coolblog.cn/news/9dc4427567070075.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐