前言

最近一直在看 B 站看 南大的公开课《操作系统的设计与实现》。

不得不说这位蒋炎岩导师的课程真的非常生动,且与时俱进,并没有那种照搬教材式的朗读,整个课程就是在一个 Slide 和一个 Terminal 中进行的,简单却又不简单。

内存管理

在之前的课程中已经说到 fork() 的系统调用会复制整个状态机,那么也就意味着包括内存等 context,这样就会导致一个问题,同样的库如 libc 库,没有必要在每个进程下面都完全的复制一份。

实际上操作系统的实现也是,通过指针引用的,只有到需要写入的时候,才会真正复制一份到新开辟的内存空间当中,也就是常说的 copy on write

某种程度上来说,统计进程的内存占用是一个伪命题,因为我们无法精准定义什么是进程占用的内存!

进程的内存统计

那么这和进程的内存统计不准确又有什么关系呢?通过使用 pmap 这个命令我们可以查看指定 PID 的进程的内存信息:

Nginx Master process memory useage

对于一些依赖库,在内存中的映射,就像文件系统一样,也是有权限的,而对于只有 read 权限的内存区块在进程执行 fork() 的时候,操作系统是不会真正复制内存的,而是通过指针引用。

对于像 libc.so 这样的库,每个进程基本上都会用到,但是不用每个进程都去分配一套独立的空间,这样就降低了物理内存的使用。

这样一来某个进程用到的公共库越多,统计到的内存可能越大,但是实际上可能并没有想想中的那么大!

感触

学习操作系统对于 System Programming 的能力和 Debuging 能力有一定的拔高,将自己的视角提升到了造物主的视角,以前只是指导应该如何做,但并不知道为什么要这样做。

等操作系统课程跟完了以后,在看看硬件相关的数据和编译器等知识,希望能每天抽点时间坚持下来!

I hope this is helpful, Happy hacking…