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

Linux内核编程--内存映射共享内存

一,内存映射 对于磁盘文件进程: 将一个文件或其它对象映射到进程地址空间,实现文件在磁盘的存储地址进程地址空间中一段虚拟地址的映射关系。...文件的内存映射示意图: 对于用户进程内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间内核空间可以直接高效交互...对于Client-Server架构,如果服务器进程客户端进程共享同一块存储区,服务器进程正在将数据写入共享存储区时,在写入操作完成之前,客户端进程不应去取出这些数据。...一般用信号量来同步共享内存的访问。 共享内存区在系统存储中的位置: 为什么要用共享内存: 对于涉及到内核操作的,内核进程之间,经历了四次复制操作,开销很大。

5.8K10

JVMLinux内存关系

一.简介 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。...由于SWAPGC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析这个问题,理解JVM操作系统之间的内存关系非常重要。...二.Linux与进程内存模型 JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存关系的基础。...下图给出了硬件、系统、进程三个层面的内存之间的概要关系。 从硬件上看,Linux系统的内存空间由两个部分构成:物理内存SWAP(位于磁盘)。...内核内存是Linux自身使用的内存空间,主要提供给程序调度、内存分配、连接硬件资源等程序逻辑使用。

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

Linux内核27-优化内存屏障

sti指令,可以改变eflags寄存器的IF标志); lfence、sfencemfence汇编指令,分别用来实现读内存屏障、写内存屏障读/写内存屏障; 特殊的汇编指令,比如iret指令,可以终止中断或异常处理程序...ARM系统中,使用ldrexstrex汇编指令实现内存屏障。 3. Linux内核使用的内存屏障原语 Linux内核中使用的内存屏障原语如下,如表5-6所示。...其它的内存屏障对多核系统单核系统都有效。...表5-6 Linux内存屏障 macro 描述 mb() MPUP的内存屏障 rmb() MPUP的读内存屏障 wmb() MPUP的写内存屏障 smp_mb() MP内存屏障 smp_rmb()...所以,内存屏障的使用场合就是对系统进行设置或者配置时,因为这些设置关系到后面的程序能否正确工作,所以需要内存屏障,保证程序运行之前,系统的配置已经生效。

1.3K10

Linux内核高端内存

假设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为0xc0000000 ~ 0xffffffff,那么对应的物理内存范围就为0x0 ~ 0x40000000,即只能访问1G物理内存。...Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORMALZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为0xF8000000 ~ 0xFFFFFFFF(896MB~...0x800FFFFF Linux内核高端内存的划分 内核将高端内存划分为3部分:VMALLOC_START~VMALLOC_END、KMAP_BASE~FIXADDR_STARTFIXADDR_START...64位系统用户进程最大可以访问超过512GB,内核代码可以访问所有物理内存。 4、高端内存物理地址、逻辑地址、线性地址的关系? 高端内存物理地址有关系线性地址、逻辑地址没有直接关系。...5、为什么不把所有的地址空间都分配给内核? 若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存用户进程不起冲突?

4.3K31

【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )

文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配的内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续的内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续的内存块 " : kmalloc ; 注意 该 " 物理地址连续的内存块 " 是以 Slab 为中心的...; 二、统计输出 vmalloc 分配的内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配的 " 虚拟地址连续的内存

5.1K30

Linux内核内存管理算法BuddySlab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的组成。这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...当然这对应用程序是不影响的(前面我们讲过用页表可以把不连续的物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续的内存(比如DMA, Camera, GPU都需要大块物理地址连续的内存)。...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理分配内存

3.4K73

JVMLinux内存关系--进程与JVM内存空间

2.内核内存 应用程序通常不直接内核内存打交道,内核内存由操作系统进行管理使用;不过随着Linux对性能的关注及改进,一些新的特性使得应用程序可以使 用内核内存,或者是映射到内核空间。...例如,将磁盘文件的数据发送网卡,使用普通方法NIO时,数据流动比较下图所示: 将数据在内核内存用户内存之间拷贝是比较消耗资源时间的事情,而从上图我们可以看到,通过NIO的方式减少了2次内核内存用户内存之间的数据拷贝...细心的人会发现,引言中给出两个服务器,一个SWAP最多占用了2.16g,另外一个SWAP最多占用了871m;但是,似乎我们的内存缺口没有那么大。...内存泄漏问题 另一个案例是,8g内存服务器,Linux使用800m,监控进程使用600m,堆大小设置4g;系统可用内存有2.5g左右,但是也发生了大量的SWAP占用。...根据前面的模型,Java NIO使用的内存主要分布在Linux内核内存的System区PageCache区。

2.8K21

Linux内核内存管理算法BuddySlab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的组成。这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...当然这对应用程序是不影响的(前面我们讲过用页表可以把不连续的物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续的内存(比如DMA, Camera, GPU都需要大块物理地址连续的内存)。...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理分配内存

2K30

Linux内核Page CacheBuffer Cache关系及演化历史

两层缓存各有自己的缓存目标,我好奇的是,这两者到底是什么关系。...为了降低这类低效访问,尽可能的提升磁盘访问性能,内核会在磁盘sector上构建一层缓存,他以sector的整数倍力度单位(block),缓存部分sector数据在内存中,当有数据读取请求时,他能够直接从内存中将对应数据读出...两类缓存的逻辑关系 从linux-2.6.18的内核源码来看, Page CacheBuffer Cache是一个事物的两种表现:对于一个Page而言,对上,他是某个File的一个Page Cache...此时, Page CacheBuffer Cache的关系如下图所示: Page Cache仅负责其中mmap部分的处理,而Buffer Cache实际上负责所有对磁盘的IO访问。...Linux内核源代码情景分析 [7]. 独辟蹊径品内核:Linux内核源代码导读 [8]. Linux内核的文件Cache管理机制介绍 [9]. Linux内核文件Cache机制 [10].

2K30

Linux内核Page CacheBuffer Cache关系及演化历史

为了降低这类低效访问,尽可能的提升磁盘访问性能,内核会在磁盘sector上构建一层缓存,他以sector的整数倍力度单位(block),缓存部分sector数据在内存中,当有数据读取请求时,他能够直接从内存中将对应数据读出...两类缓存的逻辑关系 从linux-2.6.18的内核源码来看, Page CacheBuffer Cache是一个事物的两种表现:对于一个Page而言,对上,他是某个File的一个Page Cache...从上面的描述我们可以看出,此时的buffer cache基于page来分配内存,但是与Page Cache完全独立,一点关系都没有。...此时,Page CacheBuffer Cache的关系如下图所示: ? Page Cache仅负责其中mmap部分的处理,而Buffer Cache实际上负责所有对磁盘的IO访问。...Linux内核源代码情景分析 [7]. 独辟蹊径品内核:Linux内核源代码导读 [8]. Linux内核的文件Cache管理机制介绍 [9]. Linux内核文件Cache机制 [10].

3.6K71

Linux 内核 VS 内存碎片 (下)

为方便大家定量分析直接内存回收内存规整为每个参与的线程带来的延迟,我在 BCC 项目中提交了两个工具:drsnoop compactsnoop,这两个工具的文档写得很详细了,但在分析时需要注意一点...,为了降低 BPF 引入的开销,这里抓取的每一次对应事件的延迟,因此申请内存的事件相比,可能存在多对一的关系,对于 3.10 这样的老内核,在一次慢速内存分配过程中会重试多少次是不确定的, 导致 oom...killer 要么太早的出场,那么太晚,导致服务器上绝大部分任务长期处于 hung up 状态。...本文同时也介绍了基于 /proc 文件系统的监控接口基于内核事件的工具,二者相辅相成,基于 /proc 的监控接口用起来简单,但存在无法定量分析采样周期过大等问题,基于内核事件的工具可以解决这些问题...虽然调大 vm.min_free_kbytes 确实会导致一些内存浪费,不过对于 256G 内存服务器来说,我们设置成 4G,也只占了 1.5%。

3.5K30

Windows内核中的内存管理

内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry...//函数体 } 其中PAGED_CODE是一个WDK中提供的一个宏,只在debug版本中生效,用于判断当前的中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核中的堆申请函数...,如果为PagedPool表示分配的是分页内存,如果是NonPagedPool表示分配的是非分页内存 NumberOfBytes:分配内存的大小,为了效率最好分配4的倍数 上面这些函数主要分为带有标记不带标记的两种..., IN SIZE_T Length ); 需要注意的是这个函数没有考虑到内存重叠的情况,假如内存发生重叠例如这样: 这个时候AC内存BD内存块有部分重叠,如果将AC拷贝到...在内核中,对于内存的读写要相当的谨慎,稍不注意就可能产生一个新漏洞或者造成系统的蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead

1.3K20

3.10内核 vs 5.4内核——内存不足场景pk

由于早期的云服务器,大量存量3.10内核作为cvm的操作系统内核。3.10内核存在着很多已知问题,其中的常客之一便是内存不足场景下,内存回收引发的问题。...内存回收OOM一直是Linux中一个饱受诟病的问题,其路径内核一直在优化,所以从理论上新版本内核一定是优于老版本。...本文通过构造用例测试,来针对3.105.4内核内存不足场景下的表现进行分析对比,以说明5.4会在内存不足的场景下有更好的表现。...【测试数据】使用两台IT5 64C 256G 100M的cvm,一台3.10 内部内核,一台TencentOS 5.4.119-19-0009,内存相关内核参数相同。...图片后话5.4相较3.10内核内存不足的场景下,更加稳定且性能更好已经可以从本文中的case分析得到一定程度上的证明,但本文中的场景也仅是抛砖引玉,3.10并非就这一个内存不足的场景有问题,总体相较5.4

2.2K20

详解Linux内核内存管理架构

内存映射空间划分 根据不同的内存使用方式使用场景需要,内核内存映射地址空间划分成多个部分,每个划分空间都有自己的起止地址、分配接口使用场景。下图是一个常见的32位地址空间划分结构。 ?...直接内存动态分配地址空间:因为访问效率等原因,内核内存采用简单的线性映射,但是因为32位CPU的寻址能力(4G大小)内核地址空间起始的设置(3G开始),会导致内核的地址空间资源不足,当内存大于1GB...在DMA zonehighmem zone中间的区域即normal zone,主要用于内核的动态内存分配。其分配通过kmalloc接口来申请。...高端内存动态分配地址空间:高端内存分配的内存是虚拟地址连续而物理地址不连续的内存,一般用于内核动态加载的模块驱动,因为内核可能运行了很久,内存页面碎片情况严重,如果要申请大的连续地址的内存页会比较困难...内存管理软件架构 内核内存管理的核心工作就是内存的分配回收管理,其内部分为2个体系:页管理对象管理。

3K42

Linux 内核 VS 内存碎片 (上)

由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存的需求来说就会变的非常困难...本文将重点描述当前常用的 3.10 版本内核在伙伴分配器的预防内存碎片的扩展,内存规整原理,如何查看碎片指数,以及如何量化内存规整带来的延迟开销等。...反碎片化没有关系,因此在本文不做详细介绍。 根据迁移类型进行分组是我们要详细介绍的反碎片方法。...,将找到的页帧号页内偏移组合起来就是物理地址。...所以当通过页表访问的物理页面通过线性映射的页面混合在一起管理时,就很容易出现内存碎片,因此内核根据页面的可移动性定义了几种迁移类型,并根据迁移类型对页面进行分组实现反碎片化。

3.4K40

【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )

文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中的函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...; ③ 硬件 : 硬件主要是指 处理器 中的 " 内存管理单元 “ , 该 内存管理单元 主要作用是 将 ” 虚拟内存地址 " 转为 " 物理内存地址 " ; " 内存管理单元 " , 英文名称是 "...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层的 " 应用程序...中的如下功能 : ① 进程调度 : 内核 调用 CPU 处理器 实现 进程调度 ; ② 内存管理 : 内核 调用 物理内存 实现 内存管理 ; ③ IPC 跨进程通信 ④ VFS 虚拟文件系统

9.5K40

ARM32 内核内存布局

Linux内核在启动时会打印出内核内存空间的布局图,下面是ARM Vexpress平台打印出来的内存空间布局图: ? 这部分信息打印是在mem_init()函数中实现的。...内核image本身占据的内存空间从_text段到 _end段,并且分为如下几个段: 代码段:_text _etext为代码段的起始结束地址,包含了编译后的内核代码。...数据段:_sdata_edata为数据段的起始结束地址,包含了大部分内核的变量; BSS段:__bss_start__bss_stop为BSS段的开始结束地址,包含初始化为0的所有静态全局变量。...一个32bit系统中实际支持的内存数量会超过内核线性映射的长度,但是内核具有对所有内存的寻找能力。...内核通常把物理内存低于760MB的称为线性映射内存(Normal Memory),而高于760MB以上的称为高端内存(High Memory)。

1.5K20
领券