【目錄】
一、什么是行程
二、行程與程式的區別
三、行程的并行與并發
四、多道技術
五、同步 、異步 / 阻塞、非阻塞的概念
一、什么是行程(Process)
# 行程(Process)是計算機中的程式關于某資料集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是作業系統結構的基礎,
簡單地說,行程 就是 正在進行的一個程序或者說一個任務,而負責執行任務則是cpu,
在早期面向行程設計的計算機結構中,行程是程式的基本執行物體;
在當代面向執行緒設計的計算機結構中,行程是執行緒的容器,程式是指令、資料及其組織形式的描述,行程是程式的物體,
# 狹義定義:行程是正在運行的程式的實體(an instance of a computer program that is being executed),
# 廣義定義:行程是一個具有一定獨立功能的程式關于某個資料集合的一次運行活動,
# 作業系統引進行程概念的原因:
從理論角度看,是對正在運行的程式程序的抽象;
從實作角度看,是一種資料結構,目的在于清晰地刻畫動態系統的內在規律,有效管理和調度進入計算機系統主存盤器運行的程式,
二、行程與程式的區別
程式僅僅只是一堆代碼而已,而行程指的是程式的運行程序,
需要強調的是:同一個程式執行兩次,那也是兩個行程,比如打開暴風影音,雖然都是同一個軟體,但是一個可以播放李健,一個可以播放周杰倫,
三、行程的并行與并發 
(1)并行 : 并行是指兩者同時執行,
只有具備多個cpu才能實作并行;資源夠用,比如三個執行緒,四核的CPU )
比如賽跑,兩個人都在不停的往前跑,
(2)并發 : 并發是指資源有限的情況下,兩者交替輪流使用資源,
并發是偽并行,即看起來是同時運行,單個cpu+多道技術就可以實作并發,(并行也屬于并發)
比如一段路(單核CPU資源)同時只能過一個人,A走一段后,讓給B,B用完繼續給A ,交替使用,目的是提高效率,
(3)區別:
并行是從微觀上,也就是在一個精確的時間片刻,有不同的程式在執行,這就要求必須有多個處理器,
并發是從宏觀上,在一個時間段上可以看出是同時執行的,比如一個服務器同時處理多個session,
四、多道技術——空間上的復用+時間上的復用
1.產生背景:針對單核,實作并發
ps: 現在的主機一般是多核,那么每個核都會利用多道技術 有4個cpu,運行于cpu1的某個程式遇到io阻塞,
會等到io結束再重新調度,會被調度到4個 cpu中的任意一個,具體由作業系統調度演算法決定,
2.空間上的復用:如記憶體中同時有多道程式
3.時間上的復用:復用一個cpu的時間片
強調:遇到io切,占用cpu時間過長也切,核心在于切之前將行程的狀態保存下來,
這樣 才能保證下次切換回來時,能基于上次切走的位置繼續運行
五、同步 、異步 / 阻塞、非阻塞的概念
1、行程三態——就緒態,運行態,阻塞態

在程式運行的程序中,由于被作業系統的調度演算法控制,程式會進入幾個狀態:就緒,運行和阻塞,
(1)就緒(Ready)狀態
當行程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的行程狀態稱為就緒狀態,
(2)執行/運行(Running)狀態
當行程已獲得處理機,其程式正在處理機上執行,此時的行程狀態稱為執行狀態,
(3)阻塞(Blocked)狀態
正在執行的行程,由于等待某個事件發生而無法執行時,便放棄處理機而處于阻塞狀態,引起行程阻塞的事件可有多種,
例如,等待I/O完成、申請緩沖區不能滿足、等待信件(信號)等,

2、同步/異步——描述的是任務的提交方式,即 針對的是函式/任務的呼叫方式
(1)所謂同步,就是一個任務A 的完成需要依賴另外一個任務B 時,只有等待被依賴的任務B 完成后,依賴的任務A 才能算完成,這是一種可靠的任務序列,要么成功都成功,失敗都失敗,兩個任務的狀態可以保持一致,即 在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會回傳,
——例如:啥也不干,干等著你,等你決定好了 再一起吃飯
(2)所謂異步,是不需要等待被依賴的任務B 完成,只是通知被依賴的任務B 要完成什么作業,依賴的任務A 也立即執行,只要自己完成了,整個任務就算完成了,至于被依賴的任務B 最終是否真正完成,依賴它的任務A 無法確定,所以它是不可靠的任務序列,即 異步的概念和同步相對,當一個異步功能呼叫發出后,呼叫者不能立刻得到結果,當該異步功能完成后,通過狀態、通知或回呼來通知呼叫者,
——例如:通知你去吃飯,然后自己先忙別的,等忙完了,再決定是否一起吃飯,可能自己到后面先去吃飯
3、阻塞/非阻塞——描述的程式的運行狀態,即 針對的是行程或執行緒
阻塞和非阻塞,這兩個概念與程式(執行緒)等待訊息通知(無所謂同步或者異步)時的狀態有關,
也就是說阻塞與非阻塞主要是程式(執行緒)等待訊息通知時的狀態角度來說的
(1)阻塞
# 阻塞呼叫是指呼叫結果回傳之前,當前執行緒會被掛起(如遇到io操作),函式只有在得到結果之后才會將阻塞的執行緒激活,
有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的,對于同步呼叫來說,很多時候當前執行緒還是激活的,只是從邏輯上當前函式沒有回傳而已,
#舉例:
#1. 同步呼叫:apply一個累計1億次的任務,該呼叫會一直等待,直到任務回傳結果為止,但并未阻塞住(即便是被搶走cpu的執行權限,那也是處于就緒態);
#2. 阻塞呼叫:當socket作業在阻塞模式的時候,如果沒有資料的情況下呼叫recv函式,則當前執行緒就會被掛起,直到有資料為止,
(2)非阻塞
# 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻回傳,同時該函式不會阻塞當前執行緒,
參考資料:
https://www.cnblogs.com/Dominic-Ji/articles/10929384.html
https://zhuanlan.zhihu.com/p/111136095
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155318.html
標籤:Python
