pcntl_fork執行過程執行個體詳解

來源:互聯網
上載者:User

本文主要和大家分享pcntl_fork執行過程執行個體,進程(process)的概念一個進程,主要包含三個元素:

1. 一個可以執行的程式;
2. 和該進程相關聯的全部資料(包括變數,記憶體空間,緩衝區等等);
3. 程式的執行內容(execution context);

可以這樣認為

不妨簡單理解為,一個進程表示的就是一個可執行程式的一次執行過程中的一個狀態。作業系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前作業系統中一個進程的情況。
對於單 CPU的情況而言,每一特定時刻只有一個進程佔用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。一個稱為”程式計數器(program counter, pc)”的寄存器,指出當前佔用 CPU的進程要執行的下一條指令的位置。當分給某個進程的 CPU時間已經用完,作業系統將該進程相關的寄存器的值,儲存到該進程在進程表中對應的表項裡面;把將要接替這個進程佔用 CPU的那個進程的上下文,從進程表中讀出,並更新相應的寄存器(這個過程稱為”上下文交換(process context switch)”,實際的上下文交換需要涉及到更多的資料,那和fork無關,不再多說,主要要記住程式寄存器pc指出程式當前已經執行到哪裡,是進程上 下文的重要內容,換出 CPU的進程要儲存這個寄存器的值,換入CPU的進程,也要根據進程表中儲存的本進程執行內容資訊,更新這個寄存器)。

fock知識

fork之後,作業系統會複製一個與父進程完全相同的子進程,雖說是父子關係,但是在作業系統看來,他們更像兄弟關係,這2個進程共用代碼空間,但是資料空間是互相獨立的,子進程資料空間中的內容是父進程的完整拷貝,指令指標也完全相同,但只有一點不同,如果fork成功,子進程中fork的傳回值是0,父進程中fork的傳回值是子進程的進程號,如果fork失敗,父進程會返回錯誤。可以這樣想象,2個進程一直同時運行,而且步調一致,在fork之後,他們分別作不同的工作,也就是分岔了,這也是fork為什麼叫fork的原因。至於哪一個進程最先運行,這與作業系統平台的調度演算法有關,而且這個問題在實際應用中並不重要,如果需要父子進程協同運作,可以通過控制文法結構的辦>法解決。

2

fork前子進程可以繼承父進程的東西,但是在pcntl_fork()後子進程和父進程就沒有任何繼承關係了。在子進程裡建立的東西是子進程的,在父進程建立的東西是父進程的,可以完全看成是兩個獨立的進程。

3

在程式段裡用了pcntl_fork()之後程式出了分岔,派生出了兩個進程,具體哪個先運行就看該系統的調度演算法了。
在這裡,我們可以這麼認為,在運行到”pid=pcntl_fork();”時系統派生出一個跟主程式一模一樣的子進程。該進程的”pid=pcntl_fork();”一句中 pid得到的就是子進程本身的pid;子進程結束後,父進程的”pid=pcntl_fork();”中pid得到的就是父進程本身的pid,因此該程式有兩行輸出。

4

pcntl_fork()函數複製了當前進程的PCB,並向父進程返回了派生子進程的pid,父子進程並行,列印語句的先後完全看系統的調度演算法,列印的內容控制則靠pid變數來控制。因為我們知道pcntl_fork()向父進程返回了派生子進程的pid,是個正整數;而派生子進程的pid變數並沒有被改變,這一區別使得我們看到了他們的不同輸出。

5

  1. 派生子進程的進程,即父進程,其pid不變;

  2. 對子進程來說,fork()函數返回給它0, 但它自身的pid絕對不會是0;之所以fork()函數返回0給它,是因為它隨時可以調用getpid()來擷取自己的pid;

  3. fork之後父、子進程除非採用了同步手段,否則不能確定誰先運行,也不能確定誰先結束。認為子進程結束後父進程才從fork返回的,這是不對的,fork不是這樣的,vfork才這樣。

例子

<?php$lock = new swoole_lock(SWOOLE_MUTEX);echo "[主進程]create lock\n";$lock->lock();$res = pcntl_fork();if ($res>0){    echo "1\n";    $lock->unlock();    sleep(1);    echo "222";} else{    echo "[子進程] Wait Lock\n";    $lock->lock();    echo "[子進程] Get Lock\n";    $lock->unlock();    exit("[子進程] exit\n");}echo "[主進程]release lock\n";unset($lock);echo "[主進程]exit\n";

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.