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

Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构源码分析 | zone 结构源码 )

文章目录 一、内存区域 zone 简介 二、zone 结构源码分析 1、watermark 成员 2、lowmem_reserve 成员 3、zone_pgdat 成员 4、pageset 成员 5...内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 内存页 Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 "...; 一、内存区域 zone 简介 ---- " 内存节点 " 是内存管理的 最顶层结构 , " 内存节点 " 再向下划分 , 就是 " 内存区域 " zone , " 内存区域 " 在 Linux 内核中使用...struct zone 结构类型进行描述 , zone 枚举定义在 Linux 内核源码的 linux-4.12\include\linux\mmzone.h#350 位置 ; 每个 " 内存区域..." , 都使用 1 个 zone 结构 描述 ; 二、zone 结构源码分析 ---- 1、watermark 成员 watermark 表示 " 页分配器 " 使用的 水线 ; /* zone

4.5K30

Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构 | 内存节点描述 | 内存节点 pglist_data 结构 | pglist_data 结构源码 )

文章目录 一、内存节点描述 二、内存节点 pglist_data 结构 三、pglist_data 结构源码 内存管理系统 3 级结构 : ① 节点 Node , ② 区域 Zone , ③ 页...Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 " ; 一、内存节点描述 ---- Linux 内核中 , 内存节点 ( Node ) 是 " 内存管理...物理地址连续 的内存块 是一个 " 内存节点 " ; 二、内存节点 pglist_data 结构 ---- Linux 内核中 , 使用 pglist_data 结构 描述 " 内存节点 " , 该结构定义在...Linux 内核源码中的 linux-4.12\include\linux\mmzone.h#601 位置 ; 其中 : node_zones 是 内存区域数组 ; struct zone node_zones...---- Linux 内核中 , 使用 pglist_data 结构 描述 " 内存节点 " , 该结构定义在 Linux 内核源码中的 linux-4.12\include\linux\mmzone.h

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

    Postgresql进程内存结构

    进程 进程结构 Postgresql使用多进程架构实现(Mysql为多线程),PG启动时会拉起守护进程,然后由守护进程fork相关的后台辅助进程。...例如服务端启动后,我们可以看到这样的进程结构: /disk1/p01/pgsql8400/bin/postgres \_ postgres: logger process \_ postgres: checkpointer...SysLoggerPID = SysLogger_Start(); ... pgstat_init(); ... status = ServerLoop(); ... } 内存 内存结构 PG使用进程架构...为什么TOP观察PG占用内存非常多 TOP命令获取的PG进程内存通常是很高的,所有PG进程加起来可能比计算机实际内存还要高。...原因是每个进程都会统计占用共享内存的大小,而PG是大量使用共享内存的,而且这类工具一般统计共享内存进程整个生命周期中使用的所有共享内存页面数量,这样看起来很像内存泄漏,实际上是没有问题的。

    83230

    C语言——结构类型(二)【结构内存对齐,结构数组】

    猜测:两个结构里面都是两个char,一个int,那他们的内存大小应该一样吧 但是,输出结果 很显然,尽管这两个结构变量的成员差不多,但是这两个结构变量的大小却不一样。...这就是因为结构类型的变量在开辟内存的时候,要遵循结构内存对齐,只有对齐到符合的地址处时,才会开始为成员分配内存 在了解如何对齐前,我们先来了解对齐数这个概念 ① 一个变量的对齐数 = 编译器默认的对齐数...与 该成员变量大小之间的较小值 ②如果嵌套了结构类型的成员,则这个成员的对齐数就是 这个嵌套的结构的自身成员中的最大对齐数 ●VS中默认的对齐数是8 ●Linux中gcc没有默认对齐数(即对齐数就是成员变量的自身大小...) 接下来我们就来介绍一下结构内存对齐的规则: 1,结构的第一个成员对齐到与结构变量起始位置的偏移量为0的地址处(简单来说就是第一个成员变量的内存从起始位置开始分配) 2,其他成员变量要对齐到...birthday的对齐数 2,birthday成员的大小,birthday也是一个结构,也要用结构内存对齐的方式来计算大小 具体分配如下: 二,结构数组 1,什么是结构数组 结构数组,

    41510

    结构内存对齐规则

    1.结构内存对齐规则 1.第一个成员在与结构变量偏移量为0的地址处。 2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处。...4.如果嵌套了结构的情况,嵌套的结构对齐到自己的最大对齐数的整数倍处,结构的整体大小就是所有最大对齐数(含嵌套结构的对齐数)的整数倍。...2.例子 1、例一 2、例二 3.为什么存在内存对齐 参考了大部分资料,大部分都这么说: 1.平台原因(移植问题): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据...2.性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。...总的来说: 结构内存对齐是拿空间来换取时间的做法 既然这样,那在设计结构的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。

    47210

    linux进程内存布局

    堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。...当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量...从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。 当程序在执行时动态分配空间(C中的malloc函数),所分配的空间就属于heap。其概念与数据结构中“堆”的概念不同。...分配效率:栈是机器系统提供的数据结构,计算机会在底层分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高; 堆则是 C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存...,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,然后进行返回

    3.1K41

    Oracle进程内存结构-如何察看Oracle进程消耗的内存

    Oracle进程内存结构-如何察看Oracle进程消耗的内存 Last Updated: Sunday, 2004-11-28 11:12 Eygle 经常有人问到如何在Unix下确定进程消耗的内存资源...实际上是Top输出显示的Oracle进程内存使用,包含了SGA部分。这也是SGA的意义所在。 SGA可以被共享,可以被所有进程所访问,在进程的寻址空间里就包含了SGA的大小。...至于如何更为精确的确定进程内存消耗,本文简要介绍如下(在QuickIO下,你可能无法看到本文描述情况): 1.系统平台及数据库版本 $ uname -a SunOS billing 5.8 Generic...:00 0 0.00% ksh 23498 oracle 1 58 0 323M 278M sleep 0:00 0 0.00% oracle 3.Pmap输出及进程内存计算...: 337360K - 266240K = 71,120k 这就是一个进程所消耗的内存. 4.用户进程内存使用举例 $ ps -ef|grep LOCAL oracle 10080 9872

    3.3K30

    C语言如何计算结构大小(结构内存对齐)

    前言: 结构内存对齐是有关结构体内容的很重要一个知识点,主要考察方式是计算结构的字节大小。...引言: 当我们对计算结构一无所知,我们不妨自己思索如何计算,是不是直接计算结构成员变量占用内存的大小呢?...一、计算偏移量 我们要研究明白结构的成员列表在内存中到底是如何存储的,首先要知道结构的各个成员变量在内存中相较于起始位置的偏移量。...结构到底如何计算? 二、结构的对齐规则 我们经过上面的分析,发现结构成员不是按照顺序在内存中连续存放的,而是有一定的对齐规则,接下来我们就研究结构内存规则。...原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 总体来说 结构内存对齐,就是让空间换时间。

    10210

    windows驱动开发-进程结构初探

    目录 内核结构 进程结构 字段 以及简单的应用 一丶进程结构 1.1 简介 1.2 KPROCESS 结构 1.3 EPROCESS 内核结构 进程结构 字段 以及简单的应用 一丶进程结构 1.1...我们可以使用 windbg 加载好符号之后 使用 dt _EPROCESS 来查看这个结构 这里我之所以讲下字段是因为在每个系统中进程结构中偏移中记录的成员变量可能会有差异。...首先 EPROCESS的第一个成员是 KPROCESS 所以我们先说下 KPROCESS代表的是啥 1.2 KPROCESS 结构 请注意这里只说下重要结构,且操作系统内核中的结构是随着系统改变的。...熟悉了此结构可以实现 自定义的 内存读写函数 自己实现 ReadProcessMemory 以及 WriteProcessMemory 第二个就是Affinity 可以使用内核函数设置当前线程在那个CPU...看下结构 在我调试的Windows10 1909上面结构成员偏移已经突破了 0x800了 所以暂时没在我认知能力中的成员以及不重要的成员都会删除 nt!

    91540

    Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构 | mm_struct 结构中的 start_brk、brk 成员 )

    文章目录 一、堆内存管理 二、内存描述符 mm_struct 结构 三、mm_struct 结构中的 start_brk、brk 成员 一、堆内存管理 ---- Linux 操作系统中的 " 堆内存...Linux 内核实现 , 开发者 不知道 堆的管理细节 , 只通过 " 系统调用 " 调用相关函数 ; " brk 系统调用 " 负责 扩展 和 收缩 堆内存 ; 在 " 内存描述符结构 " mm_struct...结构中 , start_brk 是 " 堆内存 “ 在 ” 虚拟地址空间 " 中的 起始地址 , brk 是 " 堆内存 " 在 " 虚拟地址空间 " 中的 结束地址 , 二、内存描述符 mm_struct...结构 ---- mm_struct 结构 定义在 Linux 内核源码 include\linux\mm_types.h#375 源码中 ; mm_struct 结构 源码 : struct mm_struct...-5.6.18\include\linux\mm_types.h#375 三、mm_struct 结构中的 start_brk、brk 成员 ---- mm_struct 结构中的 start_brk

    93131

    Oracle内存结构和后台进程

    Oracle实例=内存+后台进程 Oracle数据库=实例+物理存储结构 由上图可知Oracle实例(一个Instance)由内存结构和程序结构组成,内存结构主要是SGA,程序结构主要是后台进程。...内存 数据查询的速度 更好的提升数据处理的速度 后台进程 为了完成特定的任务的服务进程 数据文件 数据的永久性保存 也是数据库性能下降的主要原因 实例之内存结构 System global area(SGA...) SGA区包括Oracle实例需要的一系列内存组件,用于存放数据信息和数据控制信息,这些内存信息被所有进程所共享。...Streams pool 里面存放着流相关的信息,比如流队列,其中也会流复制中capture进程提供进程内存空间。...可以理解为操作系统在一个进程启动时,为他分配的内存空间,是一个操作系统含义上的内存区。

    1.1K20

    Linux 内核】进程管理 task_struct 结构 ① ( task_struct 结构引入 | task_struct 代码示例 )

    文章目录 一、task_struct 结构 二、task_struct 结构代码示例 一、task_struct 结构 ---- 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象为..." 进程控制块 " , 英文全称 " Progress Control Block " , 简称 PCB ; 在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构...进行描述的 ; Linux 内核中 , 所有 进程管理 相关算法逻辑 , 都是基于 task_struct 结构的 ; task_struct 结构linux-5.6.18\include\linux...\sched.h 头文件中定义 , 第 629 ~ 1300 行就是 struct task_struct 结构定义的代码 ; 二、task_struct 结构代码示例 ---- struct..._*, siglock protected: */ unsigned long jobctl; /* Used for emulating ABI behavior of previous Linux

    3.5K30

    Linux进程内存管理(二)

    分配内存 层级结构 jemalloc 的内存管理采用层级结构,分别是 tcache(线程缓存),arena(分配区)和系统内存(system memory)。...jemalloc 的层级结构 回收内存 内存回收的逻辑和内存分配的逻辑刚好相反。 small object 和 large object 回收的时候,先放回 tcache。...相关系统调用 接下来,介绍一下内存分配器相关的系统调用: brk/sbrk mmap 在介绍这几个系统调用之前,需要先对进程内存布局有所认识。 ?...64位进程内存布局 上图是一个 Linux 64位进程的地址空间布局的简图,jemalloc 能管理的就是 Heap 和 Memory map 两块的内存。 Text,存储程序的二进制代码。...参考文档 jemalloc Linux manpage jemalloc源码解析-内存管理

    2.9K40

    Linux进程内存管理

    几个关键的数据结构 一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_structs。...mm_struct结构描述了一个进程的整个虚拟地址空间,vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。...mm_struct *mm,unsigned long addr); unsigned long mmap_base; unsigned long task_size; //拥有该结构进程的虚拟地址空间的大小...vm_area_struct 数据结构来管理,包括虚拟内存的起始和结束地址,以及内存的访问权限等,通常命名为vma;vm_area_struct 数据结构的定义如下: ?...序列化*/ struct anon_vma *anon_vma; /* Serialized by page_table_lock 由page_table_lock序列化*/ /* 用于处理此结构的函数指针

    3.3K21

    Linux进程通信——共享内存

    首先先在物理内存中申请一块内存。 然后讲这块内存通过页表映射分别映射到这两个进程的虚拟地址空间内,让这两个进程都能看到这块内存。...其中一个进程创建共享内存,这块区域中有key值,只要另一个进程也看到同一个key就说明能看到同一块内存。 那么怎么找到key 的位置呢?就在共享内存中的数据结构中。...第三个参数是代表要第二个参数的结构有多少个,假如说之前申请了10个信号量,那么这里填写10,然后就可以写一个第二个参数类型的数组里面有10个这种类型的数据,对这10个信号量集合做PV操作。...因为,结构第一个成员的地址是和这个结构对象本身的地址是相同的。...也就是说如果未来想访问共享内存的数据结构,直接将perms数组中第一个元素取出来,然后强制转换成共享内存数据结构的构造就可以了! C++多态就是通过这个思维创建出来的!

    5.8K30

    Linux进程描述符task_struct结构详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构来管理进程,这个结构包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中。...谈到task_struct结构,可以说她是linux内核源码中最复杂的一个结构了,成员之多,占用内存之大。 进程状态 /* * Task state bitmask. NOTE!...进程内核栈 void *stack; 内核栈与线程描述符 对每个进程Linux内核都把两个不同的数据结构紧凑的存放在一个单独为进程分配的内存区域中; 一个是内核态的进程堆栈 另一个是紧挨着进程描述符的小数据结构...需要注意的是,内核态堆栈仅用于内核例程,Linux内核另外为中断提供了单独的硬中断栈和软中断栈 下图中显示了在物理内存中存放两种数据结构的方式。...内核栈数据结构描述thread_info和thread_union thread_info是体系结构相关的,结构的定义在thread_info.h中 Linux内核中使用一个联合体来表示一个进程的线程描述符和内核栈

    2.3K20
    领券