1.定義程序員
2.做用編程
3.和進程的比較緩存
4.多線程(multithreading)的優勢和缺陷多線程
5.調度(scheduling)性能
6.線程相關概念spa
定義操作系統
線程就是最小的可編程指令序列,是進程的子集。一個進程由一個或多個線程組成。線程
做用code
線程的做用就是要加速程序的執行,提升計算機的性能,知足多任務需求。好比word,你能夠編輯,同時語法檢查也正在進行,至少就是兩個線程了。再好比播放電影,視頻線程和音頻線程同時執行,同時有兩種可能,一種是在多核cpu下,每一個進程在不一樣的cpu,是真正的同時執行;另外一種是單核cpu,這時能夠採用time_sliced策略來實現同時的效果。視頻
和進程的比較
|
process |
thread |
是否獨立 |
獨立 |
不獨立,做爲進程的子集存在 |
狀態信息 |
更多 |
沒進程多,一個進程的thread共享狀態信息 |
是否有分隔的地址空間 |
有 |
沒有 |
交互 |
process之間經過inter-process communicationmechanisms來交互 |
thread之間的交互經過他們已經共享了的data,code,files |
context switching速度 |
慢 |
快 |
多線程的優勢和缺陷
多線程主要用於多任務操做系統中,多線程做爲一個普遍使用的編程和執行模型容許多個線程存在於一個單獨的進程裏。這些線程共享進程的資源,可是可以單獨的執行任務。
多線程應用程序有如下優勢:
(1)負責任:單線程程序,若是主進程被要執行好久的任務阻塞,那整個應用程序就卡死了。若是是多線程就不存在這個問題,多線程的話,讓子線程來執行,就算這個子線程被阻塞了,其餘子線程和主線程還能夠等待用戶輸入。
(2)更快的執行:當有多個CPU或多核CPU的狀況下,多線程就會是真正的同時執行(每一個cpu執行一個thread),而不是time_sliced。
(3)更低的資源消耗:單進程多線程比多進程消耗的資源要少不少。好比,Apache就是利用多個listener threads來監聽請求和多個server threads來處理請求。
(4)更好的系統利用:好比,一個文件系統用多線程能夠達到更高的吞吐量和更低的延遲。由於在更快的中介(好比緩存)裏的數據能夠被一個線程獲取,另一個線程能夠去低速中介(好比硬盤)獲取數據而不須要等待其餘線程完成操做。
(5)簡化共享和交互:線程之間的通訊主要經過它們已經共享的數據,代碼和文件。
(6)平行化:經過處理讓多個任務同時執行。
多線程的缺陷:
(1)同步的麻煩:由於一個進程的多個線程共享地址空間,程序員須要很是當心的來避免race conditions和其餘非直觀的行爲。爲了正確的操做數據,多個線程一般須要及時集合來確保按正確的順序來處理數據。
這個時候可能須要用鎖(更多的用信號量,其實信號量能夠當作是多個鎖的集合)來阻止同一數據被同時修改或讀取當這個數據正在被修改。
(2)一個線程摧毀一個進程:一個線程的非法操做會摧毀整個進程。
調度
操做系統調度線程的兩種方式:
(1)搶佔式多任務是優先選擇的方式。它容許操做系統來決定何時切換上下文來讓更重要的線程來得到cpu資源。搶佔式多任務的缺點:當操做系統切換上下文的時候不合適時,可能會致使很差的結果,好比lock convoy(多個優先級同樣的線程重複競爭同一個鎖) 和 priority inversion(優先級低的線程搶到了cpu資源)。爲了不這個缺陷,因而就有了合做式多線程。
(2)合做式多線程。這個方式依賴於多線程本身來決定在什麼點來放棄對cpu資源的控制。
顯然,第一種調度方式,主導者是操做系統;第二種調度方式,主導者是多線程。
線程相關概念
green thread:被虛擬機調度的thread。
software thread:被操做系統調度的thread。