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