1、堆和栈的区别,堆和栈的最大限制

堆主要用来分配动态内存,操作系统提供了malloc等内存分配机制来供程序员进行堆内存的分配,同时,堆内存的释放需要程序员来进行。malloc分配的是虚拟地址空间,和用到的实实在在的物理内存是两码事,只有真正往空间里写东西了,os内核会触发缺页异常,然后才真正得到物理内存。32位Linux系统总共有4G内存空间,Linux把最高的1G(0xCFFFFFFF-0xFFFFFFFF)作为内核空间,把低地址的3G(0x00000000-0xBFFFFFFF)作为用户空间。malloc函数在这3G的用户空间中分配内存,能分配到的大小不超过3G,需除去栈、数据段(初始化及未初始化的)、共享so及代码段等占的内存空间。堆的地址空间是由低向高增长的(先分配低地址)。我用以下程序进行测试:

#include <stdlib.h>
#include <stdio.h>
int main()
{
         char *a = NULL;
         unsigned long size = 2147 * 1000000;
         a = (char *)malloc(size);
         if(a == NULL){
                 perror("malloc failed/n");
         }else{
                 printf("malloc success/n");
         }
         free(a);
         return 0;
}

发现最大能分配的内存约为2.147GB。

栈由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。栈的地址空间是由高向低减少的(先分配高地址)。在Linux中,用ulimit -a命令可以看到栈的最大分配空间(stack size)是8192kB,即8MB多。

2、Linux中进程最大地址空间

Linux的虚拟地址空间也为0~4G。Linux内核将虚拟的4G字节的空间分为两部分。
将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间"。将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为"用户空间"。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
其中,很重要的一点是虚拟地址空间,并不是实际的地址空间。进程地址空间是用多少分配多少,4G仅仅是最大限额而已。往往,一个进程的地址空间总是小于4G的,你可以通过查看/proc/pid/maps文件来获悉某个具体进程的地址空间。但进程的地址空间并不对应实际的物理页,Linux采用Lazy的机制来分配实际的物理页("Demand paging"和"和写时复制(Copy On Write)的技术"),从而提高实际内存的使用率。即每个虚拟内存页并不一定对应于物理页。虚拟页和物理页的对应是通过映射的机制来实现的,即通过页表进行映射到实际的物理页。因为每个进程都有自己的页表,因此可以保证不同进程的相从上到下(地址从高到低)依次为栈(函数内部局部变量),堆(动态分配内存) ,bss段(存未初始化的全局变量),数据段(存初始化的全局变量),文本段(存代码)同虚拟地址可以映射到不同的物理页,从而为不同的进程都可以同时拥有4G的虚拟地址空间提供了可能。

3、C/C++程序在Linux中的内存布局

用以下程序进行测试

#include <stdio.h>
#include <stdlib.h>
char pear[40];
static double peach;
int mango = 13;
static long melon = 2001;
int main()
{
        int i = 3, j, *ip;
        ip = malloc(sizeof(i));
        pear[5] = i;
        peach = 2.0 * mango;
        printf("stack segment: i:%p, j:%p/n", &i, &j);
        printf("heap segment: ip:%p/n", ip);
        printf("bss segment:  pear:%p, peach:%p/n", pear, &peach);
        printf("data segment: mango:%p, melon:%p/n", &mango, &melon);
        //printf("the stack top is near %p/n", &i);
        return 0;
}

运行结果如下:

stack segment: i:0xbfccc1f8, j:0xbfccc1f4
heap segment: ip:0x97bd008
bss segment: pear:0x80497c0, peach:0x80497a8
data segment: mango:0x804978c, melon:0x8049790

由此可见:从上到下(地址从高到低)依次为栈(函数内部局部变量),动态链接库,堆(动态分配内存),bss段(存未初始化的全局变量),数据段(存初始化的全局变量),文本段(存代码)

4、C/C++程序从源程序到目标文件的生成过程

见http://blog.csdn.net/vividonly/archive/2011/05/06/6399530.aspx一文

转载于:https://www.cnblogs.com/hehehaha/archive/2013/01/12/6333022.html

面试中几个基本的重要问题总结相关推荐

  1. java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...

    作者:cpp软件架构狮 链接:https://www.toutiao.com/i6618515311836529156/ (点击阅读原文前去围观) 算法是比较复杂又基础的学科,每个学编程的人都会学习大 ...

  2. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  3. 如何在一场面试中展现你对Python的coding能力?| 技术头条

    点击上方↑↑↑蓝字关注我们~ 作者 | wLsq 来源 | Python数据科学(ID:PyDataScience) 如果你已经通过了招聘人员的电话面试,那么下面正是该展现你代码能力的时候了.无论是练 ...

  4. 免费 | 程序员如何在面试中避免被坑?今晚告诉你!

    有时候满怀信心去面试 却被面试官狠狠虐走 有时在面试中感觉发挥很好 却被告知不符合要求 如何避免? 有时候不是因为你不优秀 导致最终没有拿到那个offer 有时候是被很多因素影响 甚至还留下了不好的面 ...

  5. 从60多场技术面试中,我总结了这份面试经验

    选自 | freecodecamp   作者 | Uduak Obong-Eren 转自 | 机器之心   参与 | Panda 如果你致力于成为一名软件工程师或数据科学家,技术面试往往是求职过程中的 ...

  6. Mysql高级调优篇——第五章:Sql调优在面试中深度剖析

    上节讲了Sql调优实战,本章聊聊面试中Sql调优深度的剖析场景! 在讲之前我们先做一些准备工作,建立一些需要用到的表: Mysql高级调优篇表补充--建表SQL_风清扬逍遥子的博客-CSDN博客⭐️t ...

  7. 反射 字段_详解面试中常考的 Java 反射机制

    反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...

  8. js判断数组中重复元素并找出_面试中常遇见的数组去重

    导读 JS数组去重是面试中并不少见的问题,听起来很简单,当你兴高采烈地回答了你的方法之后,你以为这道题就结束了吗?No,一般来说,面试官会继续问你"除了你刚刚说的方法,还有其他更好的方法吗? ...

  9. 聊聊算法在面试中的地位

    前段时间,有一位好友找到我,向我打听阿里社招笔试是否看重算法题的考察,我给予了肯定的答复.他表现的有些沮丧,表示自己工程底子很扎实,框架源码也研究地很透彻,唯独算法能力不行,leetcode 上的简单 ...

  10. 面试中多说这么一句话,薪水直接涨5k

    2021年金三银四马士兵教育全方位为大家打造了一堂<金三银四Java面试突击训练营> 主要解决小伙伴们的这些问题: 跳槽涨薪.优化简历.增加面试机会.搞定技术面.搞定HR面 直播列表: 第 ...

最新文章

  1. 稀疏自编码器_基于tensorflow实现稀疏自编码和在推荐中的应用
  2. Visual 数据绑定
  3. lintcode: 把排序数组转换为高度最小的二叉搜索树
  4. jvm系列(八):jvm知识点总览
  5. 【Docker学习笔记(五)】小结
  6. redis本地服务启动和桌面客户端安装(Windows)
  7. 去掉源代码里的debug标致
  8. 前台ajax请求php后台返回成功却进error方法解决
  9. android自定义多按钮点击事件监听事件吗,安卓(Android)动态创建多个按钮并添加监听事件...
  10. 又是Access做怪,DateTime类型操作失败
  11. (转)以C++为核心语言的高频交易系统的讨论?
  12. 韩立刚老师 《计算机网络》视频课程目录
  13. 小米9pro计算机打不开,小米9 Pro刷机教程,线刷升级更新官方系统包
  14. 禁止Tencent Upd
  15. Eclipse启动时f出现ail to create Java Virtual Machine问题的解决
  16. iOS/苹果开发者账户添加测试设备UDID
  17. MATLAB寻找高斯光束光斑中心
  18. linux脚本自动验证,一个无需交互,批量自动连接ssh执行命令的工具(免rsa密钥指纹验证)...
  19. SQLmap Tamper编写方法(笔记)
  20. GWAS和GS的结合:Single Step GWAS的应用

热门文章

  1. java file用法_Java File 类的使用方法详解(转)
  2. Ubuntu PIL 安装
  3. 《天天数学》连载39:二月八日
  4. 大数据学习笔记01:大数据概述
  5. python 动态编译代码_编译Python代码以使用Cython静态链接可执行文...
  6. 深度linux_国产系统?基于Linux研发的深度Deepin系统,到底算不算真国产
  7. 2017.9.29 数三角形 思考记录
  8. 学生信息管理信息系统--添加用户
  9. 让服务程序进入demon模式的代码
  10. linux c一站式编程 答案,linuxc一站式编程答案.docx