首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux下c程序内存映像

(2)内存有多种管理方法:栈、堆、数据段、bss段、.text段等,其实这个Linux环境可以查看以ELF结尾的可执行程序,可以看到所说的这些的;一个变量的存储类属性就是描述这个变量存储在何种内存段中。...Linux下c程序内存映像 - 代码段、只读数据段 - (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)。...C语言不会自动向堆中存放东西,堆的操作是程序员自己手工操作的。程序员根据需求自己判断要不要使用堆内存,用的时候自己申请(使用malloc函数),自己使用,完了自己释放(使用free函数释放掉)。...(2)对于linux中的每一个进程来说,它都以为整个系统中只有它自己和内核而已。它认为内存地址0xC0000000以下都是它自己的活动空间,0xC0000000以上是OS内核的活动空间。...总结 上面的介绍,只是一些概念性的介绍,要详细更加深入的理解Linux内存,可以看这篇文章:https://blog.csdn.net/f22jay/article/details/7925531

2.9K20

C语言中内存分布程序运行加载过程

一个程序内存分配: 下图是APUE中的一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1=...: 可以看出,传入的参数,局部变量,都是在栈顶分布, 随着子函数的增多而向下增长....函数的调用地址(函数运行代码)(高地址) 而malloc分配的堆则存在于这些内存之上,并向上生长 全局变量,静态变量都是在分配内存的低部存在(低地址) 程序如何装载的 1 编译: 2 编译结果: file...3 加载: 图1做了简单的说明(Linux系统下的) 左边的是UNIX/LINUX系统的执行文件,右边是对应进程逻辑地址空间的划分情况。...我理解就是类似mmap函数 直接内存映射 1 ELF文件头 指定加载入口地址 2 加载 代码段 数据段 其他部分 参考 1 Linux内核如何装载和启动一个可执行程序 http://www.cnblogs.com

2K80

Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 procmeminfo 文件 | procmeminfo 重要字段解析 )

文章目录 一、查看 x86_64 架构体系内存分布 二、/proc/meminfo 重要字段解析 一、查看 x86_64 架构体系内存分布 ---- 执行 cat /proc/meminfo 命令 ,...可以查看 " x86_64 架构体系内存分布 " ; 执行结果参考 : root@ubuntu:~/kernel/linux-5.6.14# cat /proc/meminfo MemTotal:...DirectMap4k: 159552 kB DirectMap2M: 2985984 kB DirectMap1G: 3145728 kB root@ubuntu:~/kernel/linux...: 2312852 kB 空余内存 , 这些内存还没有使用 MemAvailable: 3009516 kB 真正可用的内存 , 比 MemFree 大一些 , 这是因为一些内存虽然已经使用了 , 但是可以回收...不活跃文件使用的内存 Unevictable: 48 kB 不可释放的内存页 Mlocked: 48 kB 允许程序在 " 物理内存 " 上 锁住 " 地址空间 " SwapTotal: 0 kB 交换空间总内存大小

1.5K30

理解linux平台上java程序内存模型

java 程序是运行在jvm 虚拟机里面的,离开jvm虚拟机,那么java程序无法直接在linux平台的运行。 所以java应用程序和os 平台之间是隔着jvm虚拟机的。...所谓的jvm虚拟机,本质上就是一个进程,此时它的内存模型和普通的进程有相同之处,但它又是java程序的管理者,所以它又有自己独特的内存模型....我们更多需要从jvm作为java程序管理者的角度来看其内存模型: 此时jvm的内存空间可以分为两大类,分别是 “堆内存” 以及“非堆内存”,其中前者是可以分配给java程序使用的,而后者则是jvm进程自己使用的...jvm进程不仅仅提供了java程序的运行环境,同时还进行 java 程序内存回收工作(也就是GC操作),程序员从而可以不用考虑内存回收,这个是jvm进程(也就是java虚拟机)来完成的. B....而Linux的swap回收是具有滞后性的,所以可能看到swap的空间被大量使用. 同时会经历系统响应缓慢的情况.

92430

Linux 程序设计1:深入浅出 Linux 共享内存

这章需要介绍一些共享内存相关的设置,在 Linux 系统之中和共享内存有关的文件有: /proc/sys/kernel/shmmni:限制整个系统可创建共享内存段个数。...共享内存本质上是对内存空间的使用,同时也是 ipc 的方式之一,所以我们可以使用对应的 Linux 命令来查看对应共享内存的使用: free 可以显示系统的内存占用,共享内存内存占用会归类在 shared...共享内存的使用状况 这里简单介绍一下,共享内存各个列所代表的含义: key:共享内存的key,后文会通过程序来解释 key 的含义。 shmil:共享内存的编号。...status:共享内存的状态,显示“dest”表示共享内存段已经被删除,但是还有别的引用,共享内存是通过引用计数的方式来决定生命周期,一旦程序应用内存地址的计数为0,操作系统会回收对应的内存资源。...所以说,在一个使用到共享内存程序之中,需要程序设定一个文件路径和一个项目的proj_id,来获取系统之中确定一段共享内存的key。

2.3K32

Linux内存描述之高端内存--Linux内存管理(五)

你能很方便取得内核数据和用户进程的数据 1.3 应用程序线性地址和动态内存分配 应用程序能使用的最大线性地址就是3G, 根据linux应用的分区方法: -------------------------...e=56 所以, 低端内核和高端内存是内核的概念, 跟应用程序没有直接关系. 如果Linux物理内存小于1G的空间,通常内核把物理内存与其地址空间做了线性映射,也就是一一映射,这样可以提高访问速度。...1G) 2.3 Linux内核高端内存的理解 前 面我们解释了高端内存的由来。...Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中可以看出(这里无法表示图),每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。...读者会问,系 统启动时,内核的代码和数据不是被装入到物理内存吗?它们为什么也处于虚拟内存中呢?这和编译程序有关,后面我们通过具体讨论就会明白这一点。

12.2K22

Linux - Linux内存管理

要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。...---- 从应用层的角度来看系统内存的使用状态 从应用层的角度来看,系统内存也就是Linux上运行的应用程序可以使用的内存大小,即free命令第三行“(-/+ buffers/cached)”的输出。...当应用程序需要用到内存的时候,buffers/cache会很快地被回收,以供应用程序使用。...---- 缓冲区(buffer)与缓存(cache)的异同 在Linux操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入这些内存中,然后再将数据分发给应用程序;当需要往文件中写入数据时

52.1K41

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

简单来讲,进程就是运行中的程序。更进一步,在用户空间中,进程是加载器根据程序头提供的信息将程序加载到内存并运行的实体。...在《攻克 Linux 系统编程》中,我们解释了的 ELF 文件头中指定的程序入口地址,各个节区在程序运行时的内存排布地址等,指的都是在进程虚拟空间中的地址。...在 Linux 系统中,使用如下命令可查看一个运行中的进程的内存排布。 ? 稍微修改上一篇中的示例代码,在 main 函数返回之前,增加一个无限循环,保持程序一直运行。 ?...除此之外,还有两块 vdso 和 vsyscall 内存区。它们是一部分内核数据在用户空间的映射,为了提高应用的性能而创建。在《攻克 Linux 系统编程》中,我们再专门详细讨论。...05 总结 本文深入探究了 Linux 进程在用户空间的一些内部细节,包括逻辑内存排布、进程创建和变身的内部细节、进程状态监控的目的和接口,以及终止进程的正确姿势等。

1.8K30

分布式共享内存

介绍 在并发编程中,我们需要处理两个关键问题: 线程之间如何通信 线程之间如何同步 通信是指线程之间以何种机制来交换信息,在命令式编程中,线程之间的通信机制有两种: 共享内存 消息传递 我们从通信和同步两个维度来看共享内存和消息传递...在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。...同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。...通过上面的介绍我们知道了共享内存是一种隐式的通信手段,需要显示的方法来实现同步。...而在分布式系统中,我们希望能够的是能尽可能的利用普通的机器,来达到并行计算的目标,而distributed shared memory (DSM) 在分布式系统中实现了共享内存,让所有process都共享一个全局地址空间

2.3K20

Linux内存描述之内存节点node--Linux内存管理(二)

CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大....因此linux内核需要用一种体系结构无关的方式来表示内存....因此linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于...,它包含了该页面所有的内存页,被放置在全局mem_map数组中 bdata 这个仅用于引导程序boot 的内存分配,内存在启动时,也需要使用内存,在这里内存使用了自举内存分配器,这里bdata是指向内存自举分配器的数据结构的实例...-3.x~4.x的实现 node_data内存节点数组 在新的linux3.x~linux4.x的内核中,内核移除了pg_data_t的pgdat_next之指针域, 同时也删除了pgdat_list链表

7.6K20

Linux内存描述之内存页面page--Linux内存管理(四)

1 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个...内存中的每个节点都是由pg_data_t描述,而pg_data_t由struct pglist_data定义而来, 该数据结构定义在include/linux/mmzone.h, line 615, 每个结点关联到系统中的一个处理器...简单来说, 页是一个数据块, 可以存放在任何页框(内存中)或者磁盘(被交换至交换分区)中 我们今天就来详细讲解一下linux下物理页帧的描述 2 页帧 内核把物理页作为内存管理的基本单位....因为即使在中等程序内存配置下, 系统的内存同样会分解为大量的页. 例如, IA-32系统中标准页长度为4KB, 在内存大小为384MB时, 大约有100000页....3.2 内存页标识pageflags 其中最后一个flag用于标识page的状态, 这些状态由枚举常量enum pageflags定义, 定义在include/linux/page-flags.h?

8K11

Linux内存描述之概述--Linux内存管理(一)

1.3 NUMA模型 NUMA模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。...其共享存储器物理上是分布在所有处理机的本地存储器上。所有本地存储器的集合组成了全局地址空间,可被所有的处理机访问。...2 (N)UMA模型中linux内存的机构 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存....的机器,管理区(内存区域)类型如下分布 类型 区域 ZONE_DMA 0~15MB ZONE_NORMAL 16MB~895MB ZONE_HIGHMEM 896MB~物理内存结束 内核在初始化内存管理区时...2.6 高端内存 由于能够被Linux内核直接访问的ZONE_NORMAL区域的内存空间也是有限的,所以LINUX提出了高端内存(High memory)的概念,并且允许对高端内存的访问

6.8K30

iOS的内存分布探究

前言 最近遇到一些内存相关crash,排查问题过程中产生对进程内整个地址空间分布的疑惑。搜查了一番资料,网上关于Linux进程地址空间分布的介绍比较详细,但是iOS实际运行效果的比较少。...本文基于网上相关文章,进行实际测试,探究App实际运行过程中的地址分布。...代码段:程序运行的机器指令,由代码编译产生。 64位的实际分布 对于一个iOS开发来说,目前大部分手机都是64位机器,还是需要对实际运行结果进行一些测试。...常说的堆空间地址从低到高增长,是Linux系统堆空间初始分配之后,扩大堆空间大小的时候,会往高地址增长。...知道各个地址空间的分布,能帮助我们更好理解iOS系统。在面对内存相关crash的时候,看到地址就能大概判断是属于哪一个区域,也能更加清晰具体去解析错误。

1.3K32

Linux内存描述之内存区域zone--Linux内存管理(三)

因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快, 而Linux为了兼容NUMAJ结构, 把物理内存相依照CPU的不同node分成簇, 一个CPU-node对应一个本地内存pgdata_t...Linux使用enum zone_type来标记内核所支持的所有内存区域 3.1 内存区域类型zone_type zone_type结构定义在include/linux/mmzone.h, 其基本信息如下所示...对于x86机器,管理区(内存区域)类型如下分布 类型 区域 ZONE_DMA 0~15MB ZONE_NORMAL 16MB~895MB ZONE_HIGHMEM 896MB~物理内存结束 而由于32...位系统中, Linux内核虚拟地址空间只有1G, 而0~895M这个986MB被用于DMA和直接映射, 剩余的物理内存被成为高端内存....另外, 这里的 ZONE_PADDING( ) 让 zone->lock 和 zone_lru_lock 这两个很热门的锁可以分布在不同的 Cahe Line 中.一个内存 node 节点最多也就几个

9K31

Linux内存管理

本篇介绍 本篇介绍下Linux内存管理,用系统角度看内存的寻址和分配机制。 内容介绍 内存管理应该是系统中最难的模块之一了,而且历史也悠久,就先来简单回顾下。...,也可以一定程序上避免内存外部碎片。...,比如目前空闲着5M空间,可是程序的数据段是10M,实际只会用到1M,那不好意思,程序还是用不了,因为按照分段加载就得加载10M,少1M也不行。...分页机制可以完全避免内存碎片问题么? 公布下答案: 的确有分页机制就可以完全不需要分段机制,目前linux是在分段的基础上实现了分页,这个也有考虑到是兼容性问题。...mmap流程如下: image.png 缺页异常 linux 是在不得不使用物理内存的时候才会分配物理内存。这句话该怎么理解呢?

13.6K51
领券