答:我們先說一下程序:
在早期未引入程序的os中,
例如多機處理系統中,併發執行程式的話(由於併發程式的速度不同與資源競爭導致其執行程式的間斷),其會造成資料的不可再現,這樣的程式失去其意義。
後來呢為了使得程式能併發執行且有效地對併發程式進行控制與描述,引入了程序的概念。
引入程序的os:
程式在執行前,系統為之分配乙個pcb(程序控制塊:系統通過pcb對程序控制與描述),與程式段和程式相關的資料一起構成了程序實體。
而程序的實質就是指程序實體的一次執行過程。且它是資源分配和排程的基本單位。
我們來說一下執行緒:
程序呢,是乙個資源的擁有者,因而在建立,銷毀,切換程序時,系統付出的時空開銷都很大,因此系統的程序數量不宜多,這限制了併發程度的提高。
後來呢,為了讓更多程式更好的併發執行且儘量減少系統的開銷,不少os的學者想到將程序的兩個屬性分開,
由os分開處理,(輕裝上陣:對可排程和分派的基本單位,不作為擁有資源的單位) 和 (擁有資源的基本單位,又不對之進行頻繁的切換),這種思路導致了執行緒的出現。
引入了執行緒的os:
乙個程序至少有乙個執行緒:
執行緒作為乙個可排程和分派的基本單位(利用cpu的基本單位),其幾乎不擁有資源(必要的tcb),對其建立,銷毀,切換開銷十分小,且易於排程,進而提公升了系統併發程度,且有利於發揮多處理器的功能。
程序作為系統資源分配的單位,為其多個執行緒提供資源,其已經不能作為可執行的實體,我們看到的執行的程序其實執行的是乙個主線程。
我們從程序與執行緒的 排程,併發,擁有資源 和 系統開銷 來對其進行區分和比較:
排程:併發性:
擁有資源:
系統開銷:
程序同步主要任務:對多個相關程序在執行次序上進行協調,以使併發執行的諸程式之間能有效地共享資源和相互合作,從而使程式執行具有再現性。
訊號量機制:作為其程序間與程序間不同執行緒間同步與互斥的主要手段,訊號量用於表示資源數目的整型量 s,僅通過兩個標準的原子操作(atomic operator)wait(s)和signal(s)來訪問。
管程機制:基於訊號量的 抽象資料結構,裡面定義了乙個資料結構和能為併發程序所執行(在該資料結構上)的一組操作,這組操作能同步程序和改變管程中的資料。
低階通訊(可傳送訊息少):
高階通訊(可傳送訊息量多):
執行緒間的併發同樣需要同步機制來協調執行,保證其結果的正確性。
使用者態切換到核心態的3種方式:系統呼叫、異常、外圍裝置中斷。
根據os核心是否對其執行緒感知,可以分為使用者級執行緒與核心支援執行緒。
核心支援執行緒(kst):核心空間為每乙個核心支援執行緒設定了執行緒控制塊(其tcb儲存在核心中),核心根據該控制塊感知到某個執行緒的存在,並對其加以控制。
使用者級執行緒ult(user level threads)僅存在於使用者空間中,無須系統呼叫來實現其功能,也無需核心的支援。
區別 :
執行緒管理方面:核心支援執行緒是由核心進行管理的,而使用者級執行緒是由所在程序管理。
執行緒切換方面:使用者級執行緒切換不需要進入核心空間,節省了模式切換開銷和核心寶貴資源,而核心支援執行緒在核心支援下切換,其因具有非常輕量的資料結構,其切換非常快,開銷也很小。
阻塞處理方面:當核心支援執行緒進行系統呼叫阻塞了,核心可排程程序的其他執行緒占有處理器執行,但在使用者級執行緒在系統呼叫時被阻塞了,(大多數系統呼叫都會阻塞其使用者程序)代表了其程序被阻塞了,程序內的所有執行緒都會被阻塞,
但在執行使用者的執行緒切換時,其切換代價大,需要從使用者態轉換到核心態進行,代價很大。
親身經歷的 noshow 與 goshow
背景 航班起飛前24小時,航班初始化的時候,訂座系統會將該航班所有訂座旅客資訊傳送到離港系統,這個資訊是根據 pnr 每位乘客的訂票記錄稱為pnr 來傳送的。之後的24小時裡,此航班的訂座記錄如果有變動,訂座系統隨時通知離港,所以到辦理值機手續時,離港所能看到的旅客名單,就是當時在訂座系統中有訂座記...
微軟面試都考些什麼 親身經歷
做乙個簡單的自我介紹 技術,工作經驗等等 1.各種排序演算法 冒泡,選擇,插入,快速,堆排序 靈活性很大.不會照搬課本.比如,返回陣列中第k大的元素 2.字串各種常用操作,要求寫函式.比如 字串逆序,判斷字串中有無出現重複字元.單詞逆序.3.實現atof,atoi,設計測試用例.有可能讓敲在電腦上測...
面試題 程序 執行緒的區別
程序通訊方式 ipc 管道 訊息佇列 共享記憶體 訊號量 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 sem...