作業系統 執行緒

2022-07-24 07:57:10 字數 1323 閱讀 2207

之前已經討論過程序了,現在討論執行緒。我在想如何用現實中的具體事物來比較程序和執行緒的關係。

舉個我認為較恰當的例子。把程序比作乙個工廠中的車間,車間中有若干個生產線,但是每條生產線都需要不同的零件,原料和員工。零件,原料和員工,是所有生產線都可以共同使用的資源。這裡就把生產線當做執行緒吧。這樣,每條生產線就只用管自己的生產過程。

就如討論程序一樣,這裡還是列舉一下執行緒所包含的實體。

program counter

register

statck

state

不難發現,執行緒關心的只是下一刻cpu執行所需的必要實體,只需要知道pc等暫存器的資訊,當前棧指標,不用關心我有沒有子程序啊,我的位址空間在**,我開啟了什麼檔案等等的資訊。因為這些資訊cpu已經知道了。

在《現代作業系統》中已經說明了使用執行緒的種種優勢,很容易就能看明白。其實根據上文,也能猜到答案。這裡就不用說明了。

執行緒可以在核心中實現,也可以在使用者空間實現。我自己的理解是這樣的:在核心中實現就是作業系統提供執行緒支援;在使用者空間中實現就是使用者自己實現。本來以為jvm的執行緒就是在使用者空間上實現的,但是搜了一下,貌似linux平台下是呼叫pthred庫實現的。這裡還是深入學習一下這兩種執行緒的實現方式,為以後的工作和學習打下基礎,說不定什麼時候就用上了。看了幾遍《現代作業系統》中的相關章節,可是自己還是雲裡霧裡的,不是很清楚,這一次就好好的搞明白(不一定搞的明白,目前還沒有接觸過使用者空間實現的執行緒,也許是我孤陋寡聞)。

在這種情況下,核心不知道執行緒的存在。當乙個程序中的執行緒執行完畢,不需要進行系統呼叫(trap),不需要進行上下文交換,所以執行緒的切換非常快。

但是在發生i/o中斷的時候,必須要核心去處理了。那麼問題來了,核心會鎖住當前執行緒所在的程序,因為核心不知道執行緒的存在,只知道程序。解決這個辦法有點麻煩。《現代作業系統》中提出了乙個解法,在某些unix版本中有乙個select系統呼叫,它可以判斷i/o操作是否會阻塞。如果阻塞就不執行i/o操作。這樣run-time system(用的英文版教材,很多術語不會翻譯或者亂翻譯,囧)就知道是執行i/o,還是執行該程序的其它程序。

還有乙個問題,當乙個多執行緒的程序執行fork時,子程序是否需要複製父程序的所有執行緒還是個別執行緒,如何操作。這個,因為很少接觸linux下的c程式設計,所以暫時放在這裡吧。

面試的時候,這個問題可能是問的最多的,可以考察歸納能力和是否理解程序和執行緒。這裡給出自己的理解。

首先,程序是作業系統資源分配和排程的基本單元,它包含了程式能夠執行的必要資源。而執行緒也叫做輕權程序,只擁有cpu執行所需的必要資源。沒有程序,執行緒無法單獨執行。

其次,程序的執行一般是執行緒的,一條道走到黑。執行緒只是程序執行的不同路徑,併發的執行。

就寫這麼多吧。

-end-

作業系統 執行緒

靜態鏈結庫是乙個或多個obj檔案的打包,所以有人乾脆把obj檔案生成lib檔案的過程稱為archive,即合併在一起。比如你鏈結乙個靜態庫,如果其中有錯,他會準確的找到是哪個obj有錯,即靜態lib只是殼子。當我們的應用工程在使用靜態庫鏈結時,靜態鏈結庫要參與編譯,在生成執行檔案之前的鏈結過程中,將...

作業系統 執行緒

執行緒是cpu使用的基本單元,它由執行緒id 程式計數器 暫存器集合和棧組成。它與屬於同一程序的其他執行緒共享 段,資料段和其他作業系統資源,如開啟檔案和訊號。乙個傳統重量級的程序只有單個控制線程,如果程序有多個控制線程,那麼它能夠同時做多個任務。多執行緒程式設計的優點 響應度高 如果對乙個互動程式...

作業系統 執行緒

多核cpu計算機,程序內部的各個執行緒可以占用不同的cpu。共享記憶體位址空間,執行緒通訊無需系統干預。共享程序的資源。每個執行緒都有執行緒id 執行緒控制塊 tcb 幾乎不擁有系統資源。作業系統中,執行緒又分為使用者級和核心級執行緒。使用者級執行緒 ult,user level thread 就是...