Python 程序,執行緒, 協程

2022-05-07 07:18:06 字數 1617 閱讀 4531

程序是系統進行資源分配和排程的乙個獨立單位(最小單位)。

程序的幾個狀態

空->新建:建立執行乙個程式的新程序,可能的事件有:新的批處理作業、互動登入(終端使用者登入到系統)、作業系統因為提供一項服務而建立、由現有的程序派生等。

新建->就緒:作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。

就緒->執行:需要選擇乙個新程序執行時,作業系統的排程器或分配器根據某種排程演算法選擇乙個處於就緒態的程序。

執行->退出:導致程序終止的原因有:正常完成、超過時限、系統無法滿足程序需要的記憶體空間、程序試圖訪問不允許訪問的記憶體單元(越界)、算術錯誤(如除以0或儲存大於硬體可以接納的數字)、父程序終止(作業系統可能會自動終止該程序所有的後代程序)、父程序請求終止後代程序等。

執行->就緒:最常見的原因是,正在執行的程序到達了「允許不中斷執行」的最大時間段,該把處理器的資源釋放給其他在就緒態的程序使用了;還有一中原因可能是由於具有更改優先順序的就緒態程序搶占了該程序的資源,使其被中斷轉換到就緒態。

執行->阻塞:如果程序請求它必須等待的某些事件,例如乙個無法立即得到的資源(如i/o操作),只有在獲得等待的資源後才能繼續程序的執行,則進入等待態(阻塞態)。

阻塞->就緒:當等待的事件發生時,處於阻塞態的程序轉換到就緒態。

執行緒是需要維護執行緒棧的

執行緒的排程是在核心態執行的(核心要安排cpu給執行緒使用----由程序來排程)

作業系統是看不見執行緒的(作業系統控制程序,而程序排程執行緒)

什麼是使用者態,什麼又是核心態?

使用者態:當乙個程序在執行使用者自己的**時處於使用者狀態

核心態:當乙個程序因為系統的呼叫陷入核心**中執行處於核心執行態

執行緒和程序共享棧資料之外的所有資料

執行緒與資源分配無關,它屬於某乙個程序,並與程序內的其他執行緒一起共享程序的資源

為什麼說切換執行緒需要資源的開銷?

執行緒中的**是在使用者態執行

執行緒的切換會導致使用者態和核心態切換,所以需要資源的開銷。

只是切換的時候在核心態,有沒有方法實現,切換的過程也在使用者態呀?

有----協程

協程的**時程式設計師自己寫的,協程的切換不需要程序干涉,完全由程式設計師自己做主,

換句話說,協程的排程與程序無關,即與作業系統無關,與核心無關。

執行緒與協程的特點?

執行緒的切換需要擦歐總系統的干涉(因為執行緒的切換需要程序排程)

協程的切換不需要作業系統的干涉(因為協程的切換不需要程序排程,完全由程式設計師寫的**排程)

說說程序和執行緒之間的區別?

協程的優勢:上下文執行狀態都在生成器中維護,不需要維護協程棧

asyncio使用的是事件迴圈——eventloop,記錄所有協程任務並計畫何時執行

協程的思想:主動讓出控制權,恢復控制權

Python 程序 執行緒 協程

程序和執行緒之間的關係 執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊 如程式計數...

程序 執行緒 協程

多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...

程序 執行緒 協程

程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...