併發編程基礎及進程基礎

併發編程基礎及進程基礎

一、操做系統發展史

一、穿孔卡片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

時間上的複用:切換+保存狀態

  1. 當執行程序遇到 IO 時,操做系統會將CPU的執行權限剝奪

    優勢:CPU的執行效率高

  2. 當執行程序時間過長時,操做系統會將CPU的執行權限剝奪

    缺點:程序的執行效率低

併發與並行

併發:

​ 在單核(一個CPU)的狀況下,當執行當 a ,b 兩個程序,先運行a時,當a遇到IO時,b開始執行,看着像同時運行

並行:

​ 在多核狀況下,當執行 a ,b 兩個程序,a 與 b 同時執行,真正意義上的同時執行

三、進程

一、什麼是進程

進程是一個資源單位

二、進程與程序的區別

程序:一堆代碼文件

進程:執行代碼的過程,稱之爲進程

三、進程調度

  1. 先來先服務調度算法

    a , b 程序,當a 先來a就先執行,一直執行完後b才執行

    缺點:執行效率低

  2. 短做業優先調度算法

    執行時間短的先執行

    缺點:致使執行時間長的程序,須要等待全部時間短的程序執行完畢後,才能執行

  3. 時間片輪轉法

    好比同時有10個程序 ,操做系統給1秒時間,每一個程序分0.1秒運行,未運行完的進入下一次調度

  4. 多級反饋隊列

    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('主進程結束')
相關文章
相關標籤/搜索