摘要:為了讓服務器能接受更多客戶端的連接,非阻塞模型就出現(xiàn)了。阻塞模型下的實現(xiàn)方式在阻塞模型下,利用異步處理的方式對線程進行分工協(xié)作。非阻塞模型徹底消滅線程工作不飽和非阻塞模型下,操作不再是阻塞的了,而是立即返回。這是所謂的同步非阻塞。
阻塞模型限制了服務器的并發(fā)處理能力(伸縮性或同時處理的客戶端連接數(shù))
傳統(tǒng)的網(wǎng)絡服務器只支持阻塞模型,該模型下,針對每個客戶端連接,服務器都必須創(chuàng)建一個線程來處理這個連接上的請求,服務器必須維持著這些線程直到線程中的處理工作結束。
服務器上所能創(chuàng)建的線程數(shù)量是有限的,WHY?
進程上下文切換是耗時的過程
創(chuàng)建的進程本身占用資源,比如每個進程或線程占用一定容量的內存
等待數(shù)據(jù)準備和內核緩存復制,導致IO阻塞,占用著線程
所以當連接到服務器上的客戶端的數(shù)量很大時,把服務器上所能創(chuàng)建的線程都占據(jù)了時,服務器就無法接受更多的連接了。這限制了服務器處理請求的伸縮性。
并非所有客戶端都是持續(xù)活躍的存在這樣一個事實,就是雖然連接到服務器上的客戶端很多,但并非所有客戶端都是持續(xù)活躍著的。它們占據(jù)著阻塞式服務器的線程資源——即使它們處于非工作狀態(tài)。這些線程占據(jù)了資源,卻不工作。
這會造成什么現(xiàn)象呢?
就是線程時間的碎片化——一個線程大部分時間是在等待IO操作的結果。
為了讓服務器能接受更多客戶端的連接,非阻塞模型就出現(xiàn)了。
如何提升服務器的并發(fā)處理能力?消滅碎片化時間,可以提升服務器的并發(fā)處理能力。
如何消滅碎片化時間? 讓線程分工協(xié)作各司其職,是一個很好的手段。
原來的阻塞模型下,一個線程要干所有的事情。分工協(xié)作機制下,一部分線程專門用于接受客戶端的連接、一部分專門用于獲取請求的數(shù)據(jù)、一部分專門執(zhí)行計算工作、還有一部分線程專門用于響應客戶端。
接受客戶端連接的線程在接收到客戶端連接后,立即把連接交給后續(xù)工序的線程處理,而它自己則繼續(xù)接受下一個連接。如此類推,各個線程無須等待,不存在碎片化時間,全負荷工作。
這樣一來,整體上需要的較少的線程,就可以完成以前需要較多線程才能達到的工作時間了。
在阻塞模型下,利用異步處理的方式對線程進行分工協(xié)作。接收請求的線程可以滿負荷工作,但處理IO操作的線程仍然是阻塞著的,仍然存在線程工作不飽和的現(xiàn)象。
非阻塞模型徹底消滅線程工作不飽和非阻塞模型下,IO操作不再是阻塞的了,而是立即返回。這樣的話,處理IO操作的線程,可以在空閑時對所有請求進行輪詢,以便判斷哪些IO操作已完成。比如判斷某個請求是否可以進行“寫”操作,如果還不可以,無須等待,繼續(xù)判斷下一個請求是否可以進行“讀”操作,如果可以則立即讀取數(shù)據(jù),然后把數(shù)據(jù)轉交給專職計算的線程。這樣就讓線程工作不飽和現(xiàn)象消失了。
這是所謂的“同步非阻塞”。
輪詢的耗時如何消滅?這就要請出“IO復用”這尊大神了。
IO復用模型下,線程一次性從操作系統(tǒng)那兒獲得一批可以進行IO操作的請求,處理完畢后,再此獲得新的一批。線程無須與操作系統(tǒng)交互多次以便輪詢每個請求的狀態(tài),而是與操作系統(tǒng)交互一次即可獲得批量信息。效率進一步提高啦。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72170.html
摘要:的異步即是異步的,也是非阻塞的。但是,也可以進行一層稍微薄點的封裝,保留這種多路復用的模型,比如的,是一種同步非阻塞的模型。系統(tǒng)調用操作系統(tǒng)的系統(tǒng)調用提供了多路復用的非阻塞的系統(tǒng)調用,這也是機制實現(xiàn)需要用到的。 異步IO編程在javascript中得到了廣泛的應用,之前也寫過一篇博文進行梳理。js的異步IO即是異步的,也是非阻塞的。非阻塞的IO需要底層操作系統(tǒng)的支持,比如在linux上...
摘要:進程和線程究竟是什么東西傳統(tǒng)網(wǎng)絡服務模型是如何工作的協(xié)程和線程的關系和區(qū)別有哪些過程在什么時間發(fā)生在剛剛結束的上海站,來自七牛云存儲的高級工程師許智翔帶來了關于的分享中的進程線程協(xié)程同步異步回調。使用紅黑樹管理就緒隊列。 進程和線程究竟是什么東西?傳統(tǒng)網(wǎng)絡服務模型是如何工作的?協(xié)程和線程的關系和區(qū)別有哪些?IO過程在什么時間發(fā)生? 在剛剛結束的 PyCon2014 上海站,來自七牛云...
摘要:下文如無特殊聲明將使用進程同時表示進程線程。收到數(shù)據(jù)后服務器程序進行處理然后使用向客戶端發(fā)送響應。現(xiàn)在各種高并發(fā)異步的服務器程序都是基于實現(xiàn)的,比如。 并發(fā) IO 問題一直是服務器端編程中的技術難題,從最早的同步阻塞直接 Fork 進程,到 Worker 進程池/線程池,到現(xiàn)在的異步IO、協(xié)程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細介...
閱讀 1553·2023-04-26 01:36
閱讀 2719·2021-10-08 10:05
閱讀 2775·2021-08-05 09:57
閱讀 1538·2019-08-30 15:52
閱讀 1193·2019-08-30 14:12
閱讀 1311·2019-08-30 11:17
閱讀 3097·2019-08-29 13:07
閱讀 2415·2019-08-29 12:35