【目錄】 一、操作系統發展史 二、進程發展史及演算法演變 三、多道技術 四、同步非同步/阻塞非阻塞概念 五、創建進程的兩種方式 一、操作系統發展史 1、第一代電腦(1940~1955):真空管和穿孔卡片 (1)特點: 沒有操作系統的概念 所有的程式設計都是直接操控硬體 (2)優點:程式員在申請的時間段 ...
【目錄】
一、什麼是進程
二、進程與程式的區別
三、進程的並行與併發
四、多道技術
五、同步 、非同步 / 阻塞、非阻塞的概念
六、創建進程的兩種方式
一、什麼是進程(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)所謂同步,就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列
。要麼成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。即 在發出一個功能調用時,在沒有得到結果之前,該調用就不會返回。
——例如:啥也不幹,乾等著你,等你一起吃飯
(2)所謂非同步,是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了
。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列
。即 非同步的概念和同步相對。當一個非同步功能調用發出後,調用者不能立刻得到結果。當該非同步功能完成後,通過狀態、通知或回調來通知調用者。
——例如:通知你去吃飯,然後自己先忙別的,等你忙完了再決定吃不吃飯
3、阻塞/非阻塞——描述的程式的運行狀態,即 針對的是進程或線程
阻塞和非阻塞,這兩個概念與程式(線程)等待消息通知(無所謂同步或者非同步)時的狀態有關。
也就是說阻塞與非阻塞主要是程式(線程)等待消息通知時的狀態角度來說的
(1)阻塞
# 阻塞調用是指調用結果返回之前,當前線程會被掛起(如遇到io操作)。函數只有在得到結果之後才會將阻塞的線程激活。
有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。
#舉例:
#1. 同步調用:apply一個累計1億次的任務,該調用會一直等待,直到任務返回結果為止,但並未阻塞住(即便是被搶走cpu的執行許可權,那也是處於就緒態);
#2. 阻塞調用:當socket工作在阻塞模式的時候,如果沒有數據的情況下調用recv函數,則當前線程就會被掛起,直到有數據為止。
(2)非阻塞
# 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻返回,同時該函數不會阻塞當前線程。
五、創建進程的兩種方式
1、類實例化產生對象
# 第一種 from multiprocessing import Process import time def task(name): print('%s is running'%name) time.sleep(3) print('%s is over'%name) if __name__ == '__main__': # 1 創建一個對象 p = Process(target=task, args=('jason',))
# 容器類型哪怕裡面只有1個元素 建議要用逗號隔開 # 2 開啟進程 p.start() # 告訴操作系統幫你創建一個進程 非同步 print('主') """ windows操作系統下 創建進程一定要在main內創建 因為windows下創建進程類似於模塊導入的方式 會從上往下依次執行代碼
linux中則是直接將代碼完整的拷貝一份 """
2、類的繼承 run方法
# 第二種方式 類的繼承 from multiprocessing import Process import time class MyProcess(Process): def run(self): print('hello bf girl') time.sleep(1) print('get out!') if __name__ == '__main__': p = MyProcess() p.start() print('主')
參考資料:
https://www.cnblogs.com/Dominic-Ji/articles/10929384.html
https://zhuanlan.zhihu.com/p/111136095