- Linux 提供各種模式(比如,消息隊列),但是最著名的是 POSIX 共享內存(shmem,shared memory)。
- Linux provides a variety of schemes (such as message queues), but most notable is POSIX shared memory (shmem).
1. memory overcommit 與內存管理
理解Linux的memory overcommit
- Linux 下的內存管理會影響 Linux 下的 C 代碼在內存分配(malloc)時的執行情況:
- Memory Overcommit的意思是操作系統承諾給進程的內存大小超過了實際可用的內存。一個保守的操作系統不會允許memory overcommit,有多少就分配多少,再申請就沒有了,這其實有些浪費內存,因為進程實際使用到的內存往往比申請的內存要少,比如某個進程malloc()了200MB內存,但實際上只用到了100MB,按照UNIX/Linux的算法,物理內存頁的分配發生在使用的瞬間,而不是在申請的瞬間,也就是說未用到的100MB內存根本就沒有分配,這100MB內存就閑置了。
- commit(或overcommit)針對的是內存申請,內存申請不等于內存分配,內存只在實際用到的時候才分配。
- 也即有了 overcommit,內存的分配即是一種 lazy memory allocation;
- 如果在使用過程中,真的超出可用的內存大小,Linux設計了一個OOM killer機制(OOM = out-of-memory)來處理這種危機:挑選一個進程出來殺死,以騰出部分內存,如果還不夠就繼續殺…也可通過設置內核參數 vm.panic_on_oom 使得發生OOM時自動重啟系統。
- overcommit 參數配置:
- Linux 2.6之后允許通過內核參數 vm.overcommit_memory 禁止memory overcommit(也可通過 /proc/sys/vm/overcommit_memory)。內核參數 vm.overcommit_memory 接受三種取值:
- 0 – Heuristic overcommit handling. 這是缺省值,它允許overcommit,但過于明目張膽的overcommit會被拒絕,比如malloc一次性申請的內存大小就超過了系統總內存。Heuristic的意思是“試探式的”,內核利用某種算法(對該算法的詳細解釋請看文末)猜測你的內存申請是否合理,它認為不合理就會拒絕overcommit。
- 1 – Always overcommit. 允許overcommit,對內存申請來者不拒。
- 2 – Don’t overcommit. 禁止overcommit。
- Linux 2.6之后允許通過內核參數 vm.overcommit_memory 禁止memory overcommit(也可通過 /proc/sys/vm/overcommit_memory)。內核參數 vm.overcommit_memory 接受三種取值: