Minimizing Memory Usage for Creating Application Subprocesses

Minimizing Memory Usage for Creating Application Subprocesses 講解為甚麼要用 posix_spawn() 取代  fork() + exec() 跑外部程式,牽涉兩個問題。

第一個是 VM out of memory,舉例來說,一個 6G 的 process 要跑 /bin/ls,fork() 時也要用到 6G VM,由於 Solaris 不像 Linux 會 memory over comit,swap 開的不夠大就會 out of memory。

第二個是效能問題, fork() 要 copy 一堆資料結構,這點 BSD 用 vfork() 解決,vfork() 不會 copy 那堆資料結構。然而在 multi-thread 時,vfork() 又會造成 parent 和 child 間 dead lock,詳情參照原文。

posix_spawn() 避免了 fork() 要另外佔用 VM 的問題,另外有個好處,就是傳統上發生在 fork() 和 exec() 間一些動作,posix_spawn() 可以做精細的設定,像是 change user and group ID, signal mask, scheduling class, file descripter, shell redirect, etc.

後面提到 Linux  memory over commit 的優缺點,主要的缺點是發生 out of memory 的時機不確定(因為你跟系統要多少,系統都跟你說有,根本無法檢查),等到 VM 真的用完 OOM killer  會隨機挑/試著選 一個 process 砍掉,這在企業系統上是不允許的。

Technorati Tags:

2 關於 “Minimizing Memory Usage for Creating Application Subprocesses” 的評論

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s