進程、線程、協程基本概念理解

概述

    最近接觸一些進程、線程、協程、相關的東西,老是容易搞混淆,或者出錯,專門想總結下這塊的幾個概念的問題! html

進程

  • 進程之間不共享任何狀態
  • 進程的調度由操做系統完成
  • 每一個進程都有本身獨立的內存空間
  • 進程間通信主要是經過信號傳遞的方式來實現的,實現方式有多種,信號量、管道、事件等,任何一種方式的通信效率都須要過內核,致使通信效率比較低
  • 因爲是獨立的內存空間,上下文切換的時候須要保存先調用棧的信息、cpu各寄存器的信息、虛擬內存、以及打開的相關句柄等信息,因此致使上下文進程間切換開銷很大,通信麻煩。 spa

線程

  • 線程之間共享變量,解決了通信麻煩的問題
  • 對於變量的訪問須要鎖
  • 線程的調度主要也是有操做系統完成
  • 一個進程能夠擁有多個線程,可是其中每一個線程會共享父進程像操做系統申請資源,這個包括虛擬內存、文件等,因爲是共享資源,因此建立線程所須要的系統資源佔用比進程小不少,相應的可建立的線程數量也變得相對多不少。
  • 線程時間的通信除了可使用進程之間通信的方式之外還能夠經過共享內存的方式進行通訊,因此這個速度比經過內核要快不少。
  • 另外在調度方面也是因爲內存是共享的,因此上下文切換的時候須要保存的東西就像對少一些,這樣一來上下文的切換也變得高效。 操作系統

協程

  • 協程的調度徹底由用戶控制
  • 一個線程能夠有多個協程,用戶建立了幾個線程,而後每一個線程都是循環按照指定的任務清單順序完成不一樣的任務,當任務被堵塞的時候執行下一個任務,當恢復的時候再回來執行這個任務,
  • 任務之間的切換隻須要保存每一個任務的上下文內容,就像直接操做棧同樣的,這樣就徹底沒有內核切換的開銷
  • 能夠不加鎖的訪問全局變量,因此上下文的切換很是快;
  • 另外協程還須要保證是非堵塞的且沒有相互依賴,協程基本上不能同步通信,多采用一步的消息通信,效率比較高。

-------------------------------------------------- 線程

注: orm

一、在阮一峯老師的博客中關於進程、線程的簡單解釋:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 協程

相關文章
相關標籤/搜索