日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS多线程概念总结

發布時間:2024/1/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS多线程概念总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在上一篇章中我們主要探索了KVO的底層原理,和實現過程,也學習了自定義KVO的實現,那么本篇就開啟了大家心心念念的多線程了,其實多線程相關的使用方式,和一些概念的文章并不少,也是面試中基本是必問的內容,那么今天我們就一起來總結一些多線程的一些基本概念,權當回顧一下😄

1.線程的定義

  • a.線程是進程的基本執?單元,?個進程的所有任務都在線程中執?

  • b.進程要想執?任務,必須得有線程,進程?少要有?條線程

  • c.程序啟動會默認開啟?條線程,這條線程被稱為主線程或UI線程

2.進程的定義

  • a.進程是指在系統中正在運?的?個應?程序

  • b.每個進程之間是獨?的,每個進程均運?在其專?的且受保護的內存空間內

  • c.通過活動監視器(全局搜索活動監視器即可)可以查看Mac系統中所開啟的進程

3.兩者的關系

地址空間:同?進程的線程共享本進程的地址空間,?進程之間則是獨?的地址空間。

資源擁有:同?進程內的線程共享本進程的資源,如內存、I/O、cpu等,但是進程之間的資源是獨?的。

  • a.?個進程崩潰后,在保護模式下不會對其他進程產?影響,但是?個線程崩潰整個進程都死掉。所以多進程要?多線程健壯。

  • b.進程切換時,消耗的資源?,效率?。所以涉及到頻繁的切換時,使?線程要好于進程。同樣如果要求同時進?并且?要共享某些變量的并發操作,只能?線程不能?進程。

  • c.執?過程:每個獨?的進程有?個程序運?的??、順序執?序列和程序??。但是線程不能獨?執?,必須依存在應?程序中,由應?程序提供多個線程執?控制。

  • d.線程是處理器調度的基本單位,但是進程不是。

  • e.線程沒有地址空間,線程包含在進程地址空間中。

4.多線程的原理


如圖所示,多線程的原理其實就是CPU快速的在多個線程之間進行快速切換,而并不是我們想象的多個線程同時執行,只不過因為CPU在切換調度線程的速度很快,導致我們感覺像是在同時執行,也因此,如果線程數過多就會非常消耗CPU資源,影響執行效率,在我們現實開發中,一般也會針對耗時的操作,另開線程進行處理,從而避免主線程的阻塞

總結

  • 時間片:CPU在多個任務直接進?快速的切換,這個時間間隔就是時間?。(單核CPU)同?時間,CPU只能處理1個線程,換?之,同?時間只有 1 個線程在執?

  • 多線程同時執?:是CPU快速的在多個線程之間的切換,CPU調度線程的時間?夠快,就造成了多線程的同時執?的效果

  • 如果線程數?常多,CPU會在N個線程之間切換,消耗?量的CPU資源,每個線程被調度的次數會降低,線程的執?效率降低

多線程技術方案

5.多線程的優缺點

優點

  • a.能適當提?程序的執?效率

  • b.能適當提?資源的利?率(如CPU,內存)

  • c.線程上的任務執?完成后,線程會?動銷毀

缺點

  • a.開啟線程需要占??定的內存空間(默認情況下,每?個線程都占512KB)

  • b.如果開啟?量的線程,會占??量的內存空間,降低程序的性能

  • c.線程越多,CPU在調?線程上的開銷就越?

  • d.程序設計更加復雜,?如線程間的通信、多線程的數據共享

6.線程的生命周期


New:就是剛通過創建出來的線程;

Runnable:就是調用的線程的start方法后,這時候線程處于等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行;

Running:當就緒的線程被調度并獲得CPU資源時,便進入運行狀態,run方法定義了線程的操作和功能;

Blocked:在運行狀態的時候,可能因為某些原因導致運行狀態的線程變成了阻塞狀態,比如sleep、等待同步鎖,線程就從可調度線程池移出,處于了阻塞狀態,這個時候sleep到時、獲取同步鎖,此時會重新添加到可調度線程池。喚醒的線程不會立刻執行run方法,它們要再次等待CPU分配資源進入運行狀態;

Dead:如果線程正常執行完畢后或線程被提前強制性的終止或出現異常導致結束,那么線程就要被銷毀,釋放資源。

7.線程池


執行步驟對應如下:

  • 1.當有任務進來時,線程池先判斷如果正在運行的線程數量小于核心線程數,那么馬上創建核心線程運行這個任務;

  • 2.如果正在運行的線程數量大于或等于核心線程數,那么將這個任務放入隊列;

  • 3.如果這時候隊列滿了,而且正在運行的線程數量小于最大線程數,那么還是要創建非核心線程立刻運行這個任務;

  • 4.如果隊列滿了,而且正在運行的線程數量大于或等于最大線程數,那么線程池飽和策略將進行處理。

飽和策略

  • 1.AbortPolicy直接拋出RejectedExecutionExeception異常來阻?系統正常運?

  • 2.CallerRunsPolicy將任務回退到調?者

  • 3.DisOldestPolicy丟掉等待最久的任務

  • 4.DisCardPolicy直接丟棄任務

這四種拒絕策略均實現的RejectedExecutionHandler接?

8.互斥鎖與自旋鎖

在多線程中,因為在同一個進程中,資源是共享的,所以多線程必然存在著資源的競爭,那么就引入了鎖的概念。

互斥鎖

最常使用于線程同步的鎖;標記用來保證在任一時刻,只能有一個線程訪問該對象,同一線程多次加鎖操作會造成死鎖;臨界區和互斥量都可用來實現此鎖,通常情況下鎖操作失敗會將該線程睡眠等待鎖釋放時被喚醒。

互斥鎖小結

  • 1.保證鎖內的代碼,同一時間,只有一條線程能夠執行

  • 2.互斥鎖的鎖定范圍,應該盡量小,鎖定范圍越大,效率越差

互斥鎖參數

  • 1.能夠枷鎖的任意NSObject對象

  • 2.鎖對象一定要保證所有線程都能夠訪問

  • 3.如果代碼中只有一個地方需要枷鎖,大多都使用self,這樣可以避免單獨再創建一個鎖對象

自旋鎖

一種用于保護多線程共享資源的鎖,與一般互斥鎖不同之處在于當自旋鎖嘗試獲取鎖時以忙等待的形式不斷地循環檢查鎖是否可用。當上一個線程的任務沒有執行完畢的時候(被鎖住),那么下一個線程會一直等待(不會睡眠),當上一個線程的任務執行完畢,下一個線程會立即執行。

區別(取自同期優秀LGPerson總結😄)

自旋鎖會忙等,所謂忙等,即在訪問被鎖資源時,調用者線程不會休眠,而是不停循環在那里,直到被鎖資源釋放鎖。

互斥鎖會休眠,所謂休眠,即在訪問被鎖資源時,調用者線程會休眠,此時cpu可以調度其他線程工作,直到被鎖資源釋放鎖。此時會喚醒休眠線程。

自旋鎖優缺點
優點在于,因為自旋鎖不會引起調用者睡眠,所以不會進行線程調度,CPU時間片輪轉等耗時操作。所有如果能在很短的時間內獲得鎖,自旋鎖的效率遠高于互斥鎖。
缺點在于,自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運行自旋,所以占用著CPU,如果不能在很短的時間內獲得鎖,這無疑會使CPU效率降低。自旋鎖不能實現遞歸調用。

9.atomic與nonatomic 的區別

1.OC在定義屬性時有nonatomicatomic兩種選擇,默認為atomic屬性

  • atomic:原子屬性,為setter方法加自旋鎖(即為單寫多讀)
  • nonatomic:非原子屬性,不會為setter方法加鎖

2.nonatomicatomic的對比

  • atomic:線程安全,需要消耗大量的資源;
  • nonatomic:非線程安全,適合內存小的移動設備。

iOS開發的建議

  • 如非需搶占資源的屬性(如購票,充值),所有屬性都聲明為nonatomic
  • 盡量避免多線程搶奪同一塊資源。
  • 盡量將加鎖、資源搶奪的業務邏輯交給服務器端處理,減小移動客戶端的壓力。

10.線程和Runloop的關系

  • 1.runloop與線程是??對應的,?個runloop對應?個核?的線程,為什么說是核?的,是因為runloop是可以嵌套的,但是核?的只能有?個,他們的關系保存在?個全局的字典?。

  • 2.runloop是來管理線程的,當線程的runloop被開啟后,線程會在
    執行完任務后進入休眠狀態,有了任務就會被喚醒去執行任務

  • 3.runloop在第一次獲取時被創建,在線程結束時被銷毀

  • 4.對于主線程來說,runloop在程序一啟動就默認創建好了

  • 5.對于子線程來說,runloop是懶加載的,只有當我們使用的時候才會創建,所以在子線程用定時器要注意:確保子線程的runloop被創建,不然定時器不會回調

總結

以上是生活随笔為你收集整理的iOS多线程概念总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。