ios - 多線程之一:概念介紹

多線程及其相關概念

字面意思:多線程,多個線程

相關名詞介紹

進程

  • 什麼是進程?

進程是指在系統中正在運行的一個應用程序。

e.g.:比如同時打開微信和QQ,系統就會分別啓動兩個進程。

內存中的進程

每個進程之間是相互獨立的,不受影響的,並且運行在它們專用的受保護的內存空間內。也就意味着一個進程是不能訪問另一個進程的獨有空間的

可以通過MAC系統中的活動監視器來查看進程

活動監視器

  • 進程的五態模型

五態模型

  1. 新建

進程剛剛被創建,還沒有被提交的狀態,此時它要趕在系統完成創建進程的必要信息。進程在創建過程的時候,還不能運行,操作系統在這個時候還要做很多事情,比如:建立資源表格、分配資源、加載程序、以及建立地址空間表等等。進程只有在這些必要條件創建完成之後,才能進入就緒狀態。操作系統往往會根據當前的系統性能和主存容量現狀來推遲新建態進程的提交。
創建一個進程一般要通過一下兩個兩個步驟(1) 爲一個新進程創建PCB,並填寫必要的管理信息.(2) 把該進程轉入就緒狀態並插入就緒隊列之中。當一個新進程被創建時,系統已爲其分配了PCB,填寫了進程標識等信息,但由於該進程所必需的資源或其它信息,如主存資源尚未分配等,一般而言,此時的進程已擁有了自己PCB,但進程自身還未進入主存,即創建工作尚未完成,進程還不能被調度運行,其所處的狀態就是創建狀態。 引入創建狀態,是爲了保證進程的調度必須在創建工作完成後進行,以確保對進程控制塊操作的完整性。同時,創建狀態的引入,也增加了管理的靈活性,操作系統可以根據系統性能或主存容量的限制,推遲創建狀態進程的提交。對於處於創建狀態的進程,獲得了其所必需的資源,以及對其PCB初始化工作完成後,進程狀態便可由創建狀態轉入就緒狀態。

  1. 就緒

當一個進程獲得除了處理機(cpu)意外的一切所需要的資源,如果此時該線程一旦得到了處理機(CPU),即可運行。當進程已分配到除CPU以外的所有必要資源後,只要再獲得CPU,便可立即執行,進程這時的狀態稱爲就緒狀態。在一個系統中處於就緒狀態的進程可能有多個,通常將它們排成一個隊列,稱爲就緒隊列。

  1. 運行

是指一個進程正在處理機上運行,在操作系統中運行狀態的進程數肯定是小於等於處理器的數目,比如對於單核的處理器來講的話,處於運行狀態的進程只能有一個。在沒有其他進程可以執行的時候,比如說所有進程都在堵塞的狀態,通常會自動執行系統的一個空閒進程。進程已獲得CPU,其程序正在執行。在單處理機系統中,只有一個進程處於執行狀態; 在多處理機系統中,則有多個進程處於執行狀態。

  1. 堵塞

一般我們也會叫做等待或者睡眠狀態,一個進程等待某一事件發生會暫時停止運行,比如在等待I/O完成。所以這個時候即使處理器分配了該進程也是無法運行的,所以我們稱之爲堵塞的狀態。正在執行的進程由於發生某事件而暫時無法繼續執行時,便放棄處理機而處於暫停狀態,亦即進程的執行受到阻塞,把這種暫停狀態稱爲阻塞狀態,有時也稱爲等待狀態或封鎖狀態。致使進程阻塞的典型事件有:請求I/O,申請緩衝空間等。通常將這種處於阻塞狀態的進程也排成一個隊列。有的系統則根據阻塞原因的不同而把處於阻塞狀態的進程排成多個隊列。

  1. 終止

指進程已經結束運行,系統回收其資源,這個過程要等待系統做一些善後處理。並且釋放主存,等待操作系統進行善後處理,然後將其PCB清零,並將PCB空間返還系統。當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。進入終止態的進程以後不能再執行,但在操作系統中依然保留一個記錄,其中保存狀態碼和一些計時統計數據,供其它進程收集。一旦其它進程完成了對終止狀態進程的信息提取之後,操作系統將刪除該進程。

線程

  • 什麼是線程?

線程是進程的基本執行單元,一個進程要想執行任務,必須得有線程,(每一個進程至少要有一個線程)。
e.g.:我們使用QQ進行文字聊天,我們使用微信就行視頻聊天。都需要各自在進程中啓動線程。

線程

如果在線程中有多個任務,線程該怎麼執行?

線程串行
  • 什麼是線程的串行?
    如果要在一個線程中執行多個任務,那麼只能是一個一個按照順序執行這些任務,也就是說,在同一時間內,一個線程中只能執行一個任務。

eg:比如在一個線程中有三個下載任務,(任務A, 任務B, 任務C)

下載任務

說明:任務A完成之後執行任務B,任務B完成之後執行任務C。如果任務中有比較耗時的任務就會出現等待的情況。也可以說線程是進程中的一個條執行路徑。也就是說進程中的任務都是在線程中完成的。基於這種情況才引入了多線程的概念。

多線程

什麼是多線程?

線程是進程的基本執行單元。
進程的所有任務都是在線程中執行的。
一個進程要完成某項任務,必須要有一個線程,這個線程我們通常稱之爲主線程。在IOS開發中我們也稱爲UI線程。
一個進程中可以開啓多條線程,每條線程可以並行(同時)執行不同任務。

進程和線程的關係

舉個例子加深理解;

將進程比作工廠車間,線程比作車間工人,負責不同任務的車間工人在同時在車間運作,最後生產出產品 ,因此多線程技術可以提高程序的執行效率。

e.g.:比如同時開啓3條線程分別來操作3個下載任務。(任務A, 任務B。任務C)

下載任務

說明:啓動進程後,在進程中創建三個線程,每個線程可以同時分別執行不同的任務,

爲什麼要學習多線程?
常用功能需求:
1. 網絡請求
2. 圖片加載
3. 文件處理
4. 數據存儲
5. 任務執行

任務的執行方式
串行 : 多個任務按照一定順序去執行。

任務串行
並行 : 多個任務併發執行

任務並行

多線程的實現原理

  1. 在同一時間,CPU只能處理一條線程,只有一條線程在工作。
  2. 多線程併發執行時,其實是CPU快速的在線程之間的調度。
  3. 如果CPU調度線程的時間足夠快,就造成了多條線程併發執行的假象。

單核操作系統
從宏觀來看是並行的
從微觀上來看來是串行的

單核多線程

多核操作系統

多核多線程

思考:如果線程非常多,會發生什麼情況?

cpu會在非常多的線程之間調度,最終會導致CPU累死,消耗大量的CPU資源,並且每條線程被調用執行的頻率降低,導致線程的執行效率降低。

多線程的優缺點

  • 多線程的優點

    1. 能夠適當的提高程序的執行效率。

    2. 能夠適當提高資源的利用率(cpu、內存的利用)。

    3. 簡化了編程模型。

    4. 更加的輕量級。

  • 多線程的缺點

    1. 開啓線程需要佔用一定的內存空間(默認情況下,主線程佔用1M。子線程佔用512kB,如果開啓大量的線程,會佔用大量的內存空間,降低程序的性能)。

    2. 線程越多,CPU在線程調度上開銷就越大。

    3. 程序設計更加複雜,比如:線程之間的通信,多線程的數據共享等。

多線程在IOS中的應用

  • 什麼是主線程?

  • 一個iOS程序運行後,默認會開啓一條線程,該線程稱爲“主線程”或“UI線程”。

  • 主線程的主要作用?

    1. 顯示/刷新UI界面

    2. 處理UI事件(比如點擊事件,滾動事件,拖拽事件)

主線程的使用注意事項

  • 不要將比較耗時的操作放置在主線程中,因爲耗時操作會卡住主線程,嚴重影響UI的流暢度,會給用戶一種“卡”的感覺,體驗效果不好。

以下使用圖像來對耗時操作在主線程和子線程中的區別比較

  1. 在主線程中

主線程的耗時操作

  1. 在子線程中

子線程中的耗時操作

IOS提供的解決方

技術方案 簡介 語言 線程的生命週期 使用頻率
pThread 1.很多平臺都能使用,可移植性強 C 自動管理 非常少
NSThread 1.面向對象的使用 2.簡單易用,可以直接操作線程對象 OC 程序員管理 偶爾使用
GCD 1.旨在代替NSThread等線程技術。2。充分利用設備的多核處理器 C 自動管理 經常使用
NSOperation 1.基於GCD. 2.使用更加面向對象,3.比GCD多了一些更簡單的使用功能 OC 自動管理 經常使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章