iOS--面試題:多線程

1a61ef6370470bf9b7e511605e304b28.webp

目錄:

iOS--面試題:多線程(2)
iOS--面試題:多線程(結尾篇)web

1、進程、線程
1、 進程:面試

• 1.進程是一個具備必定獨立功能的程序關於某次數據集合的一次運行活動,它是操做系統分配資源的基本單元.數據結構

• 2.進程是指在系統中正在運行的一個應用程序,就是一段程序的執行過程,咱們能夠理解爲手機上的一個 app.多線程

• 3.每一個進程之間是獨立的,每一個進程均運行在其專用且受保護的內存空間內,擁有獨立運行所需的所有資源併發

2、 線程app

• 1.程序執行流的最小單元,線程是進程中的一個實體.異步

• 2.一個進程要想執行任務,必須至少有一條線程.應用程序啓動的時候,系統會默認開啓一條線程,async

也就是主線程ide

3、 進程和線程的關係函數

• 1.線程是進程的執行單元,進程的全部任務都在線程中執行

• 2.線程是 CPU 分配資源和調度的最小單位

• 3.一個程序能夠對應多個進程(多進程),一個進程中可有多個線程,但至少要有一條線程

• 4.同一個進程內的線程共享進程資源

2、多進程、多線程多進程

打開 mac 的活動監視器,能夠看到不少個進程同時運行

• 進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。

• 進程能夠分爲系統進程和用戶進程。凡是用於完成操做系統的各類功能的進程就是系統進程,它們就是處於運行狀態下的操做系統自己;全部由用戶啓動的進程都是用戶進程。進程是操做系統進行資源分配的單位。

• 進程又被細化爲線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間裏,同一個計算機系統中若是容許兩個或兩個以上的進程處於運行狀態,這即是多進程。

多線程

• 同一時間,CPU只能處理 1條線程,只有 1條線程在執行。多線程併發執行,實際上是 CPU 快速地在多條線程之間調度(切換)。若是 CPU 調度線程的時間足夠快,就形成了多線程併發執行的假象

• 若是線程很是很是多,CPU會在 N多線程之間調度,消耗大量的 CPU 資源,每條線程被調度執行的頻次會下降(線程的執行效率下降)

• 多線程的優勢:

能適當提升程序的執行效率

能適當提升資源利用率(CPU、內存利用率)

• 多線程的缺點:

開啓線程須要佔用必定的內存空間(默認狀況下,主線程佔用 1M,子線程佔用 512KB),若是開啓大量的線程,會佔用大量的內存空間,下降程序的性能

線程越多,CPU 在調度線程上的開銷就越大

程序設計更加複雜:好比線程之間的通訊、多線程的數據共享

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人點擊加入羣聊iOS交流羣:642 363 427,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!

3、任務、隊列****任務

就是執行操做的意思,也就是在線程中執行的那段代碼。在 GCD中是放在 block 中的。執行任務有兩種方式:同步執行(sync)和異步執行(async)

同步(Sync):同步添加任務到指定的隊列中,在添加的任務執行結束以前,會一直等待,直到隊列裏面的任務完成以後再繼續執行,即會阻塞線程。只能在當前線程中執行任務(是當前線程,不必定是主線程), 不具有開啓新線程的能力。

異步(Async):線程會當即返回,無需等待就會繼續執行下面的任務,不阻塞當前線程。能夠在新的線程中執行任務,具有開啓新線程的能力(並不必定開啓新線程)。若是不是添加到主隊列上,異步會在子線程中執行任務

隊列

隊列(Dispatch Queue):這裏的隊列指執行任務的等待隊列,即用來存聽任務的隊列。隊列是一種特殊的線性表,採用 FIFO(先進先出)的原則,即新任務老是被插入到隊列的末尾,而讀取任務的時候老是從隊列的頭部開始讀取。每讀取一個任務,則從隊列中釋放一個任務

在 GCD中有兩種隊列:串行隊列和併發隊列。二者都符合 FIFO(先進先出)的原則。二者的主要區別是: 執行順序不一樣,以及開啓線程數不一樣。

• 串行隊列(Serial Dispatch Queue):

同一時間內,隊列中只能執行一個任務,只有當前的任務執行完成以後,才能執行下一個任務。(只開啓一個線程,一個任務執行完畢後,再執行下一個任務)。主隊列是主線程上的一個串行隊列,是系統自動爲咱們建立的

• 併發隊列(Concurrent Dispatch Queue):

同時容許多個任務併發執行。(能夠開啓多個線程,而且同時執行任務)。併發隊列的併發功能只有在異步(dispatch_async)函數下才有效

4、iOS**** 中的多線程

主要有三種:NSThread、NSoperationQueue、GCD

1.****NSThread:輕量級別的多線程技術

是咱們本身手動開闢的子線程,若是使用的是初始化方式就須要咱們本身啓動,若是使用的是構造器方式它就會自動啓動。只要是咱們手動開闢的線程,都須要咱們本身管理該線程,不僅是啓動,還有該線程使用完畢後的資源回收

ccd4a3469f3c33898f18aa9d5e8b10e1.webp

performSelector...只要是 NSObject 的子類或者對象均可以經過調用方法進入子線程和主線程,其實這些方法所開闢的子線程也是 NSThread 的另外一種體現方式。

在編譯階段並不會去檢查方法是否有效存在,若是不存在只會給出警告

ffc7967c9b79a9201d839df7ca31fae5.webp

須要注意的是:若是是帶 afterDelay的延時函數,會在內部建立一個 NSTimer,而後添加到當前線程的Runloop中。也就是若是當前線程沒有開啓 runloop,該方法會失效。在子線程中,須要啓動 runloop(注意調用順序)

540da0330511e46b3f599a4daa89e785.webp

而 performSelector:withObject:只是一個單純的消息發送,和時間沒有一點關係。因此不須要添加到子線程的 Runloop 中也能執行

二、GCD****對比 NSOprationQueue

咱們要明確 NSOperationQueue與 GCD 之間的關係

GCD是面向底層的 C語言的 API,NSOpertaionQueue用 GCD構建封裝的,是 GCD 的高級抽象。

一、GCD執行效率更高,並且因爲隊列中執行的是由 block 構成的任務,這是一個輕量級的數據結構,寫起來更方便

二、GCD 只支持FIFO的隊列,而 NSOperationQueue 能夠經過設置最大併發數,設置優先級,添加依賴關係等調整執行順序

三、NSOperationQueue甚至能夠跨隊列設置依賴關係,可是 GCD 只能經過設置串行隊列,或者在隊列內添加 barrier(dispatch_barrier_async)任務,才能控制執行順序,較爲複雜

四、NSOperationQueue由於面向對象,因此支持 KVO,能夠監測 operation 是否正在執行(isExecuted)、是否結束(isFinished)、是否取消(isCanceld)

• 實際項目開發中,不少時候只是會用到異步操做,不會有特別複雜的線程關係管理,因此蘋果推崇的且優化完善、運行快速的 GCD 是首選

• 若是考慮異步操做之間的事務性,順序行,依賴關係,好比多線程併發下載,GCD 須要本身寫更多的代碼來實現,而 NSOperationQueue 已經內建了這些支持

• 不管是 GCD 仍是 NSOperationQueue,咱們接觸的都是任務和隊列,都沒有直接接觸到線程,事實上線程管理也的確不須要咱們操心,系統對於線程的建立,調度管理和釋放都作得很好。而 NSThread 須要咱們本身去管理線程的生命週期,還要考慮線程同步、加鎖問題,形成一些性能上的開銷

5、GCD---隊列

iOS 中,有 GCD、NSOperation、NSThread 等幾種多線程技術方案。而 GCD 共有三種隊列類型:

main queue:經過 dispatch_get_main_queue()得到,這是一個與主線程相關的串行隊列。

global queue:全局隊列是併發隊列,由整個進程共享。存在着高、中、低三種優先級的全局隊列。調用dispath_get_global_queue 並傳入優先級來訪問隊列。

查看下文

自定義隊列:經過函數 dispatch_queue_create 建立的隊列

推薦

相關文章
相關標籤/搜索