多線程之概念解析
在介紹多線程之前明確幾個概念
進程和線程
進程:是計算機中已運行的實體(計算機可以工作都是進程的功勞),進程是指在系統中正在運行的一個應用程序
線程:操作系統能夠運行調度的最小單元(它是進程的組成部分)負責進程執行,一個線程的所有任務都是在線程中執行
區別和聯系:
- 一個程序至少要有進程,一個進程至少要有一個線程.
- 進程:資源分配的最小獨立單元,進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
- 線程:進程下的一個分支,是進程的實體,是CPU調度和分派的基本單元,它是比進程更小的能獨立運行的基本單位,線程自己基本不擁有系統資源,只擁有一點在運行中必不可少的資源(程序計數器、一組寄存器、棧),但是它可與同屬一個進程的其他線程共享進程所擁有的全部資源。
- 進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。
- 進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。
- 但對於一些要求同時進行並且又要共享某些變量的並發操作,只能用線程,不能用進程。
- 同一個進程內的線程共享進程資源
隊列: 裝載線程任務的數據結構,先進先出,排在前面的任務最先執行,隊列分為串行、並行、全局和主隊列。隊列只是負責任務的調度,而不負責任務的執行
任務:任務的執行分為同步和異步,任務是在線程中執行的
同步和異步
同步:同步任務不會開啟新的線程,按順序執行,執行完一個再執行下一個,需要等待、協調運行;
異步:異步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。在大多數情況下,執行異步任務時會創建新的線程(在調用block代碼塊或開啟定時器時一般是不會開啟新的線程的)
區別和聯系:
串行:任務按照順序被調度,前一個任務不執行完畢,隊列不會調度,任務只會順序執行
並行(並發):指隊列中的線程任務執行可以同時進行
隊列與任務的組合
串行隊列同步執行: 隊列會按順序來調度任務,任務在一個線程裏運行,one by one
串行隊列異步執行: 按順序來調度任務,任務會創建新的線程,one by one
並行隊列同步執行: 即使不會等待一個任務執行完畢便再次調度下一個任務(調度任務,不控制任務的執行),但同步任務不會開啟新的線程,one by one
並行隊列異步執行: 操作會新建多個線程(有多少任務,就開n個線程執行)、操作無序執行;不會強制來等待上一個任務執行完畢,而是會在有空閑線程時來繼續調度下一個任務,而此時任務會創建新的線程來執行,故這種組合可以實現任務的並發
全局隊列異步執行:操作會新建多個線程、操作無序執行
全局隊列同步執行:操作不會新建線程、操作順序執行
主隊列異步執行:操作都應該在主線程上順序執行的,不存在異步的概念
主隊列同步執行:如果把主線程中的操作看成一個大的block,那麽除非主線程被用戶殺掉,否則永遠不會結束;主隊列中添加的同步操作永遠不會被執行,會死鎖
並發隊列 | 串行隊列 | |
---|---|---|
同步 | 不開啟新的線程,串行 | 不開啟新的線程,串行 |
異步 | 開啟新的線程,並發 | 開啟新的線程,串行 |
多線程之概念解析