作者:达菲格 来源:简书 介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。...虚拟内存 虚拟内存的出现,很好的为了解决上述的一些列问题。用户程序只能使用虚拟的内存地址来获取数据,系统会将这个虚拟地址翻译成实际的物理地址。...这样程序在访问内存时,操作系统看访问的地址是否能转换成物理内存地址。能则正常访问,不能则再开辟。这使得内存得到了更高效的利用。...虚拟地址翻译 虚拟内存的实现方式,大多数都是通过页表来实现的。操作系统虚拟内存空间分成一页一页的来管理,每页的大小为 4K (当然这是可以配置的,不同操作系统不一样)。...那最终编译出来的二进制文件,是如何被操作系统加载到内存中并执行的呢? 其实,操作系统已经将一整块内存划分好了区域,每个区域用来做不同的事情。如图: ?
基本思想:是把内存划分成若干个连续的区域,称为分区,每个分区装入一个运行程序。 固定分区 基本思想 固定分区是指系统先把内存划分为若干个大小固定的分区,一旦分配好,在系统运行期间便不再重新划分。...系统初次启动后,在内存中出操作系统区之外,其余空间为一个完整的大空闲区,当有程序要求装入内存运行时,系统从该空闲区中划分出一块与程序大小相同的区域进行分配。...当系统运行一段时间后,随一系列的内存分配与回收,原来的一整块大空闲区形成了若干占用区和空闲区相间的布局,若有上下相邻的两块空闲区,系统应将他们合并成为一块连续的大空闲区。...提高内存的利用率,便于作业动态扩充内存。采用移动技术需要注意以下问题: 移动技术会增加系统的开销。增大了系统运行时间。 移动是由条件的,不是任何在内存中的作业都能随时移动。...通过分区管理,内存真正成了共享资源,有效地利用了处理机和I/O设备,从而提高了系统的吞吐量和缩短了周转时间。在内存利用率方面,可变分区的内存利用率比固定分区高。
查看linux系统中空闲内存/物理内存使用/剩余内存 查看系统内存有很多方法,但主要的是用top命令和free 命令 当执行top命令看到结果,要怎么看呢?...= 总物理内存 - 实际已用内存 应用程序已用内存 = 实际已用内存 - 缓冲 - 缓存 top命令的结果详解 top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况...其内容如下: 01:06:48 当前时间 up 1:22 系统运行 时间,格式为时:分 1 user 当前登录用户 数 load average: 0.06, 0.60, 0.48... 系统负载 ,即任务队列的平均长度。 ...可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。
内存子系统 虚拟内存 swap 内存页(page) page in , page out <--- paging(内存分页) # free -...116 54912 7288 1612464 0 0 116 54912 7288 1612468 0 0 si 从swap分区读取到内存...so 把内存中的数据写到swap bi 从块设备读取数据到内存 bo 把内存上数据写回硬盘 slabtop 查看主页面故障,次页面故障 # /usr/bin/time -...: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 主页面故障: 当程序执行的时候,如果需要数据在内存中没有...,就会产生主页面故障 次页面故障: 当程序执行的时候,需要的数据直接在内存中得到,就会产生页面故障 内核调度和自身调优:就是不断减少主页面故障,增加次页面故障 查看内存分页情况 # yum install
相比于多次分配离散的物理页面,分配连续的物理页面有利于提高系统内存的碎片化,内存碎片化是一个很让人头疼的问题。...for_each_zone_zonelist_nodemask宏扫描内存节点中的zonelist去查找合适分配内存的zone。...update totalreserve_pages */ calculate_totalreserve_pages(); } 计算watermark水位用到min_free_kbytes这个值,它是在系统启动时通过系统空闲页面的数量计算的...因为在系统启动时,空闲页面会尽可能分配到MAX_ORDER-1的链表中,这个可以在系统刚起来之后,通过'cat /proc/pagetypeinfo'命令可以看出端倪。...因为通常摘下来的内存块会比需要的内存大,切完之后需要把剩下来的内存块重新放回伙伴系统中。 expand()函数就是实现“切蛋糕”的功能。
逻辑地址 现代操作系统都采用的是逻辑地址,即我们在程序中定义的地址都是逻辑上的并不是真正的物理地址,原因是因为在多道程序中是不能确定到程序运行后的物理地址的,有可能被其他程序占用,有可能会动态的改变其地址...静态重定位 将整个程序在编译的时候产生逻辑地址,然后在装入的时候直接由系统分配对应的物理地址,此时只会找到没有被占用的地址,但是此时同样也是将整个程序全部装入到内存中,占用内存较大,可能程序中某一部分地址是不会执行的...内存保护 为了安全,当程序装入到内存后,实际上每一个进程只能访问自己对应的地址空间范围,而不能访问其他程序的地址空间,所以操作系统实现方式如下。...,然后需要那些数据再加载到内存,而如果内存不够用,那么就将内存中的一部分进程唤出即挂起,然后将其对应的内存进行释放,此时就能够腾出内存使用,被挂起的进程的pcb依然在内存中,这是为了方便后面一旦使用到此程序的时候需要通过...根据时间局部性原理和空间局部性原理,一个指令如果当前时间被访问很有可能会被继续访问例如可能循环语句,而空间局部性则是如果一个相邻的地址被访问,那么相邻的地址很有可能马上会被访问,如数组,所以一般操作系统会在
在做Linux系统优化的时候,物理内存是其中最重要的一方面。自然的,Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况。...下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法。 1. /proc/meminfo 查看RAM使用情况最简单的方法是通过/proc/meminfo。...1$ cat /proc/m12. vmstat vmstat命令显示实时的和平均的统计,覆盖CPU、内存、I/O等内容。例如内存情况,不仅显示物理内存,也统计虚拟内存。...它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注。...1$ memstat -p image.png 8. nmon nmon是一个基于ncurses的系统基准测试工具,它可以监控CPU、内存、I/O、文件系统及网络资源等的互动模式。
一、内存管理概述 创建进程首先要将程序和数据装入内存中。...非连续的方式又分为两种: 分页存储管理; 基本分页存储管理方式:一次性的将所有的页面装入内存; 请求分页存储管理方式:动态的将页面装入内存中; 分段存储管理; 这是整个内存管理的重点,所以单独成章讲解...这部分内容经常会考察关于时间的计算,下面是一个例题: 假设一个页式存储系统具有快表,多数活动页表项都可以存在其中。...已知系统为 32 位实地址,采用 48 位虚拟地址,页面大小为 4KB ,页表项大小为 8B 。 1、假设系统使用纯页式存储,则要采用多少级页表?页内偏移多少位?...2、假设系统采用一级页表,TLB 命中率为 98%,TLB访问时间为 10ns ,内存访问时间为 100ns ,并假设当 TLB 访问失败时才开始访问内存,问平均页面访问时间是多少 ?
meminfo') as fd: 和 fd=open('/proc/meminfo') 执行的结果一样,都是遍历文件;前者只有在Python 2.6 及后版本才有,后者当打开的文件达到几个G的时候,很消耗内存
伙伴系统是常用的内存分配算法,linux内核的底层页分配算法就是伙伴系统,伙伴系统的优点就是分配和回收速度快,减少外部碎片。...,第二个版本是保存当前内存最大的连续可用数,在某些情况下避免了无效的遍历,第二个版本也可以修改为保存最大连续内存数目的阶,内存消耗就会变小。...这两个算法分配和回收复杂度都是logn,并且空闲内存必须是2^n个基本分配单位。 ...linux对内存进行了分区包括低端内存区,高端内存区,dma区,而且还对numa架构做了很多处理,对页面也进行了分类,这些不是讨论的重点,现在主要是提取linux的buddy算法,只提取核心部分,可以在控制台下运行...buddy system的数据结构就是下图所示,看着像哈希表中的拉链法,每个链表保存相同大小的内存块。最大的是10,也就是1024个基本单位,所以linux在x86下一次最多可分配4MB内存。
共享内存的实现共享内存的原理,大致是多个进程映射同一块内存,这样其中一个进程对这块内存读写时,另外的进程就能感知到,从而实现了共享内存的目的。...大概是下面的样步骤:在某处申请一块内存区域mem,获取与之对应的fd进程A通过mmap将fd映射至本进程某块内存区域进程B通过mmap将fd映射至本进程某块内存区域进程A、进程B对于映射至本进程的内存区域的读写...,对方进程均可以看到,因此实现了进程间共享内存从内存映射角度看,大概是下面这样子:Android中由MemoryHeapBase和MemoryBase共同实现了共享内存。...接下来将结合Android音频系统中的AudioTrack来说明。...到目前为止,仅仅是服务端完成了匿名内存的申请和映射,客户端并没有完成映射。带着这个问题,让我们一起看一下客户端是如何完成内存映射的。
3.连续分配内存 内存通常分为两个区域,分别驻留操作系统和用户进程。由于中断向量通常位于低内存,操作系统也放在低内存。...3.2内存分配 最为简单的内存分配方法是MFT,即将内存分为多个固定大小的分区,一个分区容纳一个进程。MFT已不再使用,MVT是他的推广,主用用于批处理系统。 ...在可变分区方案里,系统中有一个表用来记录那些内存占用还是未占用。当有新进程需要内存时,为该内存寻找足够大的孔,从这个孔中为该进程分配所需的内存,孔内未分配的内存可为其他进程所用。...最近的设计是通过将硬件和系统相配合来实现分页的。 进程需要在内存中以便运行,不过进程可以暂时从内存中交换到备份存储,当需要再次执行时再调回到内存中。...5.页表结构 5.1层次页表 大多数计算机系统支持大逻辑地址空间(2的32到64的幂)。这种情况下,页表本身非常大。我们并不可能在内存中连续的分配这个表。
很多小伙伴对swap分区(内存数据换入换出)这个名词可能不陌生,有了这个技术,系统才能实现承载计算机内存总量的多进程运行。...操作系统会把暂时不用的内存数据写到磁盘等其他存储中,以此来释放更多的内存空间执行当前需要更多内存的进程。...但是换入换出过度频繁时虽然可能不发生进程申请不到内存而导致失败的问题,但却在一定程度上降低了进程执行的效率,毕竟内存与磁盘读写速度相差几个数量级,那么是否有其他技术能解决内存数据换入换出速度过慢的问题。...这就是本文要提到的内存压缩技术,为了节约内存资源,操作系统引入了内存压缩技术对内存数据进行压缩,内存压缩不是上来就直接进行的,因为虽然是纯内存操作,但是也涉及数据的压缩解压缩问题,也会占用CPU算力,所以内存充足的情况下一般不会进行内存压缩...上图展示的是linux系统用到的zswap内存压缩技术,如上图所示,zswap延迟了内存换入换出的频率,为换页过程提供了缓存区,从而可以通过批量操作磁盘来降低单次读写磁盘的低效问题。
引言 内存管理无疑是操作系统最重要的工作之一,本文我们就来详细介绍一下操作系统是如何管理内存的,分段、分页机制又是什么,线性地址、逻辑地址、物理地址、虚拟地址分别指的又是什么。 2....分页机制 一旦置位了 CPU 中 CR0 寄存器的最高位而启动了分页机制,我们得到的线性地址就需要通过 MMU(内存管理单元)进行分页机制才能转换成物理内存上的物理地址。...,让需求近于无限内存的软件可以在有限的内存环境下使用,于是有了将内存分块,并且将暂时不用的块放到磁盘上的分页机制,同时这个过程对于程序开发人员来说是完全透明的。...在 32 位系统中,一般使用二级页表,一级页表称为页目录表,页目录表的每个目录项占用 4 字节,共计 1024 个目录项,所以占用 4KB 内存,而每个页面恰好是 4KB,所以整个页目录表占用一个页面,...同时,二级页表每个表项也是 4 字节,共计 1024 个表项,所以也占用一个页面,即 4KB 内存,这样,总计可以寻址 102410244KB = 4GB 内存,恰好是 32 位操作系统的线性地址空间大小
虚拟内存虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。...这样,进程可以以一种透明的方式访问内存,无需关心内存的实际物理位置。通过虚拟内存机制,操作系统能够更好地管理系统内存资源,提供更高的安全性和稳定性。...由于硬盘访问速度较慢,每次内存交换都需要将大段连续的内存数据写入硬盘。因此,如果交换的是占用大量内存空间的程序,整个系统会变得卡顿。为了解决内存分段的碎片和提高内存交换效率,引入了内存分页机制。...32位系统中,内核空间占用1G,剩下的3G是用户空间;64位系统中,内核空间和用户空间都是128T,分别占据内存空间的最高和最低处。...虚拟内存的使用使得每个进程都可以拥有相同的虚拟地址空间,而不用担心与其他进程的地址冲突。通过虚拟内存机制,操作系统能够更好地管理系统内存资源,提供更高的安全性和稳定性。
内存管理总览 系统调用 Linux内核把用户空间分为两部分:用户空间和内核空间。...伙伴系统 页面分配器是以页框为单位的。典型的页面分配器就是伙伴系统。伙伴系统是一个结合了2的方幂个分配器和空闲缓冲区合并计技术的内存分配方案, 其基本思想很简单。...当系统内存短缺的时候,系统需要换出一部分内存。这部分内存通常是page cache 或者匿名页面。...内存规整 memory compaction,内存规整模块是为了缓解内存碎片化的,系统运行的时间越长,就越容易产生内存碎片,系统此时想分配连续的大块内存就变得越来越难。...OOM 在经过内存规整,页面迁移等操作后,如果系统还不能分配出系统需要的页面,Linux就要使用最后一招了,杀敌一千,自损八百,OOM killer会找一些占用内存比较多的进程杀掉来释放内存。
以下主要讲述进程到内存的映射 1.内存管理发展历程 1.1单进程DOS时代 DOS时代 - 同一时间只能有一个进程在运行,单进程 windows9x开始,多个进程可以装入内存 引发问题: 内存撑爆...1.2 内存管理 为了解决上面说的问题,引入现在的内存管理系统:使用虚拟地址、分页装入、软硬件结合寻址。...1.2.1 解决内存撑爆 将内存分页(内存不够用),内存中分成固定大小的页框(4K),把程序(硬盘上)分成4K大小的块,用到哪一块,加载那一块,加载的过程中,如果内存已经满了,会把最不常用的一块放到swap...虚拟空间大小:看寻址空间 - 64位系统 2 ^ 64,32位系统2^32 (表达有2^32个不同的内存地址),而每个地址可以存放8bit的数据,即单位是byte 站在虚拟空间的角度,进程是独享整个系统...通过下图再深入了解 P1,P2,P3,P4 4个进程都认为自己是独占整个内核的,实际上是共享操作系统内核。 MMU给每一个进程分配他们的内存资源。
操作系统内存换出---15 有换入,就应该有换出!...,并且请求调页的对内存的高效利用体现也就不明显了,甚至他额外带来的开销会更加影响系统运行。...如果给一个进程分配的页框过少,那么会导致进程在运行时缺页率升高,调页频繁,导致系统性能严重受损,毕竟读磁盘可是很慢的。...如果此时内存中的没有空闲页了,那么就需要利用clock算法换出一个页到磁盘中去 (换出) 实现换入换出是为了支持虚拟内存,而实现虚拟内存是为了支持段页结合,实现段页是为了实现操作系统对内存的高效管理...操作系统高效管理了内存,就可以让程序载入进内存后可以执行起来,程序执行起来后就成为了一个进程。 因此,操作系统本质是以进程带动的,多进程推进的,同时内存有效工作的一张图
前言 内存管理是操作系统中经典的话题。小型嵌入式系统一次只需要执行一个任务,对内存管理没有要求。现代的操作系统通常要同时执行多个进程,多个进程所占用的内存之和通常超出物理内存的容量大小。...本文所介绍的主要是: 操作系统为何实现物理内存的抽象? 操作系统如何给进程分配内存空间? 操作系统为何要引入虚拟内存这个概念? 操作系统的虚拟内存为什么以及如何进行分页?...操作系统的虚拟内存中常见的页面置换技术有哪些? 操作系统如何在内存紧张的时候通过交换(置换)合理的协调多个进程所占用的虚拟内存?...在动态分配内存时,操作系统必须对其进行管理,操作系统需要知道哪些内存在使用,哪些内存未使用(可以再次被分配)。...看完本文,我们可以知道,现代操作系统中,无论是PC端桌面系统,还是移动端手机系统,开发者所谈论的内存通常是指“虚拟内存”。
相伴的systemd-journal cpu和内存占用也很高。 systemd-journal 使用了持久化模式。其中一个服务1秒钟内打非常多的日志。一天好几个G。
领取专属 10元无门槛券
手把手带您无忧上云