python並發編程之多線程理論部分

來源:互聯網
上載者:User

標籤:自己   yield   接收   資源   post   多線程   實體記憶體   思考   不同   

閱讀目錄

  • 一 什麼是線程  
  • 二 線程的建立開銷小
  • 三 線程與進程的區別
  • 四 為何要用多線程
  • 五 多線程的應用舉例
  • 六 經典的執行緒模式(瞭解)
  • 七 POSIX線程(瞭解)
  • 八 在使用者空間實現的線程(瞭解)
  • 九 在核心空間實現的線程(瞭解)
  • 十 使用者級與核心級線程的對比(瞭解)
  • 十一 混合實現(瞭解)
一 什麼是線程  

  在傳統作業系統中,每個進程有一個地址空間,而且預設就有一個控制線程

  線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個進程

      車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線

      流水線的工作需要電源,電源就相當於cpu

  所以,進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執行單位。

 

  多線程(即多個控制線程)的概念是,在一個進程中存在多個控制線程,多個控制線程共用該進程的地址空間,相當於一個車間內有多條流水線,都共用一個車間的資源。

      例如,北京地鐵與上海地鐵是不同的進程,而北京地鐵裡的13號線是一個線程,北京地鐵所有的線路共用北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。

二 線程的建立開銷小

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

如果我們的軟體是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即cpu(單核cpu)

一個車間就是一個進程,一個車間至少一條流水線(一個進程至少一個線程)

建立一個進程,就是建立一個車間(申請空間,在該空間內建至少一條流水線)

而建線程,就只是在一個車間內造一條流水線,無需申請空間,所以建立開銷小

 

進程之間是競爭關係,線程之間是協作關係?

車間直接是競爭/搶電源的關係,競爭(不同的進程直接是競爭關係,是不同的程式員寫的程式啟動並執行,迅雷搶佔其他進程的網速,360把其他進程當做病毒乾死)
一個車間的不同流水線式協同工作的關係(同一個進程的線程之間是合作關係,是同一個程式寫的程式內開啟動,迅雷內的線程是合作關係,不會自己幹自己)

三 線程與進程的區別
  1. Threads share the address space of the process that created it; processes have their own address space.
  2. Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
  3. Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
  4. New threads are easily created; new processes require duplication of the parent process.
  5. Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
  6. Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.
四 為何要用多線程

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

  1. 多線程共用一個進程的地址空間

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

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

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

五 多線程的應用舉例

開啟一個文書處理軟體進程,該進程肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字儲存到硬碟,這三個任務操作的都是同一塊資料,因而不能用多進程。只能在一個進程裡並發地開啟三個線程,如果是單線程,那就只能是,鍵盤輸入時,不能處理文字和自動儲存,自動儲存時又不能輸入和處理文字。

六 經典的執行緒模式(瞭解)

  多個線程共用同一個進程的地址空間中的資源,是對一台電腦上多個進程的類比,有時也稱線程為輕量級的進程

  而對一台電腦上多個進程,則共用實體記憶體、磁碟、印表機等其他實體資源。

  多線程的運行也多進程的運行類似,是cpu在多個線程之間的快速切換。

  不同的進程之間是充滿敵意的,彼此是搶佔、競爭cpu的關係,如果迅雷會和QQ搶資源。而同一個進程是由一個程式員的程式建立,所以同一進程內的線程是合作關係,一個線程可以訪問另外一個線程的記憶體位址,大家都是共用的,一個線程乾死了另外一個線程的記憶體,那純屬程式員腦子有問題。

  類似於進程,每個線程也有自己的堆棧

  不同於進程,線程庫無法利用時鐘中斷強制線程讓出CPU,可以調用thread_yield運行線程自動放棄cpu,讓另外一個線程運行。

  

  線程通常是有益的,但是帶來了不小程式設計難度,線程的問題是:

  1. 父進程有多個線程,那麼開啟的子線程是否需要同樣多的線程

   如果是,那麼附近中某個線程被阻塞,那麼copy到子進程後,copy版的線程也要被阻塞嗎,想一想nginx的多線程模式接收使用者串連。

  2. 在同一個進程中,如果一個線程關閉了問題,而另外一個線程正準備往該檔案內寫內容呢?

          如果一個線程注意到沒有記憶體了,並開始分配更多的記憶體,在工作一半時,發生線程切換,新的線程也發現記憶體不夠用了,又開始分配更多的記憶體,這樣記憶體就被分配了多次,這些問題都是多線程編程的典型問題,需要仔細思考和設計。

七 POSIX線程(瞭解)

    為了實現可移植的線程程式,IEEE在IEEE標準1003.1c中定義了線程標準,它定義的線程包叫Pthread。大部分UNIX系統都支援該標準,簡單介紹如下

八 在使用者空間實現的線程(瞭解)

    線程的實現可以分為兩類:使用者級線程(User-Level Thread)和核心線線程(Kernel-Level Thread),後者又稱為核心支援的線程或輕量級進程。在多線程作業系統中,各個系統的實現方式並不相同,在有的系統中實現了使用者級線程,有的系統中實現了核心級線程。

    使用者級線程核心的切換由使用者態程式自己控制核心切換,不需要核心幹涉,少了進出核心態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。

 

   在使用者空間類比作業系統對進程的調度,來調用一個進程中的線程,每個進程中都會有一個運行時系統,用來調度線程。此時當該進程擷取cpu時,進程內再調度出一個線程去執行,同一時刻只有一個線程執行。

九 在核心空間實現的線程(瞭解)

    核心級線程:切換由核心控制,當線程進行切換的時候,由使用者態轉化為核心態。切換完畢要從核心態返回使用者態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。

十 使用者級與核心級線程的對比(瞭解)

    一: 以下是使用者級線程和核心級線程的區別:

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

    二: 核心線程的優缺點

  優點:

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

  缺點:

  1. 由核心進行調度。

    三: 使用者進程的優缺點

  優點:

  1. 線程的調度不需要核心直接參与,控制簡單。
  2. 可以在不支援線程的作業系統中實現。
  3. 建立和銷毀線程、線程切換代價等線程管理的代價比核心線程少得多。
  4. 允許每個進程定製自己的調度演算法,線程管理比較靈活。
  5. 線程能夠利用的資料表空間和堆棧空間比核心級線程多。
  6. 同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生同樣的問題。

  缺點:

  1. 資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時複用
十一 混合實現(瞭解)

  使用者級與核心級的多工,核心同一調度核心線程,每個核心線程對應n個使用者線程

python並發編程之多線程理論部分

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.