内存管理
文章平均质量分 94
内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。一个执行中的程式,譬如网页浏览器在个人电脑或是图灵机(Turing machine)里面,为一个行程将资料转换于真实世界及电脑内存之间,然后将资料存于电脑内存内部(在计
简说Linux内核
这个作者很懒,什么都没留下…
展开
-
解密Linux内核神器:内存屏障的秘密功效与应用方法
现在大多数现代计算机为了提高性能而采取乱序执行,这可能会导致程序运行不符合我们预期,内存屏障就是一类同步屏障指令,是CPU或者编译器在对内存随机访问的操作中的一个同步点,只有在此点之前的所有读写操作都执行后才可以执行此点之后的操作。内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。原创 2023-06-30 21:46:12 · 359 阅读 · 0 评论 -
Linux内核的虚拟内存(MMU、页表结构)
如果不在,则意味着该虚存页面还没有被载入内存,这时MMU就会通知操作系统:发生了一个页面访问错误(页面错误),接下来系统会启动所谓的“请页”机制,即调用相应的系统操作函数,判断该虚拟地址是否为有效地址。如果是有效的地址,就从虚拟内存中将该地址指向的页面读入到内存中的一个空闲页框中,并在页表中添加上相对应的表项,最后处理器将从发生页面错误的地方重新开始运行;在映射工作中,为了记录程序段占用物理内存的情况,操作系统的内存管理模块需要建立一个表格,该表格以虚拟地址为索引,记录了程序段所占用的物理内存的物理地址。原创 2023-02-24 22:08:45 · 714 阅读 · 0 评论 -
Linux内核性能优化—内存实战篇
使用 man free 查看Buffers是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值Cache是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和使用 man proc 查看Cached %luBuffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。原创 2022-12-28 21:55:19 · 677 阅读 · 0 评论 -
一文搞懂内存映射原理及使用方法
当然,给出的图示是简化的,因为文件数据在硬盘上的存储通常并不是连续的,而是分布到若干小的区域。如果是文件映射,那么分配物理页,把文件指定区间的数据读到物理页中,然后在页表中把虚拟页映射到物理页。我们已经熟悉了内存映射相关的数据结构和地址空间操作,在本节中,我们将进一步讨论在建立映射时内核和应用程序之间的交互。两个函数的参数相同。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。原创 2023-01-07 21:16:59 · 2659 阅读 · 0 评论 -
内存管理的关键技术——反向映射机制
前面我们介绍了反向映射的三种类型,匿名页,文件页和ksm页的反向映射,分别通过page所对应的的vma, address_space, stable_node结构来查找vma。当然我们只是介绍了Linux内核中的反向映射的冰山一角,主要是try_to_unmap函数,其实每种反向映射各个数据结构建立的过程错综复杂,一篇文章三言两语也说不清楚,他们散落在Linux内核源代码的进程创建fork,内存映射mmap,缺页异常处理,文件系统等各个角落。原创 2022-12-26 15:32:16 · 778 阅读 · 0 评论 -
Linux内核:一文搞懂外设I/O内存资源的静态映射方式
Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)。原创 2022-12-26 15:25:56 · 973 阅读 · 0 评论 -
Linux内核段页式内存管理技术
内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小为4G,这和实际的物理内存数量无关。一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间一部分是由内核保留使用的,这部分地址是地址空间的高地址部分,从KERNELBASE到结束,称为内核空间KERNELBASE:内核虚拟地址空间的起始地址,一般和PAGE_OFFSET相同,但是也可能不同。原创 2023-02-24 22:20:04 · 731 阅读 · 0 评论 -
Linux内核共享内存使用常见陷阱与分析
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如 信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一 个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但 是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃。原创 2023-02-25 22:05:51 · 1288 阅读 · 1 评论 -
Linux操作系统内存管理RAID磁盘阵列与配置
2、使用fdisk工具将新磁盘设备/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde划分出主分区sdb1、sdc1、sdd1、sde1,并且把分区类型的 ID 标记号改为“fd”6、验证一下磁盘是否已做raid,然后开始创建raid,这里我们创建一个raid名为md0,级别使用RAID5,然后-l3设置使用三个磁盘,-x1使用一块备份磁盘,再进行查看创建速度。4、对分区进行管理,创建分区并修改分区类型,这里示范一个/dev/sdb,其余的操作一样,就不示范了。原创 2023-03-15 16:25:33 · 1911 阅读 · 0 评论 -
Linux操作系统内存管理之磁盘高速缓存机制
相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要在不同的时间访问相同的磁盘数据。原创 2023-03-15 16:25:51 · 739 阅读 · 0 评论 -
冯.诺依曼:关于内存的一些思考
虚拟内存的提出是革命性的,在以前,程序不得不维护自己的寄存器,以明确自己所需内存的位置,只要是有一个地址,就可以根据段寄存器知道它位于内存中的什么地方,也就是说,那个时候,程序是直接使用物理内存的。在32位系统中,进程的虚拟地址空间永远都是32位也就是4G的,但是这4G空间的地址却是可以映射到任意的物理地址空间,一切尽在MMU,说白了就是,第一,页表项的映射指示到了任意的物理页面,第二就是地址总线的宽度允许寻址到那个位置(否则,虽然从程序上讲不会出错,但是在地址总线上发射地址的时候会发生回绕!原创 2022-12-22 22:24:11 · 130 阅读 · 0 评论 -
图解Linux内存性能优化核心思想
今天分享一篇的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的,是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景下面),并给出了这些问题的优化方案,这个对我们实现,或以后遇到内存性能问题的时候,有一定的启发,值得我们学习。来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。然而标准的slab实现太复杂且维护开销巨大,因此便分化出了更加小巧的slub,因此本文讨论的就是slub,后面所有提到slab的地方,指的都是slub。原创 2022-12-20 21:48:35 · 138 阅读 · 0 评论 -
一文搞懂C/C++内存管理原理与实现
否则在之后的开发者会误以为是个正常的指针,就有可能再通过指针去访问一些操作,但是在这时该指针已经无用,指向的内存也不知此时被如何使用,这时若出现意外将会造成无法预估的后果,甚至导致系统崩溃,在 malloc 的使用中更需要需要。在函数中首先使用 val 值接收 freep 的值,将 val 乘 2,之后释放 free,重新赋值给 val,最后使用 val 再次乘 2,此时造成的结果出现了极大的改变,而且最恐怖的是该错误很难发现,隐蔽性很强,但是造成的后顾难以承受。释放后使用,产生悬空指针。原创 2023-02-18 16:09:09 · 453 阅读 · 0 评论 -
Linux内核进程地址空间与进程内存布局
由于栈中数据严格的遵守FIFO的顺序,这个简单的设计意味着不必使用复杂的数据结构来追踪栈中的内容,只需要一个简单的指针指向栈的顶端即可,因此压栈(pushing)和退栈(popping)过程非常迅速、准确。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的,最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。原创 2023-02-24 22:24:25 · 1568 阅读 · 0 评论 -
内核比较: 2.6 内核中改进了内存管理
随着 Linux 内核的发展和成熟,更多的用户期待着 Linux 可以运行非常大的系统来处理科学分析应用程序或者海量数据库。这些企业级的应用程序通常需要大量的内存才能好好运行。2.4 Linux 内核有识别相当大数量的内存的功能,但是 2.5 内核发生了很多改变,使其有能力以更有效的方式处理更多的内存。原创 2022-12-24 22:07:12 · 510 阅读 · 0 评论 -
一文带你了解,虚拟内存、内存分页、分段、段页式内存管理
为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套的虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。原创 2023-02-23 15:45:45 · 1344 阅读 · 0 评论 -
真香!Linux 原来是这么管理内存的
上面的这种内存方式最造成一种后果,那就是内存的碎片化,会将较大的空闲页面分成较小的页面。相对于处理器和物理内存的速度,对交换文件的访问非常慢,并且操作系统需要兼顾将页面写到磁盘的以及将它们保留在内存中以便再次使用。要将虚拟地址转换为物理地址,处理器必须获取每个级别字段的内容,将其转换为包含页表的物理页的偏移量,并读取下一级页表的页框号。第一个页面(从第 4 页的帧开始)将作为分配的页面返回给调用方,第二个块(从第 6 页的页面开始)将作为 2 页的空闲块排队到 free_area 数组的元素 1 上。原创 2023-02-22 14:28:14 · 3186 阅读 · 0 评论 -
一文搞懂Linux内核之内存管理工作原理
本文讲解更加底层,基本都是从 Linux 内核出发,会更深入。所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉。原创 2022-12-28 21:51:30 · 285 阅读 · 0 评论 -
Linux原来是这么管理内存的(最透彻的一篇)
Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。原创 2023-02-22 14:45:46 · 826 阅读 · 0 评论 -
Linux内核内存相关问题,这一篇让你彻底了解
直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们的 I/O 数据,而不需要系统处理器的参与2) DMA 控制器的功能能向 CPU 发出系统保持(HOLD)信号,提出总线接管请求当 CPU 发出允许接管信号后,负责对总线的控制,进入 DMA 方式能对存储器寻址及能修改地址指针,实现对内存的读写操作能决定本次 DMA 传送的字节数,判断 DMA 传送是否结束发出 DMA 结束信号,使 CPU 恢复正常工作状态。原创 2023-02-25 21:44:39 · 730 阅读 · 0 评论 -
从OOM的角度,带你了解虚拟内存机制
除了OOM Killer,Android上还开发了low memory killer机制,我们在此也简单介绍一下。LMK是在系统内存较低时就开始杀进程,而不是等到内存不足时再杀。LMK复用了OOM Killer 的/proc//oom_score_adj 文件接口,但是没有使用/proc//oom_score。LMK仅根据oom_score_adj值的大小选择杀进程,而不会考虑进程本身占用内存的大小。原创 2022-12-26 21:02:02 · 524 阅读 · 0 评论