進程與線程相關的介紹
進程:程序員
- 進程是指在系統中正在運行的一個應用程序,好比同時打開微信和QQ,系統會分別啓動兩個進程
- 每一個進程之間是獨立的,每一個進程均運行在其專用且受保護的內存空間中
線程:微信
- 一個進程要想執行任務,必須得有線程(每一個進程至少要有一條線程),是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位
- 一個進程(程序)的全部任務都在線程中執行
- 一個程序有且只有一個主線程,程序啓動時建立(調用main來啓動),主線程的生命週期和應用程序綁定,程序退出時,主線程也中止
- 同一時間內,一個線程只能執行一個任務,若要在一個進程中執行多個任務,那麼只能一個一個按順序執行這些任務(線程的串行)
- 線程本身不擁有系統資源,只擁有在運行中必不可少的資源,但它可與同屬一個進程的其餘線程共享進程所擁有的所有資源
線程的幾種狀態:數據結構
- 新建狀態:新建立一個線程對象
- 就緒狀態:線程對象建立以後,其餘線程調用了該對象的start方法,該狀態的線程位於可運行線程池中,變得可運行,等到獲取CPU的使用權
- 運行狀態:就緒狀態的線程獲取了CPU,執行程序代碼
- 阻塞狀態:因某種緣由放棄CPU使用權,暫時運行,直到線程進入就緒狀態,纔有機會成爲運行狀態
- 死亡狀態:線程執行完了或者因異常退出了run方法,線程生命週期結束
進行和線程比較:多線程
- 線程是CPU調度(執行任務)的最小單位,是程序執行的最小單元
- 進程是CPU分配資源和調度的單位
- 一個程序能夠對應多個進程,一個進程能夠有多個線程,但至少要有一個線程,而一個線程只能屬於一個進程
- 同一個進程內的線程共享進程的全部資源
多線程:併發
- 概念:一個進程中能夠開啓多條線程,每一條線程能夠並行(同時)執行不一樣的任務
- 原理:同一時間,CPU只能處理一條線程,只有一條線程在工做,多線程併發(同時)執行,實際上是CPU快速的在多條線程之間調度(切換),若是CPU調度線程的時間足夠快,就造就了多線程併發執行的假象
- 注意:若是線程不少,CPU會在N多線程之間調度,會消耗大量CPU資源,每條線程被調度執行的頻次會下降(線程的執行效率會下降)
多線程的優缺點:性能
- 優勢:能適當的提升程序的執行效率以及資源利用率(CPU、內存利用率)
- 缺點:建立線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1kb)、棧空間(子線程512kb,主線程1MB)、建立線程大約須要90毫秒的建立時間,若是開啓大量的線程,會下降程序的性能(通常最多3到5條);線程越多,CPU在調度線程上的開銷就越大;程序設計更加複雜(好比線程之間的通訊、多線程的數據共享)
主線程:線程
- 一個iOS程序運行後,默認會開啓1條線程,稱爲「主線程」或者「UI線程」
- 做用:顯示/刷新UI界面,處理UI事件(點擊事件、滾動事件、拖拽事件等)
- 使用注意:不要將耗時的操做放在主線程中,耗時操做應放在子線程(後臺線程,非主線程);凡是和UI相關的操做應放在主線程中操做
iOS中多線程的實現方案:設計
- pthread:一套通用的多線程API,適用於Unix、Linux、Windows等系統,跨平臺、可移植,使用難度大,C語言編寫,線程的生命週期須要由程序員管理
- NSTread:OC語言編寫,面向對象,簡單易用,可直接操做線程對象,線程的生命週期依然由程序員管理
- GCD:替代NSTread的線程技術,用C語言編寫,充分利用設備的多核,線程生命週期自動管理
- NSOperation:對GCD進行的一次封裝,比GCD多了一些更簡單使用的API,在使用上更加面向對象,線程生命週期也是自動管理的
歡迎關注本站公眾號,獲取更多信息