数据库修仙秘境篇三——linux内存管理指北

linux进程中的内存分布 进程空间分布概述 对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。 未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。 栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。 堆 (Heap):存储动态内存分配,需要程序员手工. 阅读详情

linux内存管理指北

内存是一段连续的地址单元,linux内核接管内存管理后,会将内存划分为内核区和用户区。因而内存管理就分为两个层面:

  • 内核内存管理

    一般是kmalloc(小块内存)和vmalloc(大块内存)。

  • 用户内存管理

    一般是malloc(小块内存)和mmap(大块内存)。

本文内容大量摘抄引用自Mortree的博客和CodingLabs博客,这里只是做了简单的整理。详细内容请阅读他们的博客。

内存分类

相对于进程来说,内存分为如下几个部分:

  • 堆
  • 栈
  • 数据段
  • 代码段
  • bss段

当进程执行时,内存地址会经历“逻辑地址”——“线性地址”——“物理地址”的转换。

逻辑地址经段机制转化成线性地址;线性地址又经过页机制转化为物理地址。(但是我们要知道Linux系统虽然保留了段机制,但是将所有程序的段地址都定死为0-4G,所以虽然逻辑地址和线性地址是两种不同的地址空间,但在Linux中逻辑地址就等于线性地址,它们的值是一样的)

进程内存空间

Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间(具体的原因请看硬件基础部分)。

  1. 4G的进程地址空间被人为的分为两个部分——用户空间与内核空间。用户空间从0到3G(0xC0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。

  2. 用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表(init_mm.pgd),用户进程各自有不同的页表。

  3. 每个进程的用户空间都是完全独立、互不相干的。

进程内存管理

进程内存管理的对象是进程线性地址空间上的内存镜像,这些内存镜像其实就是进程使用的虚拟内存区域(memory region)。进程虚拟空间是个32或64位的“平坦”(独立的连续区间)地址空间(空间的具体大小取决于体系结构)。要统一管理这么大的平坦空间可绝非易事,为了方便管理,虚拟空间被划分为许多大小可变的(但必须是4096的倍数)内存区域,这些区域在进程线性地址中像停车位一样有序排列。这些区域的划分原则是“将访问属性一致的地址空间存放在一起”,所谓访问属性在这里无非指的是“可读、可写、可执行等”。

如果你要查看某个进程占用的内存区域,可以使用命令cat /proc//maps获得。

cat /proc/self/maps

heap内存模型

一般来说,malloc所申请的内存主要从Heap区域分配。Linux维护一个break指针,这个指针指向堆空间的某个地址。从堆起始地址到break之间的地址空间为映射好的,可以供进程访问;而从break往上,是未映射的地址空间,如果访问这段空间则程序会报错。

brk和sbrk

要增加一个进程实际的可用堆大小,就需要将break指针向高地址移动。Linux通过brk和sbrk系统调用操作break指针。两个系统调用的原型如下:

int brk(void *addr);
void *sbrk(intptr_t increment);

brk将break指针直接设置为某个地址,而sbrk将break从当前位置移动increment所指定的增量。brk在执行成功时返回0,否则返回-1并设置errno为ENOMEM;sbrk成功时返回break移动之前所指向的地址,否则返回(void *)-1。

一个小技巧是,如果将increment设置为0,则可以获得当前break的地址。

另外需要注意的是,由于Linux是按页进行内存映射的,所以如果break被设置为没有按页大小对齐,则系统实际上会在最后映射一个完整的页,从而实际已映射的内存空间比break指向的地方要大一些。但是使用break之后的地址是很危险的(尽管也许break之后确实有一小块可用内存地址)。

资源限制与rlimit

系统对每一个进程所分配的资源不是无限的,包括可映射的内存空间,因此每个进程有一个rlimit表示当前进程可用的资源上限。这个限制可以通过getrlimit系统调用得到,下面代码获取当前进程虚拟内存空间的rlimit:

   struct rlimit {
       rlim_t rlim_cur;  /* Soft limit */
       rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
   };    
	int main() {
       struct rlimit *limit = (struct rlimit *)malloc(sizeof(struct rlimit));
       getrlimit(RLIMIT_AS, limit);
       printf("soft limit: %ld, hard limit: %ld\n", limit->rlim_cur, limit->rlim_max);
   }

进程内存的分配与回收

创建进程fork()、程序载入execve()、映射文件mmap()、动态内存分配malloc()/brk()等进程相关操作都需要分配内存给进程。不过这时进程申请和获得的还不是实际内存,而是虚拟内存,准确的说是“内存区域”。进程对内存区域的分配最终都会归结到do_mmap()函数上来(brk调用被单独以系统调用实现,不用do_mmap()),

内核使用do_mmap()函数创建一个新的线性地址区间。但是说该函数创建了一个新VMA并不非常准确,因为如果创建的地址区间和一个已经存在的地址区间相邻,并且它们具有相同的访问权限的话,那么两个区间将合并为一个。如果不能合并,那么就确实需要创建一个新的VMA了。但无论哪种情况, do_mmap()函数都会将一个地址区间加入到进程的地址空间中--无论是扩展已存在的内存区域还是创建一个新的区域。

同样,释放一个内存区域应使用函数do_ummap(),它会销毁对应的内存区域。

虚拟内存转换为物理内存

从上面已经看到进程所能直接操作的地址都为虚拟地址。当进程需要内存时,从内核获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程并没有获得物理内存(物理页面——页的概念请大家参考硬件基础一章),获得的仅仅是对一个新的线性地址区间的使用权。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请求页机制”产生“缺页”异常,从而进入分配实际页面的例程。

该异常是虚拟内存机制赖以存在的基本保证——它会告诉内核去真正为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实在在地映射到了系统的物理内存上。(当然,如果页被换出到磁盘,也会产生缺页异常,不过这时不用再建立页表了)

这种请求页机制把页面的分配推迟到不能再推迟为止,并不急于把所有的事情都一次做完(这种思想有点像设计模式中的代理模式(proxy))。之所以能这么做是利用了内存访问的“局部性原理”,请求页带来的好处是节约了空闲内存,提高了系统的吞吐率。

物理内存管理

linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了。利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[3],系统可以东一页、西一页的凑出所需要的内存供进程使用。虽然如此,但是实际上系统使用内存时还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更改,因此能降低TLB的刷新率(频繁刷新会在很大程度上降低访问速度)。

鉴于上述需求,内核分配物理页面时为了尽量减少不连续情况,采用了“伙伴”关系来管理空闲页面。伙伴关系分配算法大家应该不陌生——几乎所有操作系统方面的书都会提到,我们不去详细说它了,如果不明白可以参看有关资料。这里只需要大家明白Linux中空闲页面的组织和管理利用了伙伴关系,因此空闲页面分配时也需要遵循伙伴关系,最小单位只能是2的幂倍页面大小。内核中分配空闲页面的基本函数是get_free_page/get_free_pages,它们或是分配单页或是分配指定的页面(2、4、8…512页)。

注意:get_free_page是在内核中分配内存,不同于malloc在用户空间中分配,malloc利用堆动态分配,实际上是调用brk()系统调用,该调用的作用是扩大或缩小进程堆空间(它会修改进程的brk域)。如果现有的内存区域不够容纳堆空间,则会以页面大小的倍数为单位,扩张或收缩对应的内存区域,但brk值并非以页面大小为倍数修改,而是按实际请求修改。因此Malloc在用户空间分配内存可以以字节为单位分配,但内核在内部仍然会是以页为单位分配的。

另外,需要提及的是,物理页在系统中由页结构struct page描述,系统中所有的页面都存储在数组mem_map[]中,可以通过该数组找到系统中的每一页(空闲或非空闲)。而其中的空闲页面则可由上述提到的以伙伴关系组织的空闲页链表(free_area[MAX_ORDER])来索引。

内核内存使用

  • slab

所谓尺有所长,寸有所短。以页为最小单位分配内存对于内核管理系统中的物理内存来说的确比较方便,但内核自身最常使用的内存却往往是很小(远远小于一页)的内存块——比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都不足一页。这些用来存放描述符的内存相比页面而言,就好比是面包屑与面包。一个整页中可以聚集多个这些小块内存;而且这些小块内存块也和面包屑一样频繁地生成/销毁。

为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为slab分配器的技术。Slab分配器的实现相当复杂,但原理不难,其核心思想就是“存储池”的运用。内存片段(小块内存)被看作对象,当被使用完后,并不直接释放而是被缓存到“存储池”里,留做下次使用,这无疑避免了频繁创建与销毁对象所带来的额外负载。

Slab将页面(来自于伙伴关系管理的空闲页面链表)撕碎成众多小内存块以供分配,slab中的对象分配和销毁使用kmem_cache_alloc与kmem_cache_free。

  • kmalloc

一般来说内核程序中对小于一页的小块内存的请求才通过Slab分配器提供的接口Kmalloc来完成(虽然它可分配32 到131072字节的内存)。从内核内存分配的角度来讲,kmalloc可被看成是get_free_page(s)的一个有效补充,内存分配粒度更灵活了。

  • 内核非连续内存分配(Vmalloc)

所以避免外部分片的最终思路还是落到了如何利用不连续的内存块组合成“看起来很大的内存块”——这里的情况很类似于用户空间分配虚拟内存,内存逻辑上连续,其实映射到并不一定连续的物理内存上。Linux内核借用了这个技术,允许内核程序在内核地址空间中分配虚拟地址,同样也利用页表(内核页表)将虚拟地址映射到分散的内存页上。以此完美地解决了内核内存使用中的外部分片问题。内核提供vmalloc函数分配内核虚拟内存,该函数不同于kmalloc,它可以分配较Kmalloc大得多的内存空间(可远大于128K,但必须是页大小的倍数),但相比Kmalloc来说,Vmalloc需要对内核虚拟地址进行重映射,必须更新内核页表,因此分配效率上要低一些(用空间换时间)。

reference

  1. http://blog.codinglabs.org/articles/a-malloc-tutorial.html
  2. https://www.jianshu.com/p/a563a5565705
  3. https://blog.youkuaiyun.com/yanleizhouqing/article/details/90262778
C++工业级开发九重修炼:从现代语法到系统架构实战 C++作为一门接近系统底层的编程语言,其核心价值在于提供零成本抽象和对硬件的直接掌控力,从而实现无与伦比的运行时性能。其原理建立在资源获取即初始化的RAII哲学之上,通过智能指针、移动语义等机制,将资源生命周期与对象生命周期绑定,确保了异常安全和内存安全。这种精细的控制能力,使其在需要极致性能与稳定性的技术领域具有不可替代的价值,广泛应用于游戏引擎、高频交易系统、嵌入式设备和大型分布式后台等场景。现代C++标准引入了模块、协程、概念等新特性,持续演进着开发范式,而像CMake这样的现代构建系统和vcpkg等 阅读详情

相关推荐

数字芯片后端设计实战:Memory Compiler参数配置与SRAM生成优化

本文深入解析数字芯片后端设计中Memory Compiler的核心参数配置与SRAM生成优化策略。详细探讨了容量结构、频率设定、工艺角选择等关键参数的配置要点与常见误区,并提供了从.lib/.lef文件转换到后端流程整合的实战指南,旨在帮助设计者生成面积、性能和功耗更优的存储单元。

weixin_29194255的博客 702

进程内存分布(详解)

由编译器自动分配释放,速度较快用来存储函数调用时的临时信息的结构,存放为运行时函数分配的局部变量函数参数返回数据返回地址等。这些局部变量等空间都会被释放程序运行过程中函数调用时参数的传递也在栈上进行,如递归调用栈当栈过多的时候,就是导致栈溢出(比如大量的递归调用或者大量的内存分配)栈是向低地址扩展的数据结构,是一块连续的内存的区域,空间有限。

番茄的博客 5522

Android开发者必看:F2FS文件系统如何优化你的手机存储性能(附实测数据对比)

本文深入解析了F2FS文件系统如何针对闪存特性优化Android设备存储性能。通过对比ext4,F2FS采用追加写和冷热数据分离策略,将随机写转化为顺序写,显著提升写入速度并减少GC卡顿。实测数据显示,其在随机写入和SQLite事务等场景下性能提升显著,为开发者提供了优化应用IO性能的关键思路。

weixin_29248313的博客 325

Linux系统中进程内存分布

本文介绍了Linux进程在内存中的分布。

Mr_Sudo的博客 3516

YOLOv11增量学习数据回放优化:解决新类别引入时的灾难性遗忘问题

本文提出了一种基于生成式潜在回放和提示学习的YOLOv11增量学习系统,旨在解决目标检测中的灾难性遗忘问题。系统采用改进的YOLOv11骨干网络,结合条件变分自编码器生成旧类别特征,并通过渐进式提示调优模块实现高效参数更新。关键技术包括:1) C3k2模块和C2PSA注意力增强特征提取;2) CLIP引导的VAE潜在空间数据回放;3) 类特定与超类别提示相结合的增量调优策略;4) 自适应特征金字塔与显式视觉中心融合机制。实验表明,该方法在保持原有检测性能的同时,显著降低了增量学习过程中的遗忘现象。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2105

阿里云 Docker 镜像加速收费后:这些免费替代方案值得收藏

阿里云Docker镜像加速服务收费后,国内开发者急需免费替代方案。本文推荐2025年仍可用的7个免费镜像源,包括轩辕镜像、DaoCloud、网易云等,并提供多源配置方案以提高稳定性。建议开发者在CI/CD环境中配置多个镜像源,避免构建失败。文章还提供了详细的配置步骤和使用建议,适合个人和团队开发者参考。

sg_knight的专栏 1931

Linux系统下的进程地址、内存分区、映射机制

4G指的是可用范围为4G,不一定能占满,所以能映射到的物理内存实际上很少,只是让进程误以为自己独占4G内存。其次,第二部分以table的值为4索引找到页表里对应的页表4项的内容,项的内容保存的是实际的物理块号4的,找到对应的物理块起始地址0x1000 4000。最后,第三部分通过offset的偏移量256和页表3里面的页表项4的地址相加来找到最终物理地址0x1000 4256,完成内存映射。,所以不同进程里的相同虚拟地址,如0x1234所映射的物理地址是不相同的。在32位操作系统中,程序员首先给出的是。

DZJ_Nirvana 2222

飞牛fnNAS存储模式RAID 5数据恢复

中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇RAID 5的。但我认为,一般人出现1块硬盘损坏后,就能够赶紧采取处理措施了,再高的容灾等级也无法满足这个用户的需求了。》就完成了飞牛NAS存储空间的说明,包括了如何创建、怎么选择空间模式、RAID 5 硬盘故障后的更换、系统更换/重装后数据盘的恢复等等。在VMware中新建虚拟机,安装好fnNAS后,再向虚拟机添加“已有硬盘”(这就是所谓崩溃虚拟机的数据盘),此时新的fnNAS出现提示。在“选择要添加的硬盘”中,选择刚添加硬盘。

dgnankai的专栏 3011

linux内存管理--进程在内存中的分布

一、进程与内存     所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段; 代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程

鱼思故渊的专栏 8806

[DDR5]DDR5 SDRAM 状态图 和 基本功能

DDR5 SDRAM的读写操作以突发(burst mode)为导向,从选定的位置开始,并按照编程顺序进行16个突发长度或8个“切片”突发长度的操作。从ACTIVATE命令开始,然后是读取或写入命令。

串起点滴 1201

全网最详细教程,手把书教你使用YOLOv10训练自己的数据集和推理(附YOLOv10网络结构图)

YOLOv10,由清华大学多媒体智能组只开发,是一款亳秒级实时端到端目标检测的开源模型。该模型在保持性能不变的情况下,与YOLOv9相比,延迟减少了46%,参数减少了25%,非常适合需要快速检测物体的应用,如实时视频分析、自动驾驶和智能医疗等领域。这些改进使得YOLOv10在实时物体检测领域达到了新的技术水平。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

数据库修仙秘境篇五——linux巨页内存编程

linux大页内存 HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能。 概念 Page Table: page table也就是一种用于内存管理的实现方式,用于物理地址到虚拟之间的映射。因此对于内存的访问,先是访问Page Table,然后根据Page Table 中的映射关系,隐式的转移到物理地址来存取数据。 TLB: Translation Lookaside Buffer (TL

growdu的网络博客 1958

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3934

跨界内容生成系统:从拓扑算法到修仙规则引擎的技术实现

规则引擎作为现代软件系统的核心组件,通过定义和执行业务逻辑来实现复杂的决策流程。其技术原理基于条件判断和动作执行的组合,能够将抽象的业务需求转化为可执行的代码逻辑。在技术价值层面,规则引擎提供了高度的灵活性和可维护性,使系统能够快速适应需求变化。特别是在游戏开发和内容生成领域,规则引擎的应用尤为广泛,能够处理复杂的角色属性计算、环境交互逻辑和随机事件生成。以拓扑算法为例,这种数学概念可以转化为游戏中的关卡生成机制,通过连通性分析和空间变换创造多样化的游戏体验。结合修仙题材的设定系统,规则引擎能够实现境界提升

weixin_34087307的博客 348

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java开发实战:从环境配置到内存管理的核心避坑指南

在软件开发领域,环境配置与运行时管理是构建稳定应用的基础。理解环境变量的原理,如JAVA_HOME与PATH的协同机制,能确保开发工具链的正确识别与调用。内存管理则是程序性能与稳定性的核心,JVM通过堆内存分配与垃圾回收机制自动管理对象生命周期,但不当的编码实践可能导致内存泄漏或溢出错误,深刻理解其原理对编写高效、健壮的代码至关重要。这些基础技术广泛应用于企业级应用开发、后端服务构建等场景。本文聚焦Java开发中环境变量配置、版本兼容性、内存不足(OutOfMemoryError)及数组越界等典型问题的深度

weixin_34115824的博客 297

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AI项目本地部署实战:从环境搭建到批量生成全流程解析

在人工智能技术快速发展的今天,本地部署AI模型已成为许多开发者和创作者实现定制化内容生成、保障数据隐私的关键需求。其核心原理在于将预训练好的深度学习模型部署在本地硬件上,通过GPU加速进行推理计算,从而摆脱对云端API的依赖。这项技术的价值在于提供了高度的自主控制权、更低的长期使用成本以及对敏感数据的本地化处理能力,尤其适用于需要风格化、批量化内容生产的应用场景,例如游戏素材生成、插画创作和角色设计。本文将以一个典型的本地化AI内容生成项目为例,深入探讨其部署流程、功能测试与性能优化方法,其中涉及显存优化和

congjukun0600的博客 404

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【重要】Linux 进程中的内存分布

程序代码在内存中的映射,存放函数体的二进制代码。在程序运行初已经对变量进行初始化的数据。在程序运行初未对变量进行初始化的数据。存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。1.Text, BSS, Data段在编译时已经决定了进程将占用多少VM可以通过size,知道这些信息。

xyxzlsld666的博客 2036

深入理解Linux内存分配

为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化。除此之外,你有可能会选择在函数内部去声明局部变量,又或者为变量动态申请内存。 不管你在用户程序中采取哪种方式申请内存,这些都对应着不同的内存分配方式以及不同的数据段,如果再加上代码段,就构成了一个完整的进程。由此可见,一个完整的进程在内存空间中对应着不同的数据区,具体来说,对应着五种不同的数据区: 代码段,存放操作指令;数据段,存放已初始

木牛的博客 1512

1、Linux 进程的内存分布

用户空间负责程序逻辑与数据存储;内核空间负责资源与安全管理;堆与栈是动态内存的核心区;malloc / mmap 分别管理不同规模的分配需求。从用户视角看:程序有完整的 4GB 或 128TB 地址空间;从内核视角看:只是不同虚拟页映射到物理内存的“假象”,一切由内核统一调度。

bamboo_tt的博客 1023

linux系统进程的内存布局

这个内存区域不是匿名的。区别在于BSS保存的是未被初始化的静态变量内容,它们的值不是直接在程序的源代码中设定的。我们要知道,栈中存放的是一个个被调函数所对应的堆栈帧,当函数fun1被调用,则fun1的堆栈帧入栈,fun1返回时,fun1的堆栈帧出栈。再来讲一下上图,一个堆栈帧的最顶部,是实参,然后是return address,这个值是由主调函数中的call命令在call调用时自动压入的,不需要我们关心,previousframe pointer,就是主调函数的堆栈帧指针,也就是主调函数的ebp值。

m0_74282605的博客 551

Linux内存布局详解

从堆段分配出nmemb*size字节的内存,即分配一块可容纳nmemb个元素、每个元素大小为size字节的数组的内存,将这块内存的初始化为0,并返回这块内存的起始地址。这个128KB可通过。:重新调整ptr所指向的已分配的内存大小为size字节,不会改变原来的内存的内容,也不会初始化新增的内存。从内存映射区申请内存,且释放时也可直接归还内存映射区的这块内存给内核,但是内核需要建立一系列复杂的数据结构来完成内存映射区的内存申请。:从堆段分配出size字节的内存,不会初始化这块内存,返回这块内存的起始地址。

llb_1203的博客 1900

Linux内核进程地址空间与进程内存布局

由于栈中数据严格的遵守FIFO的顺序,这个简单的设计意味着不必使用复杂的数据结构来追踪栈中的内容,只需要一个简单的指针指向栈的顶端即可,因此压栈(pushing)和退栈(popping)过程非常迅速、准确。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的,最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。

嵌入式Linux内核的博客 2427

linux 内存分布

linux 内存分布 ,内存管理 ,PAGE_OFFSET

tangzhangyin的专栏 1034

linux进程内存分布

linux进程内存分布,地址从低到高依次是代码段,数据段,堆,栈,堆栈之间是mmap映射的共享内存空间以及共享库,再上是命令行参数,环境变量,最高1g是共享的内核空间。其中栈是从高地址向低地址分配,堆是从低地址向高地址分配。 具体如下图所示:

sunlylorn的专栏 4090

Linux 进程与内存布局详解

1.正在运行的程序,其运行过程中需要消耗内存和CPU。gcc应用程序 可执行程序 内存硬盘 硬盘 cpu程序和进程有什么区别?程序:静态的数据集合,存储在硬盘空间程序运行起来可以产生进程;一个程序可以产生多个进程进程:是一个程序动态执行的过程,需要消耗内存和CPU,进程具备动态生命周期,从产生到调度再到消亡。

m0_66592645的博客 1196

进程的内存分布

参考博文: https://blog.youkuaiyun.com/qq_26685951/article/details/76920326     一个进程的内存主要分为五部分: text(文本/代码段),initialize data(数据段),uninitialized data(未初始化数据段),heap(堆),stack(栈), 如下图:   1.文本段也叫代码段,是对象文件或内...

sinat_38972110的博客 5929
上一篇: 数据库修仙秘境篇四——linux锁指北
下一篇: 数据库修仙金丹篇五——vpp抓包
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值