實現執行緒的兩種方式

2021-10-10 14:28:51 字數 1592 閱讀 3723

起初,作業系統中只有程序的概念,人們那時候對併發沒有太高的要求。後來有些人想提高程式的井發,這才有了執行緒這一新生事物。任何新生事物在誕生之初都會被小心謹慎地對待,人們提出執行緒的需求時,作業系統也抱著「圍觀」的心態不敢輕舉妄動,只能坐看其發展,真正待需求明朗時才會在作業系統一級來實現。想想也是,如果稍微有個新需求就往核心裡面塞,核心開發成本很高不說,至少核心中肯定有很多「不切實際」的功能,所以人們還是能夠體諒作業系統研發廠商的.

為此,既然不能說服作業系統支援執行緒,人們只好在使用者程序內想辦法。所以,執行緒的實現就有兩種

方式,要麼由作業系統原生支援,使用者程序通過系統呼叫使用執行緒,要麼作業系統不支援執行緒,由程序自己想辦法解決. 因此,執行緒要麼在0特權級的核心空間中實現,要麼在3特權級的使用者空間實現。

強調下,這裡所說的「在0特權級的核心空間中實現執行緒」,只是說執行緒機制由核心來提供,並不是說執行緒中所執行的**也必須是0特權級的核心級**,也可以是3特權級的使用者級**,核心畢竟是為使用者程序提供服務的。而「在3特權級的使用者空間實現執行緒是指執行緒機制由使用者程序自己提供,相當於使用者程序除了負責業務外,還要在程序中實現執行緒排程器,這樣一來程式設計師負擔比較重,所以通常情況下很有程式設計師願意在程序中寫執行緒機制 ,故標準庫便提供了使用者級執行緒庫,程式設計師直接使用標準執行緒庫就行了。使用者特權級是3 ,因此執行緒中只能執行自己程序內的**,即只能同級呼叫,不能呼叫0特權的核心**。總之,無論執行緒機制是由核心,還是使用者程序提供,都是為使用者程序服務的,執行緒中必須可以執行使用者的**。

下面看看由這兩類提供方實現的執行緒各自的優缺點。

執行緒僅僅是個執行流,在使用者空間,還是在核心空間實現它,最大的區別就是執行緒表在**,由誰來排程它上處理器. 如果執行緒在使用者空間中實現,執行緒表就在使用者程序中,使用者程序就要專門寫個執行緒用作執行緒排程器,由它來排程程序內部的其他執行緒。如果執行緒在核心空間中實現,執行緒表就在核心中,該執行緒就會由作業系統的排程器統一排程,無論該執行緒屬於核心,還是使用者程序。

使用者空間中實現執行緒的好處是可移植性強,由於是使用者級的實現,所以在不支援執行緒的作業系統上也可以寫出完美支援執行緒的使用者程式。

原理很簡單,在使用者空間中實現執行緒,作業系統根本就不會意識到執行緒的存在,因為作業系統排程器只會以整個程序的方式排程,將處理器的使用權交給這個程序,由程序中的排程器自己去協調分配處理器時間

無論執行緒在**實現,目的都是要到處理器上執行,因此必然要考慮到執行緒排程的問題,這涉及到排程器及執行緒表

如果在使用者空間中實現執行緒,使用者執行緒就要肩負起排程器的責任,因此除了要實現程序內的執行緒排程器外,還要自己在程序內維護執行緒表

在使用者程序中實現執行緒有以下優點和缺點:

執行緒在使用者空間實現,和在核心空間實現相比,只是在內部排程時少了陷入核心的代價,確實相當於提速,但由於整個程序佔據處理器的時間片是有限的,這有限的時間片還要再分給內部的執行緒,所以每個執行緒執行的時間片非常非常短暫,再加上程序內線程排程器維護執行緒表、執行排程演算法的時間片消耗,反而抵銷了內部排程帶來的提速

摘自作業系統真象還原9.1.5節

執行緒實現的兩種方式

1.程序和執行緒的定義 1.1 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的乙個獨立單位.1.2 執行緒是程序的乙個實體,是cpu排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資...

多執行緒兩種實現方式

public class testthread1 extends thread public static void main string args 執行結果如下 可見執行緒由cpu隨機排程的。public class testthread2 extends thread override pub...

實現多執行緒的兩種方式

一 什麼是執行緒?定義 執行緒是程序中的乙個執行單元,負責當前程序中程式的執行,乙個程序中至少有乙個執行緒。乙個程序中是可以有多個執行緒的,這個應用程式也可以稱之為多執行緒程式。簡而言之 乙個程式執行後至少有乙個程序,乙個程序中可以包含多個執行緒 二 怎麼實現多執行緒?下面的兩種方式婦孺皆知 1.繼...