共享内存是一个非常有意思的话题,一方面共享内存避免了通讯过程中的内存复制问题,是 Linux IPC 通讯中效率最高的一种。...从使用方式上讲,Linux 提供了三种共享内存的方式,包括 Unix 味的 POSIX 和 SysV 接口,还提供了直接文件映射内存的 mmap。...本文尝试分别介绍 Linux 共享内存的基本原理,并做一个 “违背祖宗的决定”,如何在 Golang 中使用共享内存。...Golang 是通过通讯代替共享内存的优雅代表,下文仅做试验,不建议日常使用 mmap mmap 是 POSIX 规范中的文件映射内存的方法,Linux 并提供了同名系统调用。...总结 从原理上讲 Linux 共享内存的主要方式只有两种,一是基于文件的 mmap,另一种就是 tmpfs,用一张图描述 Linux 几种实现共享内存的方式:
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。...原理 首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间 中一块大小相同的区域之间的一一对应,如图1中过程1所示...图1.内存映射原理 既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。...这个过程与内存映射无关。 如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。...图2.read系统调用原理 下面这个程序,通过read和mmap两种方法分别对硬盘上一个名为“mmap_test”的文件进行操作,文件中存有10000个整数,程序两次使用不同的方法将它们读出,加1,再写回硬盘
Linux虚拟内存布局 32位Linux系统内存划分: 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。...注意:实际上,内核完全控制着内存的使用情况,linux会在需要内存的时候,或在系统运行逐步推进时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。...2.从应用层的角度来看系统内存的使用状态 也就是linux上运行的应用程序可以使用的内存大小,即free命令第三行“(-/+ buffers/cached)”的输出,可以看到,此系统已经使用的内存才...Linux操作系统的内存运行原理,很大程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把经常使用到的文件和数据缓存在cached中,linux总是在力求缓存更多的数据和信息,这样再次需要这些数据时可以直接从内存中取...3)、如何回收cached Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。
1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息。...unsigned short shm_cpid; /* pid of creator */ unsigned short shm_lpid; /* pid of last operator */ // 当前使用该共享内存的进程数...of ptrs to frames -> SHMMAX */ // 使用该共享内存的进程信息 struct vm_area_struct *attaches; /* descriptors for...缺页中断的时候在shm_swap_in里使用。...发现这时候共享内存已经映射了物理地址。最后改写自己的页表项。因为各个进程都对应同一块内存,所以操作的时候会互相感知,实现通信。 ?
文章参考: 1、正确计算linux系统内存使用率 2、Linux系统内存消失与slab使用之谜 例如当前主机内存信息如下: 1 [zhang@test ~]$ cat /proc/meminfo...0 42 Hugepagesize: 2048 kB 43 DirectMap4k: 305140 kB 44 DirectMap2M: 50026496 kB 内存使用率计算公式...: 1 UsedMem=MemTotal-(MemFree+Buffers+Cached+SReclaimable) 2 内存使用率=UsedMem/MemTotal*100% 3 4 当前主机内存使用率...在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。...,这些小存储器区的内存称为Slab。
但有时候为了让不同进程之间进行通信,需要让不同进程共享相同的物理内存,Linux通过 共享内存 来实现这个功能。下面先来介绍一下Linux系统的共享内存的使用。 共享内存使用 1....获取共享内存 要使用共享内存,首先需要使用 shmget() 函数获取共享内存,shmget() 函数的原型如下: int shmget(key_t key, size_t size, int shmflg...共享内存使用例子 下面通过一个例子来介绍一下共享内存的使用方法。在这个例子中,有两个进程,分别为 进程A 和 进程B,进程A 创建一块共享内存,然后写入数据,进程B 获取这块共享内存并且读取其内容。...共享内存实现原理 我们先通过一幅图来了解一下共享内存的大概原理,如下图: 通过上图可知,共享内存是通过将不同进程的虚拟内存地址映射到相同的物理内存地址来实现的,下面将会介绍Linux的实现方式。...在Linux内核中,每个共享内存都由一个名为 struct shmid_kernel 的结构体来管理,而且Linux限制了系统最大能创建的共享内存为128个。
使用场景:适用于内存充足的系统,减少 Swap 的使用可以提高内存访问速度,提升系统性能。...假设应用需要 4GB 大页内存,大页大小为 2MB,则需要 2048 个大页。使用场景:适用于内存密集型应用,如数据库服务器,使用大页可以减少页表项的数量,提高内存访问速度。...使用场景:适用于需要使用大页内存的应用,如 Oracle 数据库。优化数据访问,使用缓存和缓冲区使用堆栈缓存作用:使用堆栈来明确声明内存空间,以存储需要缓存的数据。堆栈缓存可以减少动态内存分配的开销。...cgcreate 命令用于创建 cgroup,-g memory:/mygroup 参数指定创建一个内存类型的 cgroup。使用场景:适用于需要限制特定进程或组内进程的内存使用情况。...使用场景:适用于需要临时释放内存,提高系统性能的情况。
但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空 间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.../cache 所有可供应用程序使用的内存大小,free加上缓存值 第三行表示swap的使用: used 已使用 free 未使用 可用的内存=free memory buffers cached。...而Linux会充分利用这些空闲的内存,设计思想是内存空闲还不如拿来多缓存一些数据,等下次程序再次访问这些数据速度就快了,而如果程序要使用内存而系统中内存又不足时,这时不是使用交换分区,而是快速回收部分缓存...其实不然,Linux并没有吃掉你的内存,只要还未使用到交换分区,你的内存所剩无几时,你应该感到庆幸,因为Linux 缓存了大量的数据,也许下一次你就从中受益!...那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>?
/proc/meminfo used=total-(buffers+cached+free)
发表于2018-11-022019-01-01 作者 wind 第一步:创建交换文件 mkdir /data fallocate -l 4G /data/s...
查看linux系统中空闲内存/物理内存使用/剩余内存 查看系统内存有很多方法,但主要的是用top命令和free 命令 当执行top命令看到结果,要怎么看呢?...1346MB内存,还有6636MB空闲内存可以使用. ...= 总物理内存 - 实际已用内存 应用程序已用内存 = 实际已用内存 - 缓冲 - 缓存 top命令的结果详解 top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况...时间总计,单位秒 m TIME+ 进程使用的CPU时间总计,单位1/100秒 n %MEM 进程使用的物理内存 百分比 o VIRT 进程使用的虚拟内存总量,单位kb。...测量一个进程占用了多少内存,linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。
系统内存、网络带宽或者这些资源的组合)。...------------ 在 Red Hat Enterprise Linux 之前的版本中,系统管理员使用 libcgroup 软件包中的 cgconfig 指令来建立自定义 cgroup 层级。...cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。 memory 子系统,可以限制进程的 memory 使用量。...cgroups文件系统 Linux 使用了多种数据结构在内核中实现了 cgroups 的配置,关联了进程和 cgroups 节点,那么 Linux 又是如何让用户态的进程使用到 cgroups 的功能呢...cgroups使用方法 cgroups文件系统挂载 Linux中,用户可以使用mount命令挂载 cgroups 文件系统,格式为: mount -t cgroup -o subsystems name
智能指针的使用与原理 RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术...std::shared_ptr 使用 std::shared_ptr文档 shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。...中,引用计数器需要使用指针来实现; 赋值的原理: 在执行赋值的操作时,需要先对sp1的pcount进行--操作,因为此时的pcount==2,如果直接修改sp1的pcount,导致数据不匹配,因此需要先将...这样可以避免内存泄漏。 自己给自己赋值原理:只要资源一样就是自己给自己赋值,直接返回对应指针就行。...什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。
文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用...共享的 " 文件映射 " 实现的 ; 匿名映射 : " 匿名映射 “ 一般是 ” 私有映射 " , 一般不作为 " 共享内存 " 使用 , 如果两个进程之间 共享 匿名映射 , 只能是 父子进程之间
S:进程的状态,S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负 %CPU:进程占用CPU的使用 %MEM:进程使用的物理内存和总内存的百分...TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值 COMMAND:进程启动命令名称 2.free:查看系统内存使用情况 total:总计物理内存的大小...used:已使用多大 free:可用有多少 shared:多个进程共享的内存总额 buff/cached:磁盘缓存的大小 free命令主要用于显示内存数量,如下图中内容所表示 free -h 命令.../proc/meminfo列出了所有你想了解的内存的使用情况。 进程的内存使用信息也可以通过/proc//statm 和 /proc//status 来查看。...Linux服务器CPU100%问题 背景:用户反应我们系统卡顿,开始排查步骤: 1、查消耗cpu最高的进程PID。
当涉及到Linux系统性能优化的时候,物理内存是一个最重要的因素。自然的,Linux提供了丰富的选择来监测珍贵的内存资源的使用情况。...下面是一个可供选择的,但并不全面的图形或命令行工具列表,这些工具用来检查Linux平台中已用和可用的内存。 1....从可用/闲置物理内存数量到等待被写入缓存的数量或者已写回磁盘的数量,只要是你想要的关于内存使用的信息,“/proc/meminfo”应有尽有。...它同样提供了类似于top的线程(或用户)资源使用视图,因此系统管理员可以找到哪个进程或者用户导致的系统负载。内存统计报告包括了总计/闲置内存,缓存的/缓冲的内存和已提交的虚拟内存。...它同时也可以提供一个带有CPU和内存使用情况的进程视图。
下面将讲解进程间通信的另一种方式,使用共享内存。 一、什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。...有关信号量的更多内容,可以查阅我的另一篇文章: Linux进程间通信——使用信号量 二、共享内存的使得 与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似...,而且比使用信号量的接口来得简单。...shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。...五、使用共享内存的优缺点 1、优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。
在《攻克 Linux 系统编程》中,我们解释了的 ELF 文件头中指定的程序入口地址,各个节区在程序运行时的内存排布地址等,指的都是在进程虚拟空间中的地址。...操作系统中的内存管理策略将决定映射哪块真实的物理内存,供应用使用。操作系统会竭尽全力满足所有进程合法的内存访问请求。...该做法的另一结果则是降低了每个进程内存管理的复杂度,进程只需关心如何使用自己线性排列的虚拟地址,而不需关心物理内存的实际容量,以及如何使用真实的物理内存。...在 Linux 系统中,使用如下命令可查看一个运行中的进程的内存排布。 ? 稍微修改上一篇中的示例代码,在 main 函数返回之前,增加一个无限循环,保持程序一直运行。 ?...05 总结 本文深入探究了 Linux 进程在用户空间的一些内部细节,包括逻辑内存排布、进程创建和变身的内部细节、进程状态监控的目的和接口,以及终止进程的正确姿势等。
领取专属 10元无门槛券
手把手带您无忧上云