二 程序與執行緒

2021-07-11 13:44:19 字數 1239 閱讀 5232

2.1  程序

現代計算機會在同一時間做許多事,需要一些方法控制這些併發的事情。在某一瞬間,cpu只能執行乙個程序,但是在較短時間內可以執行多個程序,被稱為偽並行。而多處理器系統能夠實現真正的硬體並行。

乙個程序就是乙個正在執行的程式的例項,包括程式計數器、暫存器和變數的當前值。實際只有乙個物理程式計數器,但每個程序都有自己的邏輯程序計數器。

主要導致程序建立的事件:

系統初始化

正在執行的程序呼叫程序建立系統呼叫

使用者請求建立

批處理作業的初始化

主要終止條件:

正常退出

出錯退出

嚴重錯誤

被其他程序殺死       

程序的狀態

執行態(實際占用cpu)

就緒態(可執行,但有其他程序正在執行)

阻塞態(等待某種外部事件發生)

三種狀態間有四種可能地轉換關係。

2.1.1 程序的實現

作業系統維護著一張程序表,每個程序占用乙個表項,包括暫存器、程式計數器、堆疊指標、記憶體分配狀況、所開啟的檔案狀態、賬號、排程資訊、有執行態裝換到就緒態或阻塞態所必須的資訊(這些資訊保證該程序隨後能再次啟動,並像從未被中斷過一樣)等。

多道程式設計的cpu利用率技術

2.2 執行緒

執行緒中有程式計數器(記錄接著要執行哪一條指令)、暫存器(儲存當前的工作變數)、堆疊(記錄執行歷史,已呼叫還沒有返回的過程)

程序用於把資源集中到一起,而執行緒則是在cpu中被排程執行的實體。所有執行緒都有完全一樣的位址空間,共享同樣的全域性變數,讀寫甚至清除另乙個執行緒的堆疊。每個執行緒自己的內容:程式計數器、暫存器、堆疊、狀態。

2.2.1 執行緒的實現

1.使用者空間

把執行緒包放在使用者空間中,核心對執行緒包一無所知。這種方法的好處:可以在不支援執行緒的作業系統上實現;執行緒切換速度比核心實現要快;允許每個程序有自己的執行緒排程演算法。

在使用者空間管理執行緒時,每個經常需要有專用的執行緒表用來跟蹤該程序中的執行緒,類似程序表,不過僅記錄執行緒的程式計數器、堆疊指標、暫存器和狀態等。

缺點:阻塞系統難以實現;頁面故障問題;執行緒永久執行問題(乙個單獨的程序內部沒有時鐘中斷)

2.核心

核心中有用來記錄系統中所有執行緒的執行緒表(程序表仍然存在),系統呼叫通過對執行緒表的更新完成建立或撤銷執行緒的工作。核心執行緒不需要任何新的、非阻塞系統呼叫,也可以解決頁面故障問題。

3.混合實現

核心只識別核心級執行緒,並對其進行呼叫。其中一些核心級執行緒會被多個使用者級執行緒多路復用。

(二)程序與執行緒的區別

首先來一句概括的總論 程序和執行緒都是乙個時間段的描述,是cpu工作時間段的描述。乙個最最基礎的事實 cpu太快,太快,太快了,暫存器僅僅能夠追的上他的腳步,ram和別的掛在各匯流排上的裝置完全是望其項背。那當多個任務要執行的時候怎麼辦呢?輪流著來?或者誰優先順序高誰來?不管怎麼樣的策略,一句話就是...

程序與執行緒(二)

linux中的執行緒機制十分特殊,從核心的角度來說並沒有執行緒的概念,故沒有為執行緒單獨定義資料結構,通過clone 建立的linux執行緒,僅被看做乙個與其他程序共享某些資源的特殊程序而已 linxu中把執行緒分為核心執行緒,核心支援的使用者執行緒和執行緒庫支援的使用者執行緒等3種型別 1 核心執...

執行緒丶程序丶協程(二)程序 2

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool時,可以指定乙個最大程序數,當有新的請求提交到poo...