java程序呼叫外部程式時fork()+exec()分析
阿新 • • 發佈:2019-02-20
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機制,即只是複製頁表,共享內容,在有改變的時候再去申請記憶體和複製資料。
參考: