接上節我們來了解了解多程式的一些基礎程式 / 執行緒 / 多程式 / 父程式 / 子程式 / 會話 / 控制終端等

taozywu發表於2019-07-15

定義

程式/父程式/子程式

  • 程式是資源排程和分配的一個獨立單元
  • 程式是由執行緒組成 即等於 一個程式 = 一個執行緒.
  • 程式是由另一個程式建立 (系統程式 init程式除外) 所以會出現父子程式. 建立一方為父程式 被建立一方為子程式

執行緒

  • 執行緒是cpu排程的基本單元 可以理解為是一個程式中的一個執行緒工作 整個資源是可以共享 執行緒也是由另一個執行緒建立的
  • 最開始的我們可以理解為就是程式本身 他開始建立一個執行緒1 執行緒1再去建立執行緒11 執行緒1就是執行緒11的父執行緒

會話/程式組/控制終端

  • 程式組是一個或多個程式的集合
  • 會話是一個或多個程式組的集合.系統呼叫函式getsid()用來獲取某個程式的會話ID(SID)
  • 控制終端可以簡單理解就是我們們ssh終端(黑視窗)或cmd那種
  • 一個會話可以有一個控制終端,建立於控制終端相連線的會話首程式被稱為控制程式.
  • 一個會話中的幾個程式組可被分為一個前臺程式組和幾個後臺程式組,如果一個會話有一個控制終端,則他有一個前臺程式組.
  • 無論何時鍵入終端的中斷鍵,都會將中斷信ID傳送給前臺程式組的所有會話;無論何時鍵入終端的退出鍵,都會將退出信ID傳送給前臺程式組的所有會話.

知識點及程式碼講解

重點講解父程式和子程式, 其他往後放放或大家抽空多去搜尋一波!

  • 子程式與父程式共享程式正文段
  • 子程式擁有父程式的資料空間和堆、棧的副本,注意是副本,不是共享
<?php

$i = 0;  

$pid = pcntl_fork();

if ($pid > 0 ) {
        // 父程式
        $i ++;
        echo "parent's i= $i\n"; //1
} else if ($pid == 0) {
        // 子程式
        $i ++;
        echo "son's i=$i\n";  //1
} else {
        // fork error
        echo "fork error\n";
}

// 1 說明父程式能共享$i
// 1 說明子程式能共享$i
// 父程式/子程式都是1 說明子程式不能共享父程式的資料
  • 父程式和子程式將繼續執行fork之後的程式程式碼

fork之後,是父程式先執行還是子程式先執行無法確認,取決於系統排程

<?php

for($i = 0; $i < 3; $i++) {

    $pid = pcntl_fork();

    switch($pid) {

            case 0:
            // 子程式
            echo "I am son\n";
            break;

            case -1:
            // fork error
            echo "I am err\n";
            break;

            default:
            // 父程式
            echo "I am parent\n";
            break;
    }

}
// 父程式/子程式出現7次, 說明fork完後會繼續執行後續的程式碼邏輯
// 父程式/子程式列印出現亂序, 說明優先執行父程式還是子程式無法確認

====
程式fork完後如果沒有主動退出會繼續執行後續的程式碼邏輯!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章