一、穿孔卡片python
讀取速度很慢linux
CPU利用率很低算法
單個用戶(一份代碼)使用編程
二、批處理併發
讀取速度慢app
CPU利用率低異步
聯機(多份代碼)使用函數
效率低操作系統
三、脫機批處理(現代操做系統的設計原理)設計
讀取速度提升
CPU利用率提升
單道:一條道走到黑(串行)
程序 a和b 都要使用CPU,a先使用CPU時,須要等待a使用結束後,b纔開始使用CPU
多道:好比, a和b 都要使用CPU,a先使用CPU時,直到a遇到IO或者執行時間過長時,a會(切換+保存狀態),而後b可使用CPU,直到b遇到IO或者執行時間過長,b會(切換+保存狀態),a再次執行,直到兩個程序結束
IO: input() , output() , time.sleep(), 文件的讀寫,數據的傳輸
空間上的複用:多個程序使用一個CPU
時間上的複用:切換+保存狀態
當執行程序遇到 IO 時,操做系統會將CPU的執行權限剝奪
優勢:CPU的執行效率高
當執行程序時間過長時,操做系統會將CPU的執行權限剝奪
缺點:程序的執行效率低
併發:
在單核(一個CPU)的狀況下,當執行當 a ,b 兩個程序,先運行a時,當a遇到IO時,b開始執行,看着像同時運行
並行:
在多核狀況下,當執行 a ,b 兩個程序,a 與 b 同時執行,真正意義上的同時執行
進程是一個資源單位
程序:一堆代碼文件
進程:執行代碼的過程,稱之爲進程
先來先服務調度算法
a , b 程序,當a 先來a就先執行,一直執行完後b才執行
缺點:執行效率低
短做業優先調度算法
執行時間短的先執行
缺點:致使執行時間長的程序,須要等待全部時間短的程序執行完畢後,才能執行
時間片輪轉法
好比同時有10個程序 ,操做系統給1秒時間,每一個程序分0.1秒運行,未運行完的進入下一次調度
多級反饋隊列
1級隊列:優先級最高,先執行
2級隊列:優先級次之,1級隊列執行完後執行
3級隊列:。。。。
如今的操做系統的進程調度算法:時間片輪轉法+多級反饋隊列
同步與異指的是 提交任務的方式
同步(串行):程序 a和b 都要提交使用CPU,a先提交使用CPU時,須要等待a使用結束後,b才提交開始使用CPU
異步(併發):兩個a,b程序都要提交併執行,假如a先提交併執行,b無需等a執行完畢,就能夠直接提交任務
阻塞(等待):凡是遇到IO都會阻塞
非阻塞(不等待):除了IO都是非阻塞
就緒態:同步與異步已經獲取除CPU之外的全部資源,只要獲取處理機就能立馬執行的狀態
運行態(非阻塞):已經得到處理機,正在執行的狀態,程序的執行時間過長——>將程序返回給就緒態
阻塞態:遇到IO,處於阻塞狀態
同步與異步指的是:提交任務的方式
阻塞與非阻塞:指的是進程的狀態
異步非阻塞:CPU的利用率最大化
強調:在Windows操做系統中因爲沒有 fork ( linux 操做系統中建立進程的機制),在建立子進程的時候會自動 import 啓動它的這個文件,而在 import 的時候又執行了整個文件。所以若是將process()直接寫在文件中就會無限遞歸建立子進程報錯。因此必須把建立子進程的部分使用if __ name__ ==‘ __ main__’ : 判斷保護起來,import 的時候 ,就不會遞歸運行了。
from multiprocessing import Process import time # 方式1:直接調用Process def test_data(name): print(f'start{name}子進程') time.sleep(2) print(f'end{name}子進程') if __name__ == '__main__': # target = 函數地址,args = 函數傳入的參數(元組) obj = Process(target=test_data, args=('Jason',)) # 建立子進程 obj.start() # 等着子進程結束完成後再結束 obj.join() print('主進程')
from multiprocessing import Process import time # 方式2:使用類繼承Process class MyProcess(Process): def run(self): print(f'start子進程') time.sleep(2) print(f'end子進程') if __name__ == '__main__': list2 = [] for i in range(5): obj = MyProcess() obj.start() list2.append(obj) for obj in list2: obj.join() print('主進程結束')