線程

1、線程和進程的最大區別:

進程擁有自己的地址空間(存放程序正文和數據以及其他資源,對應內存),而多個 線程共享同一個地址空間和所有可用數據

2、使用線程原因

(1)在許多應用中同時發生着多種活動,其中某些活動隨着時間的推移會被阻塞。通過將這些應用程序分解成可以準並行運行的多個順序線程,程序設計模型會變得更簡單,且不會因某一步I/O則程序卡死

(2)線程比進程更輕量級,創建一個線程較創建一個進程要快10~100倍

3、線程應用舉例:文字處理軟件:一個線程和用戶交互,一個線程在得到通知時進行文檔的重新格式化,一個線程週期性地將RAM中的內容寫到磁盤上。(三個線程使用一樣的地址空間,即共享內存,於是它們都可以訪問同一個正在編輯的文件)

4、構造服務器的三種方法

模型                                                             特徵

多線程                                                   並行性、阻塞系統調用

單線程進程                                           無並行性、阻塞系統調用

有限狀態機                                          並行性、非阻塞系統調用、中斷

說明:現在只有多線程和單線程這兩種設計了,雖然有限狀態機是高性能的,但是編程難度大,不再順序運行,並且每次都要顯示地保存或重新裝入相應的計算狀態

5、線程必須在某個進程中執行,進程用於把資源集中到一起,而線程則是在cpu上被調用的實體

在線程中有一個程序計數器用來記錄接着要執行哪一條指令

線程中擁有寄存器,用來保存線程當前的工作變量

線程中還有一個堆棧,用來記錄執行歷史,其中每一幀保存了一個已調用的但是還沒有從中返回的過程。

6、各個線程都可以訪問進程地址空間中的每一個內存地址,所以一個線程可以讀、寫或甚至清除另一個線程的堆棧。故線程之間是沒有保護的。

7、如果一個線程打開一個文件,該文件對該進程中的其他線程都可見,這些線程可以對該文件進行讀寫。由於資源管理的單位是進程而非線程

8、多線程情況下,進程通常會從當前的單個線程開始。這個線程有能力通過調用一個庫函數創建新的線程。通常線程不存在父子層次關係,都是平等的。當一個線程完成工作後,可以通過調用一個庫過程退出。該線程接着消失,不再可調度

9、thread_yield它允許線程自動放棄cpu(進入就緒狀態飛)而讓另一個線程運行


還引發了很多問題:不同於進程,線程庫無法利用時鐘中斷強制線程讓出cpu,考慮UNIX的fork系統調用引發的問題:

如果父進程有多個線程,你那麼它的子進程也應該擁有這些線程嗎?如果不是,則該子進程可能會工作不正常,因爲在該子進程中的線程都是絕對必要的。如果子進程擁有了與父進程一樣的多個線程,如果父進程在read系統調用(比如鍵盤)上被阻塞了會發生什麼情況?是兩個線程被阻塞在鍵盤上(一個屬於父進程,另一個屬於子進程)嗎?在鍵入一行輸入之後,這兩個線程都得到該輸入的副本嗎?還是僅僅父進程得到或者子進程得到?類似的問題在網絡連接時也會出現。另一類問題和線程共享許多數據結構的事實相關。如果一個線程關閉了某個文件,而另一個線程還在該文件上進行讀操作時會怎樣?假設有兩個線程同時都沒有內存,都開始分配更多的內存,這樣會分配兩次,這些都是父子進程會引起的,怎樣處理呢?


發佈了127 篇原創文章 · 獲贊 34 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章