併發編程之多線程理論

1、什麼是線程 

  在傳統操做系統中,每一個進程有一個地址空間,並且默認就有一個控制線程python

  線程顧名思義,就是一條流水線工做的過程(流水線的工做須要電源,電源就至關於cpu),而一條流水線必須屬於一個車間,一個車間的工做過程是一個進程,車間負責把資源整合到一塊兒,是一個資源單位,而一個車間內至少有一條流水線。程序員

  因此,進程只是用來把資源集中到一塊兒(進程只是一個資源單位,或者說資源集合),而線程纔是cpu上的執行單位。算法

  多線程(即多個控制線程)的概念是,在一個進程中存在多個線程,多個線程共享該進程的地址空間,至關於一個車間內有多條流水線,都共用一個車間的資源。例如,北京地鐵與上海地鐵是不一樣的進程,而北京地鐵裏的13號線是一個線程,北京地鐵全部的線路共享北京地鐵全部的資源,好比全部的乘客能夠被全部線路拉。多線程

2、線程的建立開銷小

一、建立進程的開銷要遠大於線程?

  若是咱們的軟件是一個工廠,該工廠有多條流水線,流水線工做須要電源,電源只有一個即cpu(單核cpu)。一個車間就是一個進程,一個車間至少一條流水線(一個進程至少一個線程);建立一個進程,就是建立一個車間(申請空間,在該空間內建至少一條流水線),而建線程,就只是在一個車間內造一條流水線,無需申請空間,因此建立開銷小。併發

二、進程之間是競爭關係,線程之間是協做關係?

  車間直接是競爭/搶電源的關係,競爭(不一樣的進程直接是競爭關係,是不一樣的程序員寫的程序運行的,迅雷搶佔其餘進程的網速,360把其餘進程當作病毒乾死)
  一個車間的不一樣流水線式協同工做的關係(同一個進程的線程之間是合做關係,是同一個程序寫的程序內開啓動,迅雷內的線程是合做關係,不會本身幹本身)性能

3、線程與進程的區別

  一、每啓動一個進程,進程內都至少有一個線程。spa

  二、進程自己只是一個資源單位,並不能真正執行,進程內開的線程纔是真正的運行單位。操作系統

  三、一個進程內能夠啓動多個線程,同一進程內線程間共享資源。線程

  四、啓線程的開銷遠遠小於開進程。blog

  五、線程能夠至關程度控制相同進程下的線程,進程只能控制其子進程。

  六、對主線程的更改(取消、優先級更改等)可能會進程的其餘線程的行爲;對父進程的修改則不會影響子進程。

4、爲什麼要用多線程

  多線程指的是,在一個進程中開啓多個線程,簡單的講:若是多個任務共用一塊地址空間,那麼必須在一個進程內開啓多個線程。詳細的講分爲4點:

  1. 同一個進程內的多個線程共享該進程內的地址資源

      2. 線程比進程更輕量級,線程比進程更容易建立可撤銷,在許多操做系統中,建立一個線程比建立一個進程要快10-100倍,在有大量線程須要動態和快速修改時,這一特性頗有用

      3. 若多個線程都是cpu密集型的,那麼並不能得到性能上的加強,可是若是存在大量的計算和大量的I/O處理,擁有多個線程容許這些活動彼此重疊運行,從而會加快程序執行的速度。

      4. 在多cpu系統中,爲了最大限度的利用多核,能夠開啓多個線程,比開進程開銷要小的多。(這一條並不適用於python)

5、多線程應用舉例

  開啓一個字處理軟件進程,該進程確定須要辦不止一件事情,好比監聽鍵盤輸入,處理文字,定時自動將文字保存到硬盤,這三個任務操做的都是同一塊數據,於是不能用多進程。只能在一個進程裏併發地開啓三個線程,若是是單線程,那就只能是,鍵盤輸入時,不能處理文字和自動保存,自動保存時又不能輸入和處理文字。

 

6、用戶級與內核級線程的對比 

一、如下是用戶級線程和內核級線程的區別

  1. 內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。
  2. 用戶級線程的建立、撤消和調度不須要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的建立、撤消和調度都需OS內核提供支持,並且與進程的建立、撤消和調度大致是相同的。
  3. 用戶級線程執行系統調用指令時將致使其所屬進程被中斷,而內核支持線程執行系統調用指令時,只致使該線程被中斷。
  4. 在只有用戶級線程的系統內,CPU調度仍是以進程爲單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程爲單位,由OS的線程調度程序負責線程的調度。
  5. 用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序實體則是能夠運行在任何狀態下的程序。

二、內核線程的優缺點

  優勢:

  1. 當有多個處理機時,一個進程的多個線程能夠同時執行。

  缺點:

  1. 由內核進行調度。

三、用戶進程的優缺點

  優勢:

  1. 線程的調度不須要內核直接參與,控制簡單。
  2. 能夠在不支持線程的操做系統中實現。
  3. 建立和銷燬線程、線程切換代價等線程管理的代價比內核線程少得多。
  4. 容許每一個進程定製本身的調度算法,線程管理比較靈活。
  5. 線程可以利用的表空間和堆棧空間比內核級線程多。
  6. 同一進程中只能同時有一個線程在運行,若是有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生一樣的問題。

  缺點:

  1. 資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時複用
相關文章
相關標籤/搜索