java進程調用外部程序時fork()+exec()分析

java進程調用一個外部程序,一般使用Runtime.getRuntime().exec(cmd)的方式啓動。

以下是Runtime.getRuntime().exec(cmd) 的執行流程分析

分析SUN JDK 1.5 SRC,找到Runtime.getRuntime().exec(cmd)的執行流程:

java.lang.Runtime.exec(cmd);

--java.lang.ProcessBuilder.start();

----java.lang.ProcessImpl.start();

------Java_java_lang_UNIXProcess_forkAndExec() in j2se/src/solaris/native/java/lang/UNIXProcess_md.c

--------1). fork(); 2). execvp();

man fork知道,fork產生的子進程需要複製父進程在內存中的所有數據內容(代碼段、數據段、堆棧段),由於全部複製開銷較大,因此Linux已經採用copy-on-write機制,即只是複製頁表,共享內容,在有改變的時候再去申請內存和複製數據。

參考:

http://my.oschina.net/jsan/blog/273672

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章