日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP 进程详解

發(fā)布時間:2023/12/1 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP 进程详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
PHP 進程詳解

PHP 進程詳解

如下內(nèi)容從《操作系統(tǒng)精髓與設(shè)計原理》中總結(jié)提煉得出,刪除了大部分對于理解進程有干擾的文字,對進程知識結(jié)構(gòu)進行的梳理。幾乎所有內(nèi)容為按照書本上摘抄下來的,我目前還總結(jié)提煉不出像作者這么深刻的見解。那么就先學習等完全理解透了,再用自己的語言表達出來。它山之石,可以攻玉。

進程的概念是操作系統(tǒng)的結(jié)構(gòu)的基礎(chǔ)。Multics的設(shè)計者在20世紀60年代首次使用了這個技術(shù)詞語,它比作業(yè)更通用一些。關(guān)于進程的定義,如下所示:
1.一個正在執(zhí)行的程序。
2.計算機中正在運行的程序的一個實例。
3.可以分配給處理器并由處理器執(zhí)行的一個實體。
4.由單一的順序的執(zhí)行線程、一個當前狀態(tài)和一組相關(guān)的系統(tǒng)資源所描述的活動單元。

也可以把進程當成由一組元素組成的實體,進程的兩個基本的元素是程序代碼(可能被執(zhí)行相同程序的其他進程共享)和代碼相關(guān)聯(lián)的數(shù)據(jù)集。假設(shè)處理器開始執(zhí)行這個程序代碼,且我們把這個執(zhí)行實體叫做叫做進程。在進程執(zhí)行時,任意給定一個時間,進程都可以唯一的被表征為以下元素。

1.標識符:跟這個進程相關(guān)的唯一標識符,用來區(qū)別其他進程。
2、狀態(tài):如果進程正在執(zhí)行,那么進程處于運行態(tài)。
3、優(yōu)先級:相對于其他進程的優(yōu)先級
4、內(nèi)存指針:包括程序代碼和進程相關(guān)數(shù)據(jù)的指針,還有和其他進程共享內(nèi)存塊的指針。
5、上下文數(shù)據(jù):進程執(zhí)行時處理器的寄存器中的數(shù)據(jù)。
6、I/O 狀態(tài)信息:包括顯示的I/O操作。分配給進程的I/O設(shè)備(例如磁帶驅(qū)動器)和被進程使用的文件列表等。
7、記賬信息:可能包括處理器時間綜合、使用的是時鐘數(shù)總和、時間限制、記賬號等。

如下圖:

1、為什么設(shè)計了進程?
設(shè)計出一個能夠協(xié)調(diào)各種不同活動的系統(tǒng)軟件是非常困難的。在任何時刻都有許多作業(yè)在運行中,每個作業(yè)都包括要求按照順序執(zhí)行的很多步驟,因此分析時間的序列組合是不可的。由于缺乏能夠在所有活動中進行協(xié)調(diào)和合作的系統(tǒng)級的方法,程序員只能基于他們對操作系統(tǒng)所控制的環(huán)境的理解,采用自己的特殊方法。然而這種方法是很脆弱的,尤其對于一些程序設(shè)計中的小錯誤,因為這些錯誤只有在很少見的時間序列發(fā)生時才會出現(xiàn)。由于需要從應用程序軟件錯誤和硬件錯誤中區(qū)分出這些錯誤,因而診斷工作是很困難的。及時檢測出錯誤,也很難確定原因,因為很難在線錯誤產(chǎn)生的精確場景。一般而言,產(chǎn)生這類錯誤的4個主要原因如下:
1.不正確同步
2.失敗互斥。
3.不確定的程序操作
4.死鎖

以上詳細描述請參閱:《操作系統(tǒng)精髓與設(shè)計原理》第六版第二章或查看網(wǎng)頁版】

解決這些問題需要一種系統(tǒng)級別的方法監(jiān)控處理器中不同程序的執(zhí)行。進程的概念為
此提供了基礎(chǔ)。
因此進程可以看做是由三部分組成的:
1.一段可以執(zhí)行的程序
2.程序所需要的相關(guān)數(shù)據(jù)
3.程序的執(zhí)行上下文

2、了解進程執(zhí)行上下文
執(zhí)行上下文是進程的重重之中。執(zhí)行上下文(execution context) 又稱作進程狀態(tài)(process state),是操作系統(tǒng)用來管理和控制進程所需的內(nèi)部數(shù)據(jù)。這種內(nèi)部信息和進程是分開的,因為操作系統(tǒng)信息不允許被進程直接訪問。上下文包括操作系統(tǒng)管理進程以及處理器正確執(zhí)行進程所需要的所有信息。包括了各種處理器寄存器的內(nèi)容,如程序計數(shù)器和數(shù)據(jù)寄存器。它還包括操作系統(tǒng)使用的信息,如進程優(yōu)先級以及進程是否在等待特定 I/O事件的完成。


圖1

圖1 兩個進程A 和B ,存在于內(nèi)存中某部分。也就是說給每個進程(包含程序、數(shù)據(jù)和上下文信息)分配一塊存儲器區(qū)域,并且在由操作系統(tǒng)建立和維護的進程表中進行記錄。進程表中包含記錄每個進程的表現(xiàn),表項內(nèi)容包括指向包含進程的存儲塊地址的指針,還包括該進程的部分或全部執(zhí)行上下文。指向上下文的其余部分存放在別處,可能和進程自己保存在一起,通常也可能保存在內(nèi)存里一塊獨立的區(qū)域中。進程索引寄存器(process index register) 包含當前正在控制處理器的進程在進程表中的索引。程序計數(shù)器指向該進程中下一條待執(zhí)行的指令。基址寄存器(base register) 和界限寄存器(limit register) 定義了該進程所占據(jù)的存儲器區(qū)域:基址寄存器中保存了該存儲器區(qū)域的開始地址,界限寄存器中保存了該區(qū)域的大小(以字節(jié)或字為單位)。程序計數(shù)器和所有的數(shù)據(jù)引用相對于基址寄存器被解釋,并且不能超過界限寄存器中的值,這就可以保護內(nèi)部進程間不會相互干涉。(解決了互斥的問題)

圖1進程索引寄存器表明進程B正在執(zhí)行。以前執(zhí)行的進程被臨時中斷,在A中斷的同時,所有的寄存器的內(nèi)容被記錄在它執(zhí)行上下文環(huán)境中,以后操作系統(tǒng)就可以執(zhí)行進程切換,恢復進程A的執(zhí)行。進程切換過程包括保存B的上下文和恢復A的上下文。當在程序計數(shù)器中載入指向A的程序區(qū)域的值時,進程A自動恢復執(zhí)行。

因此進程被當做數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)。一個進程可以是正在執(zhí)行,也可是等待執(zhí)行。任何時候整個進程狀態(tài)都包含在它的執(zhí)行上下文環(huán)境中。這個結(jié)構(gòu)使得可以開發(fā)功能強大的技術(shù),以確保在進程中進行協(xié)調(diào)和合作。在操作系統(tǒng)中可能會設(shè)計和并入一些新的功能(優(yōu)先級,linux中nice值。)這可以通過擴展上下文環(huán)境以包括支持這些特征的新信息。

3、兩狀態(tài)進程模型
操作系統(tǒng)的基本職責是控制進程的執(zhí)行。這包括確定交替執(zhí)行的方式和給進程分配資源在設(shè)計控制進程的程序時,第一步就是描述進程所表現(xiàn)出的行為。

由前面的基礎(chǔ)知識介紹可知,在任何時刻,一個進程要么正在執(zhí)行,要么沒有執(zhí)行,因而可以構(gòu)造最簡單的模型。一個進程可以處于以下兩種狀態(tài)之一:運行態(tài)或未運行態(tài)。當操作系統(tǒng)創(chuàng)建一個新的進程時,它將該進程運行態(tài)加入到系統(tǒng)中,操作系統(tǒng)知道這個進程是存在的,并且正在等待執(zhí)行機會。當前正在運行的進程時不時的被中斷,操作系統(tǒng)中的分派器部分將選擇一個新進程運行。前一個進程從運行態(tài)轉(zhuǎn)換到未運行狀態(tài),另外一個集成轉(zhuǎn)換到運行態(tài)。如下圖.

從這個簡單的模型可以意識到操作系統(tǒng)的一些設(shè)計元素。必須用某種方式來表示每個進程,使得操作系統(tǒng)能夠跟蹤它,也就是說,必須有一些與進程相關(guān)的信息,包括進程在內(nèi)存中的當前狀態(tài)和位置,即進程控制塊。未運行的進程必須保持在某種類型的隊列中,并等待它們的執(zhí)行時機。結(jié)構(gòu)中有一個隊列,隊列中的每一項都指向某個特定進程的指針,或隊列可以由數(shù)據(jù)塊構(gòu)成的鏈表組成,每個數(shù)據(jù)塊表示一個進程。如下圖

因此可以用該隊列圖描述分派器的行為。被中斷的進程轉(zhuǎn)移到等待進程隊列中,或者,如果進程已經(jīng)結(jié)束或取消,則被銷毀(離開系統(tǒng))。在任何一種情況下,分派器均從隊列中選擇一個進程來執(zhí)行。

4、進程的創(chuàng)建和終止

進程創(chuàng)建

傳統(tǒng)地,操作系統(tǒng)創(chuàng)建進程的方式對用戶和應用程序都是透明的,這在當代操作系統(tǒng)中也很普遍。但是允許一個進程引發(fā)另一個進程的創(chuàng)建將是很有用的。例如一個程序進程可以產(chǎn)生另一個進程,以接受應用程序產(chǎn)生的數(shù)據(jù),并將數(shù)據(jù)組織成適合以后分析的格式。新進程與應用程序并行的運行,并當?shù)玫叫碌臄?shù)據(jù)時被激活。這個方案對于構(gòu)造應用程序是非常有用的,例如,服務(wù)器進程(如打印服務(wù)器、文件服務(wù)器)可以為它處理的每個請求產(chǎn)生一個新進程。當操作系統(tǒng)為另一個進程的顯式請求產(chǎn)生一個新進程時,這個動作稱為進程派生。

當一個進程派生另一個進程時,前一個稱作父進程,被派生的進程稱作子進程。在典型的情況下,相關(guān)進程需要像話之間通信和合作。對程序員來說,合作是一個非常困難的任務(wù)。

進程終止
以下事件會導致進程終止,尤其注意最后兩種事件。父進程終止與父進程請求終止子進程。

5、進程的五狀態(tài)模型
如果所有的進程都做好了執(zhí)行準備。隊列是先進先出(first-in-first-out)的表,對于可運行的進程處理器以一種輪轉(zhuǎn)(round-robin)方式操作(依次給隊列中的每個進程一定的執(zhí)行時間,然后進程返回隊列,阻塞情況除外)。但是存在著一些非運行狀態(tài)但已經(jīng)就緒等待執(zhí)行的進程,而同時存在另外的一些處于阻塞狀態(tài)等待I/O操作結(jié)束的進程。因此,如果使用單個隊列,分派器不能只考慮隊列中最老的進程,相反,他應該掃描這個列表,查找那些被阻塞且在隊列中時間最長的進程。

解決這種情況的一種比較自然的方法是將非運行狀態(tài)分成兩個狀態(tài):就緒(ready)和阻塞(blocked),此外應該增加兩個已經(jīng)證明很有用的狀態(tài)。

運行態(tài):該進程正在執(zhí)行。假設(shè)計算機只有一個處理器,因此一次最多只有一個進程處于這個狀態(tài)。
就緒態(tài):進程做好了準備,只要有機會就開始執(zhí)行。
阻塞/等待態(tài):進程在某些事件發(fā)生前不能執(zhí)行,如I/O操作完成。
新建態(tài):剛剛創(chuàng)建的進程,操作系統(tǒng)還沒有把它加入到可執(zhí)行進程組中。通常是進程控制塊已經(jīng)創(chuàng)建但還沒有加載到內(nèi)存中的新進程。
退出態(tài):操作系統(tǒng)從可執(zhí)行進程組中釋放出的進程,或者是因為它自身停止了,或者是因為某種原因被取消。

新建態(tài)和退出態(tài)對進程管理是非常有用的。新建狀態(tài)對應于剛剛定義的進程。例如,如果一位新用戶試圖登錄到分時系統(tǒng)中,或者一個新的批作業(yè)被提交執(zhí)行,那么操作系統(tǒng)可以分兩步定義新進程。首先,操作系統(tǒng)執(zhí)行一些必需的輔助工作,將標識符關(guān)聯(lián)到進程,分配和創(chuàng)建管理進程所需要的所有表。此時,進程處于新建狀態(tài),這意味著操作系統(tǒng)已經(jīng)執(zhí)行了創(chuàng)建進程的必需動作,但還沒有執(zhí)行進程。

例如,操作系統(tǒng)可能基于性能或內(nèi)存局限性的原因,限制系統(tǒng)中的進程數(shù)量。當進程處于新建態(tài)時,操作系統(tǒng)所需要的關(guān)于該進程的信息保存在內(nèi)存中的進程表中,但進程自身還未進入內(nèi)存,就是即將執(zhí)行的程序代碼不在內(nèi)存中,也沒有為與這個程序相關(guān)的數(shù)據(jù)分配空間。當進程處于新建態(tài)時,程序保留在外存中,通常是磁盤中。

類似地,進程退出系統(tǒng)也分為兩步。首先,當進程到達一個自然結(jié)束點時,由于出現(xiàn)不可恢復的錯誤而取消時,或當具有相應權(quán)限的另一個進程取消該進程時,進程被終止;終止使進程轉(zhuǎn)換到退出態(tài),此時,進程不再被執(zhí)行了,與作業(yè)相關(guān)的表和其他信息臨時被操作系統(tǒng)保留起來,這給輔助程序或支持程序提供了提取所需信息的時間。一個實用程序為了分析性能和利用率,可能需要提取進程的歷史信息,一旦這些程序都提取了所需要的信息,操作系統(tǒng)就不再需要保留任何與該進程相關(guān)的數(shù)據(jù),該進程將從系統(tǒng)中刪除。

6、UNINX的獨特進程
UNINX 中有兩個獨特的進程。進程0是一個特殊的進程,實在系統(tǒng)啟動時創(chuàng)建的。實際上,這是預定義的一個數(shù)據(jù)結(jié)構(gòu),在啟動時被加載,是交換進程。此外,進程0產(chǎn)生進程1,稱作初始進程,進程1是系統(tǒng)中的所有其他進程的祖先。當新的交互用戶登錄到系統(tǒng)是,由進程1為該用戶創(chuàng)建一個用戶進程。隨后,用戶進程可以創(chuàng)建子進程,從而構(gòu)成一棵分支書,因此任何應用程序都是由一組相關(guān)進程組成的。

7、進程控制結(jié)構(gòu):

此部分對于了解線程特別重要。
此部分對于了解線程特別重要。
此部分對于了解線程特別重要。

一個進程至少包括足夠的內(nèi)存空間,以保存該進程的程序和數(shù)據(jù);此外,程序的執(zhí)行通常涉及用于跟蹤過程調(diào)用和過程間參數(shù)傳遞的棧。最后,與每個進程相關(guān)聯(lián)的還有操作系統(tǒng)用于控制進程的許多屬性,通常:
屬性的集合稱作進程控制塊。
程序、數(shù)據(jù)、棧、屬性的集合稱作進程映像
下圖經(jīng)過了我的重新繪制,希望能夠比書本上更加易懂。

以上為進程控制塊、進程映像的關(guān)系。后續(xù)的文章會繼續(xù)沿著進程、線程的方向去走。爭取整理出一套涉及PHP進程、子進程、線程、協(xié)程的相關(guān)理論與實踐文章。
吃飯去嘍。

轉(zhuǎn)載于:https://www.cnblogs.com/roverliang/p/6146046.html

總結(jié)

以上是生活随笔為你收集整理的PHP 进程详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。