首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux进程内存布局

BSS段属于静态内存分配。 数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。...代码段:在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。...堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。...当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量...除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。

3K41

Linux 底层原理」理解进程内存布局,掌握程序动态

在《攻克 Linux 系统编程》中,我们解释了的 ELF 文件头中指定的程序入口地址,各个节区在程序运行时的内存排布地址等,指的都是在进程虚拟空间中的地址。...在 Linux 系统中,使用如下命令可查看一个运行中的进程内存排布。 ? 稍微修改上一篇中的示例代码,在 main 函数返回之前,增加一个无限循环,保持程序一直运行。 ?...启动程序并查看该进程内存布局,可以看到如下所示的信息: ? 从以上输出的内容中,可以直观看到进程的段、堆区,动态链接库加载区,栈区的逻辑地址排布,以及每块内存区分配到的权限等。...fork() 系统调用所创建的新进程,与其父进程内存布局和数据几乎一模一样。...05 总结 本文深入探究了 Linux 进程在用户空间的一些内部细节,包括逻辑内存排布、进程创建和变身的内部细节、进程状态监控的目的和接口,以及终止进程的正确姿势等。

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux进程内存管理

mm_struct结构描述了一个进程的整个虚拟地址空间,vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。...下图就是我们所说的由task_struct到mm_struct,进程的地址空间的分布。 ? 每一个进程都会有自己独立的mm_struct,这样每一个进程都会有自己独立的地址空间,这样才能互不干扰。...当进程之间的地址空间被共享的时候,我们可以理解为这个时候是多个进程使用一份地址空间,这就是线程。...arg_start,结束arg_end,环境段的开始env_start,结束env_end unsigned long saved_auxv[AT_VECTOR_SIZE]; struct linux_binfmt...vm_area_struct 数据结构来管理,包括虚拟内存的起始和结束地址,以及内存的访问权限等,通常命名为vma;vm_area_struct 数据结构的定义如下: ?

3.2K20

Linux进程内存管理(二)

简单记录一下内存管理器的基本原理。这里就不深入代码内部了。 内存管理器的初始化 进程启动后,在 jemalloc 载入的时候会调用 jemalloc_constructor 执行一些初始化操作。...arena : 将内存切分成多个类别的固定大小,采用内存池的方式对内存区域进行管理,降低内存碎片。 system memory : 其实就是内核管理的内存区域。...相关系统调用 接下来,介绍一下内存分配器相关的系统调用: brk/sbrk mmap 在介绍这几个系统调用之前,需要先对进程内存布局有所认识。 ?...64位进程内存布局 上图是一个 Linux 64位进程的地址空间布局的简图,jemalloc 能管理的就是 Heap 和 Memory map 两块的内存。 Text,存储程序的二进制代码。...参考文档 jemalloc Linux manpage jemalloc源码解析-内存管理

2.8K40

linux进程进程间通信_linux共享内存进程间通信

内存共享最新整理: Linux进程间通信-共享内存 – 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式 https://www.codecomeon.com/posts...两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。 进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。...二、相关函数: 与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。...共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共 享内存。...,已经很好了,我也就不在班门弄斧了: Linux共享内存编程实例_分享美好的专栏-CSDN博客_linux共享内存实例 赐教!

4.5K30

linux进程虚拟空间布局

首先看linux进程在32位处理器下的虚拟空间内存布局,以i386 32位机器为例                                  x86_32 32位处理器进程虚拟地址空间布局 每个用户进程的虚拟地址空间为...linux在x86_64下的经典布局如下图                     x86_64 64位处理器进程地址空间布局 用户空间分区一致,区别就是地址空间变大了,内核空间取消了高端内存,因为内核空间的地址空间完全可以访问全部物理内存...下面以32位处理器为例看linux内核如何建立用户进程空间的内存布局的,fork调用是复制父进程的struct mm_struct的内存描述符不需要重新建立布局,而建立新的内存布局是通过加载二进制可执行文件...execve函数族加载可执行文件是将当前进程镜像替换为新的进程映像,我们看一下linux加载二进制文件建立布局的流程,只分析内存布局代码,其它的会专门写一篇二进制文件加载的分析。    ...//代码段结束地址 start_data = 0; //数据段起始地址 end_data = 0; //数据段结束地址 /* 此处可以看出execv函数族是将当前进程内存布局替换为新进程内存布局

2.3K20

Linux进程通信之共享内存

Linux进程通信之共享存储 概念: 共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。...共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。...PHP中的封装: php中封装了shm开头的函数和shmop开头的函数,实际效果是一样的,具体使用方式请查看官方手册 ,下面我们以shm开头的为例演示 特点: 共享内存是将内存映射到其他进程的地址空间中...,所以说共享内存也是最快的IPC进程通信方式 前提: 在使用IPC进程通信时,也就是信号量、消息队列、共享存储时,首先要先确定自己的PHP扩展是否已经开启,使用php -m 查看 编写代码 父子进程...,至于非血缘关系的通信,则看我之前的文章,自己实现即可 当然,IPC进程间的通信数据也会保存在Linux系统中,可通过下面的方式,具体查看相关信息 并且如果想知道系统调用的哪些底层函数,则可以用

4.7K31

Linux进程内存分析pmap命令

名称:        pmap - report memory map of a process(查看进程内存映像信息)pmap命令用于报告进程内存映射关系,是Linux调试及运维一个很好的工具。...映像支持文件,[anon]为已分配内存 [stack]为程序堆栈         Offset:  offset into the file  文件偏移         Device:  device...,也就是该进程预先分配的虚拟内存大小,即ps出的vsz writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小       shared 表示进程和其他进程共享的内存大小...查看进程1的设备格式,不显示头尾行 [root@C44 ~]#  pmap -d -q 1 1:   init [5]                     00934000     ...00000   [ stack ] ffffe000       4 ----- 0000000000000000 000:00000   [ anon ] [root@C44 ~]#   查看进程

3.6K10

Linux进程内存消耗指标解读

了解系统的内存消耗是运维最基本的技能,但是Linux中关于内存消耗的指标很容易让人混淆,本文尝试把诸多概念解释清楚 概念 物理内存和虚拟内存 物理内存:不解释 虚拟内存进程独享,由操作系统通过地址映射的方式...在32位Linux机器上,每个进程的虚拟内存都是4G。...(这里的虚拟内存与操作系统使用中过程常见的虚拟内存概念不同,不要混淆了,如Linux中swap) 内存耗用指标 VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS...(进程地址空间),包括数据、代码、堆、共享库、内存映射文件等,可以使用pmap命令查看详情。...Linux 查看进程消耗内存情况总结 Java 进程占用 VIRT 虚拟内存超高的问题 Virtual Memory Usage from Java under Linux, too much memory

5.8K40

Linux进程间通信【共享内存

V 标准,所以 System V 中的消息队列、信号量绝大部分接口的风格也与之差不多 2.1、共享内存的数据结构 共享内存不止用于两个进程间通信,所以共享内存必须确保能持续存在,这也就意味着共享内存的生命周期不随进程...,实际中会使用函数进行自动释放,因为手动释放比较麻烦 2.4、进程关联 shmat 共享内存在被成功创建后,进程还不 “认识” 它,只有让待通信进程都 “认识” 同一个共享内存后,才能进行正常通信,让进程...id 参数2 const void *shmaddr 共享内存关联至进程共享区的地址,可以不用管 参数3 int shmflg 关联后,进程对共享内存的读写属性 当进程与共享内存关联后,返回的就是共享内存映射至共享区的起始地址...: 进程 A 直接将数据写入共享内存进程 B 直接从共享内存中读取数据 显然,使用共享内存只需要经过 2 次 IO 所以共享内存的秘籍是 减少拷贝(IO)次数 得益于共享内存的这种特性,可以让进程通信的时候...》 ---- 总结 以上就是本次关于 Linux 进程间通信之 共享内存 的全部内容了,共享内存 是所有 IPC 中最快的一种,因为它省去了很多不必要的 IO 操作,进程直接对话进程,效率极高,不过在狂飙的后果就是不安全

23900

Linux 进程虚拟地址空间布局

文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内存...比如 Windows 下的“进程因非法操作需要关闭” 和 Linux 下的 “Segmentation fault”,一般都是由于进程访问了非法的内存地址。...对于 Linux,4GB 的虚拟地址空间的默认分配状态如下: 2.虚拟地址空间布局 C/C++程序为编译链接后生成可执行的二进制文件,由多个段组成,一般包含代码段、数据段和 BSS 段等。...Linux 环境程序典型的内存布局如下图所示。 有时候,把 BSS 段与 Data 段看做成一个可读写的数据段也是可以的,这里做了区分。下面简要说明程序装载时相关的段。...参考文献 [1] linux内核空间和用户空间详解 [2] 程序或-内存区域分配(五个段)–终于搞明白了 [3] 进程内存分布剖析 [4] 深入理解计算机系统中文版[M].C1.7.3虚拟内存.P12

5K50

Linux 进程间通信 : 共享内存(上)

在这主要介绍的就是用mmap进行多进程内存共享功能。Linux产生子进程的系统调用是fork,根据fork的语义以及其实现,我们知道新产生的进程内存地址空间上跟父进程是完全一致的。...所以Linux的mmap实现了一种可以在父子进程之间共享内存地址的方式,其使用方法是: 父进程将flags参数设置MAP_SHARED方式通过mmap申请一段内存。...XSI共享内存 为了满足多个无关进程共享内存的需求,Linux提供了更具通用性的共享内存手段,XSI共享内存就是这样一种实现。...对于Linux系统来说,使用XSI共享内存的时候可以通过shmget系统调用的shmflg参数来申请大页内存(huge pages),当然这样做将使进程的平台移植性变差。...于是,遵循一切皆文件理念的POSIX标准的进程间通信机制应运而生。 接Linux进程间通信:共享内存 (下)

11K33

Linux进程间通信:共享内存 (下)

Linux进程间通信:共享内存 (上) POSIX共享内存 POSIX共享内存实际上毫无新意,它本质上就是mmap对文件的共享方式映射,只不过映射的是tmpfs文件系统上的文件。 什么是tmpfs?...Linux提供一种“临时”文件系统叫做tmpfs,它可以将内存的一部分空间拿来当做文件系统使用,使内存空间可以当做目录文件来用。...现在绝大多数Linux系统都有一个叫做/dev/shm的tmpfs目录,就是这样一种存在。具体使用方法,大家可以参考我的另一篇文章《Linux内存中的Cache真的能被回收么?》。...Linux提供的POSIX共享内存,实际上就是在/dev/shm下创建一个文件,并将其mmap之后映射其内存地址即可。...这部分内容大家也可以参考《Linux内存中的Cache真的能被回收么?》。

8K12
领券