作業系統 程序管理(執行緒)

2021-07-31 11:07:28 字數 3048 閱讀 3759

一、基本概念

1.1為什麼需要執行緒

-同一程序的多個執行緒共享乙個位址空間

-建立銷毀比程序快

-多個執行緒都是cpu密集型,不能獲得效能增強,存在大量計算和i/o密集型,會有極高效率

-最關鍵的一點是:乙個程序中存在著多個可以同時執行的小任務(相比於程序而言),這些小任務可以通過執行緒並行執行

1.2執行緒模型

-暫存器,程式計數器,狀態

-堆疊,記錄執行歷史,每一幀儲存乙個已呼叫但未返回的過程

-程序集中資源,執行緒是cpu排程執行的實體

-同一程序有多個執行緒在「並行」執行,cpu在多個執行緒間切換執行,在乙個有三個計算密集型的cpu 中,每個執行緒的cpu是真實cpu速度的三分之一

-所有執行緒享有同一位址空間,共享全域性變數,乙個執行緒可以更改另乙個執行緒的堆疊

1.3執行緒狀態

-執行:擁有cpu

-阻塞:等待外部事件發生,等待其他執行緒釋放

-就緒:可被隨時排程執行

每個執行緒有自己的堆疊,每個堆疊有一幀,共各個被呼叫但是還沒有從中返回的過程使用,該幀中存放響應過程的區域性變數以及返回位址。每個執行緒有不同的呼叫過程,從而有不同的執行歷史,這是每個執行緒需要堆疊的原因

二、執行緒實現

2.1多執行緒執**況

-程序先從當前的單個執行緒開始,此執行緒有能力呼叫庫函式建立新執行緒thread_create。新執行緒會自動在建立現成的位址空間中執行。建立新執行緒會返回乙個執行緒識別符號(執行緒名字)

-執行緒完成工作,呼叫庫函式退出thread_exit。有時,通過呼叫類似於thread_join乙個執行緒等待乙個特定的執行緒退出,這個過程阻塞呼叫執行緒直至另乙個執行緒退出

-thread_yield,允許執行緒自動放棄cpu,讓另外乙個執行緒執行。執行緒無法利用cpu時鐘中斷強制執行緒讓出cpu。

2.2posix執行緒

-為了實現執行緒程式的可移植(程序不討論可移植性),ieee標準做了規定了執行緒包pthread

-執行緒包包含乙個識別符號,一組暫存器,一組存在結構中的屬性(堆疊大小,排程引數,其他專案)

-pthread_create建立,返回執行緒識別符號

-pthread_exit終止,釋放執行緒的棧

-pthread_join一般乙個執行緒在繼續執行前需要等待另外乙個執行緒完成工作並退出

-pthread_yield執行緒讓出cpu

-pthraed_attr_init建立關聯乙個執行緒的屬性結構並預設初始化,這些值可以修改(例如優先順序)

-pthread_attr_destroy刪除乙個執行緒的屬性結構

2.3在使用者空間實現執行緒

-阻塞系統呼叫的實現:乙個執行緒使用了阻塞系統呼叫,阻礙了其他執行緒執行。我們現在面臨的問題是,既需要讓每個執行緒有阻塞系統呼叫,也要避免影響到其他執行緒

解決辦法:某個系統呼叫會阻塞,提前通知。比如:unix有一種系統呼叫select呼叫,產看read操作是否會阻塞,不會阻塞呼叫,阻塞的話就不呼叫,轉而執行另外乙個執行緒,下一次再檢查read是否安全。(書上說這個辦法要重寫系統呼叫庫,不好。我不太清楚這個過程)。在系統呼叫周圍從事檢查的**是包裝器

-頁面故障問題:乙個使用者級執行緒引起頁面故障,核心無法知道該執行緒的存在,通常阻塞程序。儘管其他的執行緒可以執行

-沒有時鐘中斷,乙個執行緒占用cpu,只能自己放棄使用權。執行緒按照自己的意志進入執行時系統去呼叫排程程式,執行其他執行緒。

-程式設計師通常在發生執行緒阻塞的應用中使用多執行緒。對於cpu密集型而且極少阻塞的程式時,不使用多執行緒。

2.5在核心中實現執行緒

-使用者及執行緒與核心級執行緒多路復用(不清楚具體實現)

2.7排程程式啟用機制

-目標改進核心級執行緒的速度的機制,模擬核心級執行緒的功能,為執行緒包提供使用者空間級別的效能。

-(書上說的看不清楚,網上搜的別人的看法)排程啟用使得當核心覺得要排程使用者執行緒時會通知使用者執行緒。在核心裡面相關的核心事件會導致使用者執行緒排程器重新決定排程事宜,決定哪個執行緒應該執行在哪個虛擬cpu上。這個機制通過引進乙個新的名叫upcall的系統呼叫來實現。upcall是乙個核心到應用的呼叫,和傳統的應用呼叫核心服務的 downcall相反。核心就是利用排程啟用來實現upcall的,乙個排程啟用是乙個和傳統核心執行緒一樣的執行環境上下文。事實上,排程啟用在好多系統 的實現正是利用了核心執行緒,只是加上了upcall。在傳統的核心執行緒,都要指派給它自己乙個函式,然後交給作業系統執行,排程啟用正好相反,它是操作系 統覺得要用排程啟用時,就會先建立乙個排程啟用,然後開始執行乙個事先指定好的使用者函式

2.8彈出式執行緒

-分布式系統常用執行緒。如服務請求:把乙個執行緒阻塞在receive系統呼叫上,等待訊息到來。另一種方法,訊息的到達導致系統建立執行緒(彈出式執行緒)。

-好處:沒有暫存器,堆疊等,每乙個執行緒都一樣,可以快速建立。訊息的到達與處理間隔很短

-在核心空間中的彈出式執行緒比使用者空間的快。

(。。。。。很簡略)

2.9單執行緒**多執行緒化

-乙個執行緒的**入程序一樣,通常包含多個過程,有區域性變數,全域性變數,過程引數。這裡全域性變數會產生問題,對執行緒是全域性的,並不是對整個程式是全程的。某些變數之所以是全域性的,由於執行緒中的許多過程使用某些變數。

-解決辦法:1.為每乙個執行緒賦予私有全域性變數。但多數語言沒有介於區域性與全域性變數的型別,可以當作引數傳遞,把區域性變數變為私有全域性變數。2。引入新的庫過程,建立設定讀取私有全域性變數。例如:create_global(「bufptr」),在堆上,或專門為執行緒保留的區域內替bufptr指標分配記憶體,只有呼叫執行緒可訪問,其他執行緒同名的會在不同的儲存單元,不衝突。(執行緒不是共享位址空間嗎?這裡不是很理解)

-(。。。。還有其他許多問題,這裡就不提了,開始學不要迷失在細節裡),這裡想說的是:在已有的系統中引入執行緒而不重新設計系統是不行的。

作業系統01 程序和執行緒管理

1.併發和並行 並行是多個事件在同一時刻發生,併發是多個事件在同一時間間隔內發生。2.作業系統的基本特徵 3.什麼是程序?程式是指令和資料的有序集合,程序是程序實體 程式段 資料段 pcb 在處理機上的一次執行過程。程序是系統資源分配和排程的乙個獨立單位。引入程序是為了程式併發執行,以提高資源利用率...

作業系統 程序管理

程序 申請資源和排程資源的基本單位,乙個程序就是乙個程式的乙個執行過程。是乙個動態的概念,在不同的作業系統中,會有不同的程序出現。程式 靜態概念,是指令和資料的集合,可長期儲存。程序與程式對應關係 乙個程式可以對應乙個程序或者多個程序 乙個程序可以對應乙個程式,或者一段程式 程序由程式,資料集合,程...

作業系統 程序管理

1.程序描述 2.程序狀態 2.2 程序狀態變化模型 2.3 程序掛起模型 2.4 程序控制 3.執行緒 4.ipc 5.程序互斥與同步 乙個程式在乙個資料集合上的一次動態執行過程。程式 演算法 資料結構 與程式的區別 併發concurrency 一段時間內有多個程序執行 並行parallelism...