進程與線程相關的介紹

進程:程序員

  • 進程是指在系統中正在運行的一個應用程序,好比同時打開微信和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,在使用上更加面向對象,線程生命週期也是自動管理的
相關文章
相關標籤/搜索