pcntl_fork執行過程實例詳解
本文主要和大家分享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
#衍生子程序的進程,即父進程,其pid不變;
對子程序來說,fork()函數傳回給它0, 但它自己的pid絕對不會是0;之所以fork()函數傳回0給它,是因為它隨時可以呼叫getpid()來取得自己的pid;
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";
#相關推薦:
微博Qzone 微信 pcntl_fork實作PHP多進程、
#php pcntl_fork和pcntl_fork 的用法
#以上是pcntl_fork執行過程實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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