1. 程式人生 > >python3基礎:多程序(一)

python3基礎:多程序(一)

程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎,程序是執行緒的容器。

基本概念

什麼是程序?

程序的概念主要有兩點:

第一,程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼資料區域儲存變數和程序執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令(比如錯誤資訊列印的呼叫關係)和本地變數。

 

第二,程序是一個“執行中的程式”。程式是一個沒有生命的實體,只有處理器賦

予程式生命時,它才能成為一個活動的實體,我們稱其為程序。

程序的特徵

  1. 動態性:程序的實質是程式在多工系統中的一次執行過程,程序是動態產生,動態消亡的。
  2. 併發性:任何程序都可以同其他程序一起併發執行
  3. 獨立性:程序是一個能獨立執行的基本單位,同時也是系統分配資源和排程的獨立單位;
  4. 非同步性:由於程序間的相互制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度執行
  5. 結構特徵:程序由程式、資料和程序控制塊三部分組成。
  6. 多個不同的程序可以包含相同的程式:一個程式在不同的資料集裡就構成不同的程序,能得到不同的結果;但是執行過程中,程式不能發生改變。

程序切換

CPU由運算器,控制器和暫存器組成。運算器是對資料進行加工處理的部件,它不僅可以實現基本的算術運算,還可以進行基本的邏輯運算,實現邏輯判斷的比較及資料傳遞,移位等操作;控制器是負責從儲存器(記憶體和硬碟)中取出指令,確定指令型別及譯碼,按時間的先後順序向其他部件發出控制訊號,統一指揮和協調計算機各器件進行工作的部件;暫存器是CPU內部高速獨立的暫時儲存單元(容量很小)。CPU是按照時間片進行輪詢對程序進行處理的。

程序切換就是從正在執行的程序中收回處理器,然後再使待執行程序來佔用處理器。從某個程序收回處理器,實質上就是把程序存放在處理器暫存器中的中間資料存放在程序的私有堆疊,從而把處理器的暫存器騰出來讓其他程序使用。讓程序來佔用處理器,實質上是把某個程序存放在私有堆疊中暫存器的資料(前一次本程序被中止時的中間資料)再恢復到處理器的暫存器中去,並把待執行程序的斷點送入處理器的程式指標,於是待執行程序就開始被處理器運行了,也就是這個程序已經佔有處理器的使用權了。

一個程序儲存在處理器各暫存器中的中間資料叫做程序的上下文,分為使用者級上下文/暫存器上下文/系統上下文。程序的切換實質上就是被中止執行程序與待執行程序上下文的切換。在程序未佔用處理器時,程序的上下文是儲存在程序的私有堆疊中的。

同步和非同步/阻塞和非阻塞

同步:順序執行

非同步:不需要按順序執行

有依賴關係時只能用同步,沒有依賴關係可同步可非同步

阻塞:正在執行的程序由於提出系統服務請求(如I/O操作),但因為某種原因未得到作業系統的立即響應,或者需要從其他合作程序獲得的資料尚未到達等原因,該程序只能呼叫阻塞原語把自己阻塞,等待相應的事件出現後才被喚醒

非阻塞:無需等待

程序的五態模型

程序執行時的間斷性,決定了程序可能具有多種狀態,一般有以下5種狀態:

  • 新建狀態:

程序剛剛被建立時沒有被提交的狀態,並等待系統完成建立程序的所有必要資訊。 程序正在建立過程中,還不能執行。作業系統在建立狀態要進行的工作包括分配和建立程序控制塊表項、建立資源表格(如開啟檔案表)並分配資源、載入程式並建立地址空間表等。建立程序時分為兩個階段,第一個階段為一個新程序建立必要的管理資訊,第二個階段讓該程序進入就緒狀態。由於有了新建態,作業系統往往可以根據系統的效能和主存容量的限制推遲新建態程序的提交。

  • 就緒狀態(Ready):

程序已獲得除處理器外的所需資源,等待分配處理器資源;只要分配了處理器程序就可執行。就緒程序可以按多個優先順序來劃分佇列。例如,當一個程序由於時間片用完而進入就緒狀態時,排入低優先順序佇列;當程序由I/O操作完成而進入就緒狀態時,排入高優先順序佇列。

  • 執行狀態(Running):

程序佔用處理器資源;處於此狀態的程序的數目小於等於處理器的數目。在沒有其他程序可以執行時(如所有程序都在阻塞狀態),通常會自動執行系統的空閒程序。

  • 阻塞狀態(Blocked):

由於程序等待某種條件(如I/O操作或程序同步),在條件滿足之前無法繼續執行。該事件發生前即使把處理機分配給該程序,也無法執行。注意:當I/O完成或者程序等待的事件發生後,程序進入就緒狀態而不是執行狀態,要等待CPU的輪詢處理

  • 終止狀態

程序已結束執行,回收除程序控制塊之外的其他資源,並讓其他程序從程序控制塊中收集有關資訊(如記帳和將退出程式碼傳遞給父程序)。類似的,程序的終止也可分為兩個階段,第一個階段等待作業系統進行善後處理,第二個階段釋放主存。

 

​​​​​​​程序狀態轉換細分

由於程序的不斷建立,系統資源特別是主存資源已不能滿足所有程序執行的要求。這時,就必須將某些程序掛起,放到磁碟對換區,暫時不參加排程,以平衡系統負載,當條件允許的時候,會被作業系統再次調回記憶體,重新進入等待被執行的狀態即就緒態;程序掛起的原因可能是系統故障,或者是使用者除錯程式,也可能是需要檢查問題。

 

  1. 活躍就緒:是指程序在主存並且可被排程的狀態。
  2. 靜止就緒(掛起就緒):是指程序被對換到輔存時的就緒狀態,是不能被直接排程的狀態,只有當主存中沒有活躍就緒態程序,或者是掛起就緒態程序具有更高的優先順序,系統將把掛起就緒態程序調回主存並轉換為活躍就緒。
  3. 活躍阻塞:是指程序已在主存,一旦等待的事件產生便進入活躍就緒狀態。
  4. 靜止阻塞:是指程序對換到輔存時的阻塞狀態,一旦等待的事件產生便進入靜止就緒。

注意:只要是掛起的程序,也就是靜止就緒或者靜止阻塞的程序都是方法磁碟中的,是不能被直接排程的。被啟用後要先放入記憶體才能排程

​​​​​​​程序的建立過程

原語(原子操作):是由若干條指令組成的,用於完成一定功能的一個過程。具有不可分割性,即原語的執行必須是連續的,在執行過程中不允許被中斷。

一旦作業系統發現了要求建立新程序的事件後,便呼叫程序建立原語Creat()按下述

步驟建立一個新程序。

1) 申請空白PCB(程序控制塊):為新程序申請獲得唯一的數字識別符號,並從PCB集

閤中索取一個空白PCB。

2) 為新程序分配資源:為新程序的程式和資料以及使用者棧分配必要的記憶體空間。顯然此時作業系統必須知道新程序所需要的記憶體大小。

3) 初始化程序控制塊。PCB的初始化包括:

①初始化標識資訊,將系統分配的識別符號和父程序識別符號,填入新的PCB中。

②初始化處理機狀態資訊,使程式計數器指向程式的入口地址,使棧指標指向棧頂。

③初始化處理機控制資訊,將程序的狀態設定為就緒狀態或靜止就緒狀態,將它設定為最低優先順序,除非使用者以顯式的方式提出高優先順序要求。

將新程序插入就緒佇列,如果程序就緒佇列能夠接納新程序,便將新程序插入到就緒佇列中。

​​​​​​​程序的終止過程

  • 引起程序終止的事件

1)正常結束

在任何計算機系統中,都應該有一個表示程序已經執行完成的指示。例如,在批處理系統中,通常在程式的最後安排一條Hold指令或終止的系統呼叫。當程式執行到Hold指令時,將產生一箇中斷,去通知作業系統本程序已經完成。

2)異常結束

在程序執行期間,由於出現某些錯誤和故障而迫使程序終止。這類異常事件很多常見的有:越界錯誤,保護錯,非法指令,特權指令錯,執行超時,等待超時,算術運算錯,I/O故障。

3)外界干預

外界干預並非指在本程序執行中出現了異常事件,而是指程序應外界的請求而終止執行。這些干預有:操作員或作業系統干預,父程序請求,父程序終止。

  • 程序的終止過程

如果系統發生了上述要求終止程序的某事件後,OS便呼叫程序終止原語,按下述過程去終止指定的程序。

1)根據被終止程序的識別符號,從PCB集合中檢索出該程序的PCB,從中讀出該程序狀態。

2)若被終止程序正處於執行狀態,應立即終止該程序的執行,並置排程標誌為真,用於指示該程序被終止後應重新進行排程。

3)若該程序還有子孫程序,還應將其所有子孫程序予以終止,以防他們成為不可控的程序。

4)將被終止的程序所擁有的全部資源,或者歸還給其父程序,或者歸還給系統。

5)將被終止程序(它的PCB)從所在佇列(或連結串列)中移出,等待其它程式來蒐集資訊。

​​​​​​​程序的阻塞過程/喚醒過程

  • 引起程序阻塞和喚醒的事件

1)請求系統服務

當正在執行的程序請求作業系統提供服務時,由於某種原因,作業系統並不立即滿足該程序的要求時,該程序只能轉變為阻塞狀態來等待,一旦要求得到滿足後,程序被喚醒。

2)啟動某種操作

當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則必須先使該程序阻塞,以等待該操作完成,該操作完成後,將該程序喚醒。

3)新資料尚未到達

對於相互合作的程序,如果其中一個程序需要先獲得另一(合作)程序提供的資料才能執行以對資料進行處理,則是要其所需資料尚未到達,該程序只有(等待)阻塞,等到資料到達後,該程序被喚醒。

4)無新工作可做

系統往往設定一些具有某特定功能的系統程序,每當這種程序完成任務後,便把自己阻塞起來以等待新任務到來,新任務到達後,該程序被喚醒。

  • 程序阻塞過程

正在執行的程序,當發現上述某事件後,由於無法繼續執行,於是程序便通過呼叫阻塞原語block把自己阻塞。程序的阻塞是程序自身的一種主動行為。進入block過程後,由於此時該程序還處於執行狀態,所以應先立即停止執行,把程序控制塊中的現行狀態由執行改為阻塞,並將PCB插入阻塞佇列。如果系統中設定了因不同事件而阻塞的多個阻塞佇列,則應將本程序插入到具有相同事件的阻塞(等待)佇列。最後,排程程式進行重新排程,將處理機分配給另一就緒程序,並進行切換。

  • 程序喚醒過程

當被阻塞的程序所期待的事件出現時,如I/O完成或者其所期待的資料已經到達,則由

有關程序(比如,用完並釋放了該I/O裝置的程序)呼叫喚醒原語wakeup,將等待該事件的程序喚醒。喚醒原語執行的過程是:首先把被阻塞的程序從等待該事件的阻塞佇列中移出,將其PCB中的現行狀態由阻塞改為就緒,然後再將該PCB插入到就緒佇列中。

程序的排程演算法

  • ​​​​​​​程序的排程演算法包括:
  1. FIFO(First Input First Output 先進先出法)
  2. RR(時間片輪轉演算法)
  3. HPF(最高優先順序演算法)

python程序

  1. Python中一些程序模組:
  2. os.fork()(只能在linux中使用)
  3. subprocess
  4. processing
  5. Multiprocessing
  1. python中實現程序通訊有以下幾種方式:
  1. 檔案
  2. 管道(Pipes)
  3. Socket
  4. 訊號
  5. 訊號量
  6. 共享記憶體

未完待續。。。

​​​​​​​參考:

https://www.cnblogs.com/xiawen/p/3328033.html