首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    细说|Linux Out Of Memory机制

    Linux 内核发现系统中的物理内存不足时,首先会对系统中的可回收内存进行回收,能够被回收的内存有如下: 读写文件时的页缓存。 为了性能而延迟释放的空闲 slab 内存页。...由于在 Linux 系统中,进程申请的都是虚拟内存地址。所以当程序调用 malloc() 申请内存时,如果虚拟内存空间足够的话,是不会触发 OOM 机制的。...如果通过上面的手段还不能解决内存不足的情况,那么内核将会调用 pagefault_out_of_memory() 函数来杀掉系统中占用物理内存最多的进程。...我们来看看 pagefault_out_of_memory() 函数的实现: void pagefault_out_of_memory(void) { ......out_of_memory(NULL, 0, 0, NULL, false); ... } 可以看出,pagefault_out_of_memory() 函数最终会调用 out_of_memory

    2.8K20

    启动优化(一)

    所以为了节省映射表,它也不可能以字节为单位,实际上,映射表是以页为单位的,在Linux、MacOS上一页是4KB ,在iOS上一页是16KB。这也是为什么映射表也被称为页面。 ?...在虚拟内存里面,如果使用的函数等还没有加载进物理内存,系统就会发出缺页中断(pageFault),而pageFault是需要消耗时间的,每一页的耗时有很大的差距,少则0.1毫秒,多则1毫秒。...在程序执行的时候,用户使用过程中,几毫秒实际上用户是感知不到的;但是在应用启动的时候,会有大量代码需要执行,此时会有数量众多的pageFault,这样一累计,用户就可以感知到了。...所以说,我们的优化思路就是尽量减少pageFault。 ?...此时,在启动的时候就需要3次pageFault,这实际上是很不划算的,我们需要做的是,将所有的启动代码都放到前面,这样就可以减少pageFault的数量,进而减少启动时间。

    94441

    启动优化(二)——二进制重排

    分页管理有一个特点,当加载新的一块功能的时候,对应的某一页数据不在物理内存的时候,系统会缺页中断pageFault,而pageFault是需要时间的,用户在使用过程中,几毫秒实际上用户是感知不到的;但是在应用启动的时候...,会有大量代码需要执行,此时会有数量众多的pageFault,这样一累计,用户就可以感知到了。...今天要研究的,就是通过一项技术来减少启动时的pageFault,进而缩减启动时间,这个技术就是二进制重排。...接下来我们就来看看如何去获取pageFault的次数。 测量PageFault次数 打开Instruments工具集,找到System Trace: ?...二进制重排步骤初体验 上面我们了解了如何去测量启动阶段pageFault的次数,接下来就来初步体验一下二进制重排。

    1.8K51

    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...struct callback_head numa_work; /* * This pointer is only modified for current in syscall and * pagefault...sequential_io_avg; #endif #ifdef CONFIG_DEBUG_ATOMIC_SLEEP unsigned long task_state_change; #endif int pagefault_disabled

    3.4K30

    一文读懂 HugePages(大内存页)的原理

    在介绍 HugePages 之前,我们先来回顾一下 Linux 下 虚拟内存 与 物理内存 之间的关系。...一、内存映射 我们来看看在 64 位的 Linux 系统中(英特尔 x64 CPU),虚拟内存地址转换成物理内存地址的过程,如图2: 从图2可以看出,Linux 只使用了 64 位虚拟内存地址的前 48...减少 PageFault(缺页中断)的次数。 Tips:TLB 是一块高速缓存,TLB 缓存虚拟内存地址与其映射的物理内存地址。...使用大于 4KB 的内存页作为内存映射单位的机制叫 HugePages,目前 Linux 常用的 HugePages 大小为 2MB 和 1GB,我们以 2MB 大小的内存页作为例子。...比如调用 fork 系统调用创建子进程时,内核使用了 写时复制 的技术(可参考《Linux 写时复制机制原理》一文),在父子进程内存发生改变时,需要复制更大的内存页,从而影响性能。

    1.1K20

    一文读懂 HugePages(大内存页)的原理

    在介绍 HugePages 之前,我们先来回顾一下 Linux 下 虚拟内存 与 物理内存 之间的关系。...一、内存映射 我们来看看在 64 位的 Linux 系统中(英特尔 x64 CPU),虚拟内存地址转换成物理内存地址的过程,如图2: ?...从图2可以看出,Linux 只使用了 64 位虚拟内存地址的前 48 位(0 ~ 47位),并且 Linux 把这 48 位虚拟内存地址分为 5 个部分,如下: PGD索引:39 ~ 47 位(共9个位...减少 PageFault(缺页中断)的次数。 Tips:TLB 是一块高速缓存,TLB 缓存虚拟内存地址与其映射的物理内存地址。MMU 首先从 TLB 查找内存映射的关系,如果找到就不用回溯查找页表。...比如调用 fork 系统调用创建子进程时,内核使用了 写时复制 的技术(可参考《Linux 写时复制机制原理》一文),在父子进程内存发生改变时,需要复制更大的内存页,从而影响性能。

    5.6K20

    Linux的进程线程及调度

    本文为宋宝华《Linux的进程、线程以及调度》学习笔记。 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位。 线程:调度单位。...Linux中的PCB是task_struct结构体。 ?...2 进程线程的实现本质 Linux调度器实际是识别task_struct进行调度。...) 在fork之后,父子进程看到的内存区虚拟地址相同,物理地址也相同,父子进程使用的其实是同一片物理内存,未发生内存拷贝,操作系统会将此内存区权限改为RO; 3) 父或子进程对内存区执行写操作将触发PageFault...Linux同一进程的多线程,在内核视角实际上每个线程都有一个PID,但在用户空间需要getpid返回唯一值,Linux使用了一个小技巧,引入了TGID的概念,getpid()返回的的TGID值。

    4.1K41
    领券