• JohnT3e
    2018-12-24
    目前我配合使用《Operating System Concepts》这本书学习此专栏,也是一个不错的选择。此书中的第四部分“Memory Management”对今天这部分内容有较为详细的描述,感兴趣的同学可以去看一下。另外对于TOP命令中输出的内存情况解释,可以认真看一下man手册的内容。如果你动手能力比较强,可以看https://blog.holbertonschool.com/hack-the-virtual-memory-malloc-the-heap-the-program-break/这篇博客,手把手教你使用程序(C语言)来实际地去搞清楚虚拟内存分布。

    作者回复: 👍 谢谢分享,这篇博客很详细

    
     75
  • 我来也
    2018-12-24
    [D15打卡]
    linux的内存跟windows的很不一样。类linux的系统会尽量使用内存缓存东西,提供运行效率。所以linux/mac显示的free剩余内存通常很小,但实际上被缓存的cache可能很大,并不代表系统内存紧张!
    曾经就闹过笑话,看见系统free值很低,怕程序因为oom被系统杀掉,还特意写个c程序去挤内存。程序不停的申请1MB内存然后memset,随机挑几个位置写,保证申请的都被加载到物理内存中。(跟文中描述的一致,只申请不使用不会加载到物理内存)然后挤的差不多了就把测试程序关掉。看上去free变大了很多很开心。现在想想,就是掩耳盗铃罢了。
    以前物理机上还有swap交换分区,现在都是云服务器,基本没有了该分区。也不会遇到因为频繁使用交换分区导致性能下降的问题了。
    我内存方面的问题遇到的都比较简单,基本上就是top/free看看系统和各程序的,找到有问题的程序,看看是否有内存泄露。平常不泄漏都是够用的。
    redis对内存比较敏感,曾经就因为配置项是默认值,在内存用完后,所有的set操作都直接返回错误,导致线上系统故障。(redis在备份时会新开一个进程,实际使用内存量会翻番。)后来会定期检查redis 的info memory 看内存使用情况。
    ——————————
    期待的内存篇开始了,好开心!又可以跟着老师学新知识啦!
    展开

    作者回复: 👍 谢谢分享你的经历。缓存和swap后面都还会细讲

    
     28
  • 梦回汉唐
    2019-03-27
    1、调用c标准库的都是用户空间的调用,用户空间的内存分配都是基于buddy算法(伙伴算法),并不涉及slab
    2、brk()方式之所以会产生内存碎片,是由于brk分配的内存是推_edata指针,从堆的低地址向高地址推进。这种情况下,如果高地址的内存不释放,低地址的内存是得不到释放的
    3、mmap()方式分配的内存,是在堆与栈之间的空闲区域分配虚拟内存,直接拿到的是内存地址,可以直接操作内存的释放

    上述的都是在用户空间发生的行为,只有在内核空间,内核调用kmalloc去分配内存的时候,才会涉及到slab

    作者回复: 👍

    
     24
  • espzest
    2018-12-24
    用户空间malloc不会使用slab机制吧,slab是内核空间的,对不?

    作者回复: 嗯嗯,是的,谢谢指出。slab是内核空间的,只用来管理内核中的小块内存

    
     12
  • 虎虎❤️
    2018-12-24
    请教老师几个问题

    1. 当内存紧张时,系统通过三种机制回收内存。第二种换页比较好理解, 但是第一种LRU回收内存页怎么理解?回收后的页去哪了?如果直接删除会导致程序出问题吗?

    2. OOM的分数是参照进程的实际消耗内存还是虚拟内存大小?

    3. 进程启动时,是不是需要分配一个最小的内存?都包括什么呢?如何确定最小的内存是多大呢?比如我在k8s里设置container的request值,我希望是能容乃下这个container的最小内存,有没有办法计算呢?

    有的问题比较小白,望老师包含。如果无法简短的回答,能否推荐些资料呢?谢谢
    展开
    
     8
  • 划时代
    2018-12-24
    我的分析步骤:使用top和ps查询系统中大量占用内存的进程,使用cat /proc/[pid]/status和pmap -x pid查看某个进程使用内存的情况和动态变化。

    作者回复: 👍

    
     8
  • 赵强强
    2018-12-24
    倪老师,“Operating Systems Design and Implementation”里面说,大部分页式存储管理,页表是存储到内存里面的,为降低频繁访问内存计算物理地址,引入TLB用于缓存常用映射以提升性能。以现在流行的linux为例,本节课说页表存储在MMU是否还正确呢?

    作者回复: MMU全称就是内存管理单元,管理地址映射关系(也就是页表)。但MMU的性能跟CPU比还是不够快,所以又有了TLB。TLB实际上是MMU的一部分,把页表缓存起来以提升性能。

    
     6
  • 圣域烈焰
    2018-12-24
    请教一个问题,使用free命令的时候,看到的buffer、cache和shared有什么区别?

    作者回复: 下一期讲 buffer 和 cache

    
     3
  • ninuxer
    2018-12-24
    打卡day16
    工作中,发生oom基本都是程序跑的,都甩给研发了~😂

    作者回复: 😂

    
     3
  • Griffin
    2018-12-27
    hmmm,我要提问。老师,我的开发机是macbook。内存是16G。但是经常出现已12G,swap用了3-4G。我平时没用ide就tmux+vim,内存大户就一个dorker和chrome。卡的我不得了,每次都只能重启来缓解。发现有个windowserver占用很多。感觉16G内存开发应该完全够用才对啊,有没有mac下可以禁用swap?让内存不够的时候优先回收缓存和不常用的内存,而不是滥用swap?

    作者回复: MAC还真不了解。接下来还有swap的文章,到时候可以参考试试

    
     2
  • 赵强强
    2018-12-24
    倪老师,如果进程间的虚拟内存空间独立,每个进程又有自己的页表,那么进程怎么获知其他进程占用的物理内存情况,怎么防止覆盖其他进程的物理内存块呢?

    作者回复: 1. 进程不需要获取其他进程的内存情况
    2. 所有进程的内存都是由内核来管理的,内核保证内存的访问安全。比如,访问非法地址时,进程会panic

    
     2
  • 大甜菜
    2018-12-24
    malloc本身不会使用slab
    只有内核中使用kmalloc才回通过slab分配内存

    作者回复: 嗯嗯,是的,谢谢指出

    
     2
  • 威
    2018-12-24
    老师您好,请问如果发生了OOM,系统会记录下是哪个(些)进程被杀掉吗?

    作者回复: 会的,比如 dmesg |grep -E ‘kill|oom|out of memory’

    
     2
  • 靠人品去赢
    2019-07-11
    看的很爽这篇文章,之前知道一点操作系统关于内存的分配使用,内存映射管理物理内存和虚拟内存的对应关系,也知道页。但是还没见过将二者串起来,好多疑问解决。
    我们经常说的多少位长,到底有什么区别?就是虚拟内存空间大小,以及空间的分配区别。
    虚拟内存和物理内存的分配,怎么让物理内存能及时跟进程需要的虚拟内存交互对应起来?内核态和用户态的切换,知道进程有个虚拟地址,一个是用户的,一个是内核的,当调用进程的某些内存发现维护的内存映射没有对应的,及切换到内核态,内核把对应的虚拟内存放进去物理内存,再切回来用户态,进程继续,妙。
    
     1
  • 周曙光爱学习
    2019-03-21
    虚拟内存中只有内核空间能访问物理内存吗?也就是说只有内核空间才会有页表与物理内存关联吗?那用户空间的虚拟内存怎么玩?

    作者回复: 虚拟内存由内核来管理,进程不能直接访问物理内存

    
     1
  • 李亮亮
    2019-02-28
    我的理解就是,Linux里面所有的概念皆结构(C语言的结构体),页表也是一种结构体,也就是数据,所以保存还是在内存里面。mmu其实就是一个硬件,它的作用就是找到某个虚拟地址到物理地址的映射,也就是找到正确的页表项。然后再交给CPU,当然也可以把找到的结果缓存在TBL中,这样CPU下次使用同一个虚拟地址就省了转换这步了,老师,不知道我理解的有错吗?

    作者回复: 对的,Linux也是一个程序,本质上还是数据结构+算法😊

    
     1
  • 湖海散人
    2019-02-28
    分配虚拟内存使用的是brk 和 mmap,在真正使用内存的时候引起缺页中断再分配真正的物理内存

    请问,那这里的分配物理内存的方式是怎样的啊,是按照什么机制来进行分配物理内存,虚拟内存有内存的分段等一系列机制在管理,那物理内存呢? 在使用brk分配小内存和使用mmap分配大内存的时候,对应的物理内存的分配策略是怎样的啊

    作者回复: 物理内存是由内核来统一管理的,内核通过kmalloc、页、SLAB 等多种机制来管理不同用途的内存

    
     1
  • 如果
    2019-01-03
    DAY15,内存工作原理有点难理解~~
    
     1
  • Geek_37593b
    2018-12-28
    先打卡,地铁上。
    
     1
  • 小老鼠
    2018-12-26
    JAVA的GC是不是也是分配内存的?

    作者回复: GC负责回收内存

    
     1
我们在线,来聊聊吧