目錄
fock知識
範例
首頁 後端開發 php教程 pcntl_fork執行過程實例詳解

pcntl_fork執行過程實例詳解

Mar 08, 2018 pm 02:14 PM
fork pcntl 實例

本文主要和大家分享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";
登入後複製

pcntl_fork執行過程實例詳解

#相關推薦:

微博Qzone 微信 pcntl_fork實作PHP多進程

php多進程中關於pcntl_fork的詳細介紹

#php pcntl_fork和pcntl_fork 的用法

#

以上是pcntl_fork執行過程實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Python中的SVM實例 Python中的SVM實例 Jun 11, 2023 pm 08:42 PM

Python中的支援向量機(SupportVectorMachine,SVM)是一個強大的監督學習演算法,可以用來解決分類和回歸問題。 SVM在處理高維度資料和非線性問題的時候表現出色,被廣泛地應用於資料探勘、影像分類、文字分類、生物資訊學等領域。在本文中,我們將介紹在Python中使用SVM進行分類的實例。我們將使用scikit-learn函式庫中的SVM模

VUE3入門實例:製作一個簡單的影片播放器 VUE3入門實例:製作一個簡單的影片播放器 Jun 15, 2023 pm 09:42 PM

隨著新一代前端框架的不斷湧現,VUE3作為一個快速、靈活、易上手的前端框架備受熱愛。接下來,我們就來一起學習VUE3的基礎知識,製作一個簡單的影片播放器。一、安裝VUE3首先,我們需要在本地安裝VUE3。開啟命令列工具,執行以下命令:npminstallvue@next接著,新建一個HTML文件,引入VUE3:&lt;!doctypehtml&gt;

學習Golang指標轉換的最佳實務範例 學習Golang指標轉換的最佳實務範例 Feb 24, 2024 pm 03:51 PM

Golang是一門功能強大且高效的程式語言,可用於開發各種應用程式和服務。在Golang中,指標是一種非常重要的概念,它可以幫助我們更靈活和有效率地操作資料。指標轉換是指在不同類型之間進行指標操作的過程,本文將透過具體的實例來學習Golang中指標轉換的最佳實踐。 1.基本概念在Golang中,每個變數都有一個位址,位址就是變數在記憶體中的位置。

Oracle實例數量與資料庫效能關係 Oracle實例數量與資料庫效能關係 Mar 08, 2024 am 09:27 AM

Oracle實例數量與資料庫效能關係Oracle資料庫是業界知名的關係型資料庫管理系統之一,廣泛應用於企業級的資料儲存與管理。在Oracle資料庫中,實例是一個非常重要的概念。實例是指Oracle資料庫在記憶體中的運作環境,每個實例都有獨立的記憶體結構和後台進程,用於處理使用者的請求和管理資料庫的操作。實例數量對於Oracle資料庫的效能和穩定性有著重要的影響。

Python中的VAE演算法實例 Python中的VAE演算法實例 Jun 11, 2023 pm 07:58 PM

VAE是一種生成模型,全名為VariationalAutoencoder,中文譯為變分自編碼器。它是一種無監督的學習演算法,可以用來產生新的數據,例如圖像、音訊、文字等。與普通的自編碼器相比,VAE更加靈活和強大,能夠產生更複雜和真實的數據。 Python是目前使用最廣泛的程式語言之一,也是深度學習的主要工具之一。在Python中,有許多優秀的機器學習和深度

PHP 簡單網頁爬蟲開發實例 PHP 簡單網頁爬蟲開發實例 Jun 13, 2023 pm 06:54 PM

隨著網路的快速發展,數據已成為了當今資訊時代最為重要的資源之一。而網路爬蟲作為一種自動化獲取和處理網路數據的技術,也越來越受到人們的關注和應用。本文將介紹如何使用PHP開發簡單的網路爬蟲,並實現自動化取得網路資料的功能。一、網路爬蟲概述網路爬蟲是一種自動化取得和處理網路資源的技術,其主要工作流程是模擬瀏覽器行為,自動存取指定的URL位址並提取所

PHP PCNTL中fork失敗的常見錯誤及解決方案 PHP PCNTL中fork失敗的常見錯誤及解決方案 Feb 28, 2024 am 11:06 AM

PHPPCNTL中fork失敗的常見錯誤及解決方案在使用PHPPCNTL擴充進行流程管理時,常會遇到fork失敗的問題。 fork是建立子程序的一種方法,在某些情況下可能會因為一些錯誤導致fork操作失敗。本文將介紹一些常見的fork失敗的錯誤以及相應的解決方案,並提供具體的程式碼範例來幫助讀者更好地理解和處理這些問題。 1.記憶體不足可能的錯誤訊息:Can

Gin框架中的驗證碼使用實例 Gin框架中的驗證碼使用實例 Jun 23, 2023 am 08:10 AM

隨著網路的普及,驗證碼已經成為了登入、註冊、找回密碼等操作的必要流程。在Gin框架中,實作驗證碼功能也變得異常簡單。本文將介紹如何在Gin框架中使用第三方函式庫實作驗證碼功能,並提供範例程式碼供讀者參考。一、安裝依賴函式庫在使用驗證碼之前,我們需要安裝一個第三方函式庫goCaptcha。安裝goCaptcha可以使用goget指令:$goget-ugithub

See all articles