IO密集型和計算密集型、線程和進程


io密集型:有阻塞的狀態,就是一直會執行CPU(中間就一個等待狀態,這個就叫做IO密集型)。例如:sleep狀態

計算密集型任務:沒有等待的狀態就是計算密集型,從上到下執行沒有等待。

在Python中沒法同時使用多個CPU,在同一時刻,多個線程是互相搶占資源的,在cpython運行中加了一把鎖(GIL)。

如果任務是IO密集型的可以使用多線程(阻塞等待時,就是放GIL,給另一個線程執行的機會)

如果是計算密集型任務時,無法使用多線程(如果遇到CPU密集型的線程,一只占用CPU,不會被I/O阻塞)

全局解釋鎖(GIL):就是一個互斥體,只允許一個線程來控制Python解釋器。

線程是操作系統調度的最小單元,進程是操作系統分配存儲資源的最小單位。

進程:進程表示一個邏輯控制流,就是一種計算過程,他造成一種假象,好像這個進程在獨占CPU資源,進程擁有一個獨立虛擬內存地址空間。

並發的本質是在時間上重疊多個邏輯流,也就是說同時運行多個邏輯流,並發編程要解決一個很重要的問題就是對資源的並發訪問問題,也就是共享資源問題,而兩個進程很難在邏輯上共享資源。

線程解決的最大問題就是他可以很簡單的表示共享資源問題,也就是存儲器資源,資源最后都要加載到物理內存,一個進程的所有線程都是共享這個進程的同一個虛擬地址空間的,也就是從線程的

角度來說,他們看到的物理資源都是一樣的,這樣就可以通過共享變量的方式來表示共享資源,也就是直接共享內存的方式解決了線程通信的問題,而線程也表示一個獨立的邏輯流,這樣就解決了

進程的一大難題。

 

進程采用fork創建,線程采用done創建。

進程fork創建的子進程的邏輯流位置在fork返回的位置,線程done創建的KSE的邏輯流位置在done調用傳入的方法位置。

進程擁有獨立的虛擬內存地址空間,和內核數據結構(頁表打開文件表等),當子進程修改了虛擬頁之后,會通過寫時拷貝創建真正的物理頁。線程共享進程的虛擬地址空間和內核數據結構,共享同樣的物理頁。

多個進程通信只能采用進程間通訊的方式,比如信號、管道而不能直接采用簡單的共享內存方式,原因是每個進程維護獨立的虛擬內存空間,所以每個進程的變量采用的虛擬地址是不同的。多個線信通信就很簡單

直接采用共享內存的方式,因為不同線程共享一個虛擬內存地址空間,變量尋址采用同一個虛擬內存。

進程上下文切換需要切換頁表等重量級資源,線程上下文切換只需要切換寄存器等輕量級數據

進程的用戶棧獨享棧空間,線程的用戶棧共享虛擬內存中的棧空間,沒有進程高效

一個應用程序可以有多個進程,執行多個程序代碼,多個線程只能執行一個程序代碼,共享進程的代碼段

進程采用父子結構,線程采用對等結構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM