PHP 進程詳解

PHP 進程詳解

PHP 進程詳解

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

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

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

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

如下圖:

簡化的進程控制塊

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

以上詳細描述請參閱:《操作系統精髓與設計原理》第六版第二章或查看網頁版】

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

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

典型的進程實現方法

圖1

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

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

因此進程被當做數據結構來實現。一個進程可以是正在執行,也可是等待執行。任何時候整個進程狀態都包含在它的執行上下文環境中。這個結構使得可以開發功能強大的技術,以確保在進程中進行協調和合作。在操作系統中可能會設計和并入一些新的功能(優先級,linux中nice值。)這可以通過擴展上下文環境以包括支持這些特征的新信息。

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

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

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

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

兩狀態進程模型

4、進程的創建和終止

進程創建

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

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

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

導致進程終止的原因

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

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

五狀態進程模型

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

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

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

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

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

7、進程控制結構:

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

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

進程映像中的典型元素

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

轉載于:https://www.cnblogs.com/roverliang/p/6146046.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

35. Search Insert Position

public class Solution {public int searchInsert(int[] nums, int target) {int lennums.length;int i0;for(;i<len;i){if(nums[i]>target)break;}return i;} } 轉載于:https://www.cnblogs.com/aguai1992/p/5351442.html

MySQL 后from多個表_MYSQL回顧(多表查詢相關)

前言簡單的數據我們可以直接從一個表中獲取&#xff0c;但在真實的項目中查詢符合條件的數據通常需要牽扯到多張表&#xff0c;這就不得不使用多表查詢。多表查詢分為多表連接查詢、符合條件鏈接查詢、子查詢。多表連接查詢包括內連接、外連接、全連接。符合條件連接查詢本質上…

玩! 框架+ Google Guice

在我目前正在工作的項目中&#xff0c;我們開始使用Google Guice。 對于那些不知道的人&#xff0c; Google Guice是一個依賴項注入框架。 依賴項注入背后的基本思想是提供一個它依賴的類&#xff0c;而不是使依賴類負責實例化它所依賴的對象。 Play具有用于整合Guice的模塊&am…

java都要caps標點_第 1 章 管理 Java CAPS 用戶

第 1 章 管理 Java CAPS 用戶在此處列出的主題提供了有關如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用戶的信息。如果您有任何問題&#xff0c;請參見 http://goldstar.stc.com/ 中的 Java CAPS Web 站點。管理系統信息庫用戶此類別包含以下用…

基于OpenCV 的美顏相機推送直播流

程序流程&#xff1a; 1.圖像采集 先從opencv&#xff08;2.4.10版本&#xff09;采集回來攝像頭的圖像&#xff0c;是一幀一幀的 每一幀圖像是一個矩陣&#xff0c;opencv中的mat 數據結構。 2.人臉的美化 人臉美化&#xff0c;我們用的皮膚檢測&#xff0c;皮膚在顏色空間是特…

Linux驅動開發常用頭文件

頭文件目錄中總共有32個.h頭文件。其中主目錄下有13個&#xff0c;asm子目錄中有4個&#xff0c;linux子目錄中有10個&#xff0c;sys子目錄中有5個。這些頭文件各自的功能如下&#xff1a; 1、主目錄 <a.out.h>&#xff1a;a.out頭文件&#xff0c;定義了a.out執行文件格…

Spring線程池服務

線程池對于執行同步和異步過程非常重要。 本文介紹如何使用Spring開發和監視線程池服務。 創建線程池已通過兩種替代方法進行了說明。 二手技術 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加強守衛,小狐貍背叛

雖然這句話很繞口&#xff0c;其實意思很簡單&#xff0c;那就是之前的隱身藥水沒有什么用&#xff0c;該被打還是被打。因為這個可是害慘了流浪商人&#xff0c;不過這次好了&#xff0c;流浪商人在喝了隱身藥水之后就能安全度過晚上了。NO.3 皮革馬鎧馬鎧是屬于馬的盔甲&…

歐萊雅眉筆banner個人設計

眉筆名稱&#xff1a;眉筆大師三頭塑形眉筆 &#xff0c;之所以沒用吧這個商品名稱放大&#xff0c;是我覺得它是一個名稱&#xff0c;而我把自己想的廣告詞“出彩只需一筆” 放大不僅能凸顯出這只筆的強大&#xff0c;還表示了一種有了我這支眉筆你會更出彩更漂亮&#xff0c…

使用帶有注釋和JQuery的Spring MVC 3的Ajax

與Ajax一起工作對我來說一直很有趣&#xff01; 是不是 &#xff1f; 我將使您輕松將Ajax與Spring MVC 3和JQuery結合使用。 這篇文章將向您說明如何在工業編碼的現實生活中使用Ajax。 和往常一樣&#xff0c;我們將在Spring MVC 3框架中以Ajax的實際示例為例&#xff0c;并將其…

ThinkPHP 3 的輸出

一、ThinkPHP 3 的輸出 &#xff08;重點&#xff09;a、通過 echo 等PHP原生的輸出方式在頁面中輸出b、通過display方法輸出想分配變量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置項TMPL_L_DELIM><{, //修改左定界符TMPL_R_DELIM>}>, //修…

java百度云文件上傳_關于如何在自己項目集成百度云BCE文件上傳STS方案

1、 項目背景由于本人項目需要&#xff0c;需要在視頻點播服務之中需要加載字幕文件(通用格式srt)&#xff0c;經過比較好幾家的公有云服務&#xff0c;最后選擇只有百度云提供字幕服務。字幕&#xff1a;我們通常在觀看外語電影的是&#xff0c;沒有國語版時候只能通過下載字幕…

Java 7 – NIO文件革命

Java 7&#xff08;“項目代幣”&#xff09;已于去年7月問世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;嘗試使用資源–從try塊自動處理可關閉的資源&#xff0c;switch語句中的字符串&#xff0c;用于異常的multicatch以及用于使用泛型的<>運算符。 每個…

hdu 3507 Print Article(斜率優化DP)

題目鏈接&#xff1a;hdu 3507 Print Article 題意&#xff1a; 每個字有一個值&#xff0c;現在讓你分成k段打印&#xff0c;每段打印需要消耗的值用那個公式計算&#xff0c;現在讓你求最小值 題解&#xff1a; 設dp[i]表示前i個字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服務注冊與服務查詢

1、定義一個服務 https://www.consul.io/docs/agent/services.html 該方法是服務注冊中提供服務的最常用的方法。 關于服務的定義&#xff1a;服務的屬性我們會在后邊每出現一個總結一個&#xff0c;最后再做總結。 2、服務注冊 2.1、創建服務文件所存放的文件夾 說明&#xff…

coreos 安裝mysql_CoreOS 在 PC 上快速安裝方法指南

意義能夠以最快的速度安裝部署Linux操作系統。安裝快速簡單&#xff0c;幾乎不花時間就可以開始運行Docker。運行速度非常快。使用內存硬盤。我的情況win8 筆記本偶爾玩游戲&#xff0c;但是裝Linux雙系統可能需要我一天的時間來完成。我的所有業務都只需要在Docker中跑就可以了…

使用ycsb測試cassandra

參考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-with-YCSB https://github.com/brianfrankcooper/YCSB/tree/master/cassandra 創建 表頭 https://gist.github.com/pbailis/3978273  設置field參數 長度和個數 啟動和…

Session 的配置和特性

session的配置 對于session的配置是php.ini中配置 session數據都是保存在文本文件中 設置session文件的保存位置 說明&#xff1a; 默認是保存在windows/temp目錄 設置session保存作為客戶端標識的數據使用cookie 設置session保存客戶端標識的數據&#xff0c;只使用cookie 說明…

OAuth與Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 開放式身份驗證 &#xff09;是一種開放式身份驗證標準。 它允許用戶與其他站點共享存儲在一個站點上的私有資源&#xff08;例如照片&#xff0c;視頻&#xff0c;聯系人列表&#xff09;&#xff0c;而不必發出其憑據&#xff…

flex java 開發環境搭建_Flex+JAVA+BlazeDS開發環境配置(Java工程和Flex工程獨立)

FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立)2019年12月07日閱讀數&#xff1a;7這篇文章主要向大家介紹FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立),主要內容包括基礎應用、實用技巧、原理機制等方面&#xff0c;希望對大家有所幫助。[url]http://blog.csd…