多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 淺談我對協程的理解

淺談我對協程的理解

來源:程序員人生   發布時間:2015-01-16 08:49:37 閱讀次數:6814次

我心中的協程

最近在研究網絡服務框架方面的東西,發現了1個奇異的東西-協程。
1句話說明甚么是線程:協程是1種用戶態的輕量級線程

1句話其實不能完全概括協程的全部,但是最少能讓我們對協程這個概念有1個基本的印象。
從硬件發展來看,從最初的單核單CPU,到單核多CPU,多核多CPU,似乎已到了極限了,但是單核CPU性能卻還在不斷提升。server端也在不斷的發展變化。如果將程序分為IO密集型利用和CPU密集型利用,2者的server的發展以下:
IO密集型利用: 多進程->多線程->事件驅動->協程
CPU密集型利用:多進程-->多線程

如果說多進程對多CPU,多線程對應多核CPU,那末事件驅動和協程則是在充分發掘不斷提高性能的單核CPU的潛力。
以下的討論如無特別說明,不斟酌cpu密集型利用。

異步 vs 同步

不管是線程還是進程,使用的都是同步進制,當產生阻塞時,性能會大幅度下降,沒法充分利用CPU潛力,浪費硬件投資,更重要造成軟件模塊的鐵板化,緊耦合,沒法切割,不利于往后擴大和變化。不論是進程還是線程,每次阻塞、切換都需要墮入系統調用(system call),先讓CPU跑操作系統的調度程序,然后再由調度程序決定該跑哪個進程(線程)。多個線程之間在1些訪問互斥的代碼時還需要加上鎖,這也是致使多線程編程難的緣由之1。

現下流行的異步server都是基于事件驅動的(如nginx)。事件驅動簡化了編程模型,很好地解決了多線程難于編程,難于調試的問題。異步事件驅動模型中,把會致使阻塞的操作轉化為1個異步操作,主線程負責發起這個異步操作,并處理這個異步操作的結果。由于所有阻塞的操作都轉化為異步操作,理論上主線程的大部份時間都是在處理實際的計算任務,少了多線程的調度時間,所以這類模型的性能通常會比較好。

總的說來,當單核cpu性能提升,cpu不在成為性能瓶頸時,采取異步server能夠簡化編程模型,也能提高IO密集型利用的性能。

協程 vs 線程

之前說道,協程是1種用戶級的輕量級線程。協程具有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。因此:

協程能保存上1次調用時的狀態(即所有局部狀態的1個特定組合),每次進程重入時,就相當于進入上1次調用的狀態,換種說法:進入上1次離開時所處邏輯流的位置。

在并發編程中,協程與線程類似,每一個協程表示1個履行單元,有自己的本地數據,與其它協程同享全局數據和其它資源。目前主流語言基本上都選擇了多線程作為并發設施,與線程相干的概念是搶占式多任務(Preemptive multitasking),而與協程相干的是協作式多任務

不論是進程還是線程,每次阻塞、切換都需要墮入系統調用(system call),先讓CPU跑操作系統的調度程序,然后再由調度程序決定該跑哪個進程(線程)。
而且由于搶占式調度履行順序沒法肯定的特點,使用線程時需要非常謹慎地處理同步問題,而協程完全不存在這個問題(事件驅動和異步程序也有一樣的優點)。

我們在自己在進程里面完成邏輯流調度,碰著io我就用非阻塞式的。那末我們便可以利用到異步優勢,又可以免反復系統調用,還有進程切換釀成的開消,分分鐘給你上幾千個邏輯流不費力。這就是協程。

協程 vs 事件驅動

以nginx為代表的事件驅動的異步server正在橫掃天下,那末事件驅動模型會是server端模型的終點嗎?
我們可以深入了解下,事件驅動編程的模型。
事件驅動編程的架構是預先設計1個事件循環,這個事件循環程序不斷地檢查目前要處理的信息,根據要處理的信息運行1個觸發函數。其中這個外部信息可能來自1個目錄夾中的文件,可能來自鍵盤或鼠標的動作,或是1個時間事件。這個觸發函數,可以是系統默許的也能夠是用戶注冊的回調函數。

事件驅動程序設計側重于彈性和異步化上面。許多GUI框架(如windows的MFC,Android的GUI框架),Zookeeper的Watcher等都使用了事件驅動機制。未來還會有其他的基于事件驅動的作品出現。

基于事件驅動的編程是單線程思惟,其特點是異步+回調。
協程也是單線程,但是它能讓原來要使用異步+回調方式寫的非人類代碼,可以用看似同步的方式寫出來。它是實現推拉互動的所謂非搶占式協作的關鍵。

總結

協程的好處:

  • 跨平臺
  • 跨體系架構
  • 無需線程上下文切換的開消
  • 無需原子操作鎖定及同步的開消
  • 方便切換控制流,簡化編程模型
  • 高并發+高擴大性+低本錢:1個CPU支持上萬的協程都不是問題。所以很合適用于高并發處理。

缺點:

  • 沒法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU上.固然我們平常所編寫的絕大部份利用都沒有這個必要,除非是cpu密集型利用。
  • 進行阻塞(Blocking)操作(如IO時)會阻塞掉全部程序:這1點和事件驅動1樣,可使用異步IO操作來解決
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美18videosex性欧美1819 | 日韩精品一区二区三区在线观看l | 在线观看国产情趣免费视频 | 另类二区 | 欧美另类丰满69xxxxx | 欧美一二区视频 | 手机在线成人精品视频网 | 黑人欧美一级毛片 | 亚洲精品456 | 欧美日本性 | 日韩 欧美 亚洲国产 | www.99爱| 亚洲女人天堂 | 在线成h人视频网站免费观看 | 污污成人一区二区三区四区 | 中文字幕高清 | 国产一区二区免费播放 | 自拍偷拍网 | 欧美精品在线一区二区三区 | 中文字幕在线视频播放 | 伊人啪啪 | 青青草原亚洲视频 | 日韩18在线观看 | 成人久久精品一区二区三区 | 中文在线免费视频 | 国产一区二区三区在线免费观看 | 色综合网亚洲精品久久 | jizz国产精品 | 羞羞视频动漫 | 最新国产大片高清视频 | 欧美 亚洲 校园 第一页 | 97久久精品午夜一区二区 | 国产成视频 | 国产精品欧美亚洲 | 久久精品国产6699国产精 | 国产精品欧美韩国日本久久 | 自拍在线 | 欧美一级毛片高清毛片 | www.97av| 亚洲成a人v欧美综合天 | 日韩欧美一区黑人vs日本人 |