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...