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

标签: 【编程开发】


声明:引用请注明出处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\n", maximum);}

经测试,得到的输出为:

maximum malloc size = 1826488009 bytes

大约是1.7GB左右。

段地址对齐

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

进程栈初始化

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


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

转载于:https://www.cnblogs.com/huty/p/8518965.html

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

  1. 读书笔记程序员的自我修养 0

    读书笔记<<程序员的自我修养>> 0 为什么要读这本书? 可能因为自己是读硬件的缘故,对于编程,我总是尝试的了解各种表象的下面发生了什么事情.而困扰了我的许多问题,在这本书上都 ...

  2. 动态链接1 程序员的自我修养第七章笔记

    0. 序 预计这篇文章会很长,所以我打算把它拆成几篇文章来写.折腾了挺长时间才差不多捋清楚,主要书上一些地方和现在的实现有一点出入. 1. 概览 与动态链接有关系的节大概有这样一些,.interp, ...

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

    程序员的自我修养总结(一) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 1. 关 ...

  4. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(三)】函数调用与栈(this指针、返回值传递临时对象构建栈、运行库与多线程、_main函数、系统调用与中断向量表、Win32、可变参数、大小端

    文章目录 前言 介绍 内存 内存布局 栈与调用惯例 堆与内存管理 运行库 入口函数和程序初始化 C/C++运行库 运行库与多线程 C++全局构造与析构 fread 实现 系统调用与API 系统调用介绍 ...

  5. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(二)】进程虚拟地址空间、装载与动态链接、GOT、全局符号表、共享库的组织、DLL、C++与动态链接

    文章目录 前言 介绍 可执行文件的装载与进程 进程虚拟地址空间 装载方式 操作系统对可执行文件的装载 进程虚存空间分布 ELF文件的链接视图和执行视图 堆和栈 Linux 内核装载ELF & ...

  6. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?...

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  7. 【《程序员的自我修养---链接装载于库》读书笔记】可执行文件的装载与进程

    系列文章目录 [<程序员的自我修养-链接装载于库>读书笔记]初探ELF [<程序员的自我修养-链接装载于库>读书笔记]windows PE/COFF [<程序员的自我修养 ...

  8. 《程序员的自我修养》读书笔记

    本读书笔记从第六章开始,之前的内容会陆续补上.内容上主要对认为重要的内容进行记录,<程序员的自我修养>确实是一本好书,欢迎大家一起对书中的内容进行讨论.第六章的6.1-6.3节的内容总结如 ...

  9. 程序员的自我修养读书笔记-1

    前序:作为一个马上就要工作的非科班本科生,前段时间为了找工作,有针对性的学习了一些编程语言,数据结构,网络方面的知识,学的非常浅,非常杂乱,存粹是为了应对找工作.现在空下来了,想着以后应该就是走程序员 ...

最新文章

  1. oracle归档日志写满错误解决方法
  2. Metasploit resource命令技巧
  3. 【ARM】Tiny4412裸板编程之异常(中断向量表)
  4. NSURLSession的应用
  5. POJ3185(简单BFS,主要做测试使用)
  6. SpringMVC学习笔记-新建工程及一些注意事项
  7. ble 连接成功后找不到服务_闷声发大财的BLE芯片龙头
  8. PostgreSQL进程结构
  9. A 附录、ResolvableType
  10. 计算机辅助普通话水平测试指导,计算机辅助普通话水平测试指南38563
  11. WPF系列:GridView列绑定控件(一)
  12. php如何输入错误返回,php – 从函数返回“错误”的最佳做法
  13. 使用ArcMap将txt数据转换成shp数据
  14. 计算机考研政治考哪些知识,带你了解408考研大纲,及21考研政治复习建议
  15. 电路设计与仿真各种类软件工具介绍
  16. 纯前端支持拼音搜索功能
  17. cpufreq 五种模式
  18. 某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件: 1)A和B两人中至少去一人; 2)A和D不能一起去; 3)A、E和F三人中要派两人去; 4)B和
  19. 轩逸酷我音乐显示服务器错误,第14代轩逸车机系统体验:基本满足日常需求 随车流量模糊不清...
  20. 微信公众号查询账户余额等

热门文章

  1. 陶哲轩实分析命题10.1.7
  2. Mysql Innodb 引擎优化(-)
  3. C++STL中的vector
  4. Scala 中的函数式编程基础(一)
  5. 艾伟:尽可能摆脱对HttpContext的依赖
  6. SQL基础:常用SQL语句详解(转)
  7. mysql 特殊字符
  8. Windows批处理
  9. Python + Selenium 练习篇 - 获取页面所有邮箱
  10. [java][ide][sts] 使用配置