`
EalayKing
  • 浏览: 8483 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转)Linux进程与它的堆栈空间

阅读更多
一、概述
    堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储
    堆栈中存放的是函数中的局部变量,在函数的生命周期中可将变量压入堆栈,编译器需确保堆栈指针在函数退出前恢复到初始位置,即是说,内存是自动分配和释放的。
    C/C++把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,所以现在没人用auto关键词。
    与动态存储相对应的静态存储,即用static定义的局部变量,不用堆栈来存储,而是使用数据段
    堆栈的基地址位于用户空间的最高虚拟地址附近,并从那里向下延伸。
    一个进程开始,堆栈的最大值就不能改变,如果占用的空间超过了堆栈大小,就导致堆栈溢出。
 
二、进程的内存组织形式
    进程被分为三个区域:文本数据堆栈
    1) 文本区域
    文本区域也叫做代码段,由程序确定,包括代码(指令)和只读数据。该区域通常被标记为只读,任何对其写入的操作会导致段错误。
    2) 数据区域
    数据区域也叫做数据段,包括已初始化和未初始化的数据,静态变量存储在这个区域中。
    3) 堆栈区域
    堆栈区域也叫堆栈段,它用于给局部变量动态分配空间,同样函数传递参数和函数返回值也要用到堆栈。
    堆栈也可向下增长(向内存低地址)也可以向上增长,依赖于具体的实现。通常是向下增长,而SP(堆栈指针)也是指向堆栈的最后地址。
    4) 内存的分配区域
    通常堆栈位于最高虚拟地址附近,而数据段位于堆栈段之后,最后是代码段

三、堆栈着色
    当两个线程或进程使用相同的堆栈虚拟地址时,它们会争夺同一个cache行,导致竞争和降级行为。
    堆栈着色的技术使每一个进程的基址都不相同,通过随机分配堆栈基址,多个进程会使用不同的cache行来避免。

四、常驻内存和锁定内存
    常驻内存专指存储在RAM中的内存部分,不包括存储在交换区和未存储的进程的内存。
    锁定内存是常驻内存的子集,它指被进程明确地锁定到RAM的虚拟内存中,不能用于交换,并一直常驻于RAM中。
分享到:
评论

相关推荐

    如何理解Linux中进程,线程等概念

    线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所 附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的...

    Linux下多线程编程详解

    我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用...

    Linux下的C语言多线程编程

    我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空 间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用...

    【嵌入式软件工程师面经】Linux系统编程(线程进程).pdf

    每个进程通常都有一个完全独立的地址空间,即进程间的内存区域是隔离的。这意味着一个进程不能直接访问另一个进程的变量和数据结构。如果进程间需要通信(IPC,进程间通信),必须使用操作系统提供的机制,如管道、...

    使用C语言的fork()函数在Linux中创建进程的实例讲解

    使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性...

    linux多线程详解说明

    我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空 间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用...

    linux内核源代码情景分析

    第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 ...

    Linux中进程和线程的对比与区别

    Linux中进程和线程的对比与区别 1.概念 进程:正在运行中的程序。 线程:进程中的一条执行路径。 2.区别 (1)通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,...

    深入分析Linux内核源码

    5.3.2 Linux进程调度时机 5.3.3 进程调度的依据 5.3.4 进程可运行程度的衡量 5.3.5 进程调度的实现 5.4 进程切换 5.4.1 硬件支持 5.4.2 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.1.1 ...

    Firejail是Linux命名空间和seccomp-bpf沙箱-Linux开发

    Firejail是一个SUID沙箱程序,它使用Linux名称空间,seccomp-bpf和Linux功能来限制不受信任的应用程序的运行环境,从而降低了违反安全性的风险。 它允许进程及其所有后代对全局共享的内核资源(例如,网络堆栈,进程...

    Linux服务器巡检报告(2).doc

    VIPT 该进程的代码大小加上数据大小再加上堆栈空间大小的总数。单位是KB。 RES 该进程占用的物理 该进程的状态。其中S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态; Z代表僵死状态;T代表停止或跟踪状态。 ...

    linux 内核源代码分析

    第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性...

    c++多线程 Linux版本

    线程和进程的关系:线程是属于进程的,线程运行在进程空间内,同时进程所产生的线程共享同一用户内存空间,并当进程退出时该进程所产生的线程都会被强制退出并清除。一个进程至少需要一个线程作为它的指令执行体...

    漫谈Linux兼容内核

    20:Windows线程的系统空间堆栈.pdf 21:Windows进程的用户空间.pdf 22:Windows线程的调度和运行.pdf 23:关于TLS.pdf 24:Windows的结构化异常处理(一).pdf 25:Windows的结构化异常处理(二).pdf 26:Windows的...

    LINUX内核源代码情景分析

    第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性...

    firejail:Linux 命名空间沙箱程序-开源

    Firejail 是一个 SUID 程序,它通过使用 Linux 命名空间和 seccomp-bpf 限制不受信任的应用程序的运行环境来降低安全漏洞的风险。 它允许进程及其所有后代拥有自己的全局共享内核资源的私有视图,例如网络堆栈、进程...

    嵌入式系统/ARM技术中的Linux下的多进程编程

     Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。“代码段”,顾名思义,就是...

    Linux内核情景分析(二级标题).pdf

    第1章 预备知识 1.1 Linux内核简介 ...第4章 进程与进程调度 第5章 文件系统 第6章 传统的Unix进程间通信 第7章 基于socket的进程间通信 第八章 设备驱动 第9章 多处理器的SMP系统结构 第10章 系统的引导和初始化

    一个进程池的服务器程序

    总的来说,思想是让子进程accept并处理请求,父进程通过子进程发来的信息控制请求数与子进程数之间的关系。 代码如下: 代码如下: #include #include #include #include #include #include #include #...

Global site tag (gtag.js) - Google Analytics