非阻塞IO為什麼能降低執行緒數量?

時間 2023-01-28 14:35:12

1樓:去看流星落不

首先非阻塞 原理還是在其他執行緒中去執行功能,而不是在呼叫此功能的執行緒中去執行,呼叫執行緒在呼叫後可以立即返**用處繼續往下執行,所以不會阻塞,但是原本一個執行緒做的事情,現在讓幾個執行緒去做了,執行緒數量肯定增加了,但是此程序,這裡是程序,可使用的執行緒數 是減少的,是可使用。

2樓:匿名使用者

簡單說,就是提高io的利用率。。。

非阻塞的io需要一直搶佔cup嗎

什麼是阻塞式和非阻塞io流?

3樓:淋漆魚

阻塞io:socket 的阻塞模式意味著必須要做完io 操作(包括錯誤)才會返回。

非阻塞io:非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功。

兩者區別:所謂阻塞方式的意思是指, 當試圖對該檔案描述符進行讀寫時, 如果當時沒有東西可讀,或者暫時不可寫, 程式就進入等待 狀態, 直到有東西可讀或者可寫為止。

對於非阻塞狀態, 如果沒有東西可讀, 或者不可寫, 讀寫函式馬上返回, 而不會等待 。

一種常用做法是:每建立一個socket連線時,同時建立一個新執行緒對該socket進行單獨通訊(採用阻塞的方式通訊)。這種方式具有很高的響應速度,並且控制起來也很簡單,在連線數較少的時候非常有效,但是如果對每一個連線都產生一個執行緒的無疑是對系統資源的一種浪費,如果連線數較多將會出現資源不足的情況。

一種較高效的做法是:伺服器端儲存一個socket連線列表,然後對這個列表進行輪詢,如果發現某個socket埠上有資料可讀時(讀就緒),則呼叫該socket連線的相應讀操作。

如果發現某個 socket埠上有資料可寫時(寫就緒),則呼叫該socket連線的相應寫操作;如果某個埠的socket連線已經中斷,則呼叫相應的析構方法關閉該埠。這樣能充分利用伺服器資源,效率得到了很大提高。

4樓:戰略性轉移

1、阻塞:一般的i/o操作可以在新建的流中運用。在伺服器回應前它等待客戶端傳送一個空白的行。

當會話結束時,伺服器關閉流和客戶端socket.如果在佇列中沒有請示將會出現什麼情況呢?那個方法將會等待一個的到來。

這個行為叫阻塞。accept()方法將會阻塞伺服器執行緒直到一個呼叫到來。當5個連線處理完閉之後,伺服器退出。

任何的在佇列中的呼叫將會被取消。

2、非阻塞:非阻塞套接字是指執行此套接字的網路呼叫時,不管是否執行成功,都立即返回。比如呼叫recv()函式讀取網路緩衝區中資料,不管是否讀到資料都立即返回,而不會一直掛在此函式呼叫上。

在實際windows網路通訊軟體開發中,非同步非阻塞套接字是用的最多的。平常所說的c/s(客戶端/伺服器)結構的軟體就是非同步非阻塞模式的。

如何理解node.js中 單執行緒,非阻塞io,事件

5樓:

中單執行緒就相當於火車站售票廳只開一個售票視窗,那麼所有的人都要通過這個視窗去買票,如果說這些人不排隊都爭搶這個視窗,可想而知,每一個人想買到票很難,還有一個就是我們經常做公交車,公交車師傅有時候只開前門,這時候很多人都搶著上車,你會發現擠上車特別難,現實生活中,只開一個門或只開一個售票視窗,在程式上看來都是單執行緒的,此時,就需要引入排隊機制,不排隊就會產生擁堵,隨都做不了事情。

生活如此,程式也是如此,不引入排隊機制,就會產生阻塞。

再回到,既然它是單執行緒的,就不能是阻塞的,就像一個人 站在售票口那裡,突然發現自己沒帶錢,然後他就打**叫別人送點錢過來,而此時這個人依然站在售票口那裡,堅決不讓出位置讓後面的人買票,可想而知,就產生阻塞。

現實生活中,如果這個人發現自己沒帶錢,最好的辦法應該是這樣做。

始終與後面買票人交換一下位置 ,很多黃牛之所以可以快速的幫別人買票就是這樣做的,因為黃牛專門有人在售票口那裡佔位。

所謂事件驅動就是,一旦你造成阻塞了,你就靠一邊站,等到什麼時候不再阻塞,你再通知我,我再把你加入排隊當中,再次等待被處理。

眾所周知,io都是阻塞的,而卻說自己是非阻塞io,那麼只能說明一點,io肯定不是由來處理, node.

js會把io這項工作分配給別人來做,別人io完了,再事件通知,將io結果重新加入排隊,等待被處理。

類似的生活案例還有,醫院專家門診看病,做b超相當於io,做完b超完回來,一般需要重新加入排隊;或者在做b超前,醫生叮囑他,你做完b超後就可以拿著b超結果直接找我不必要再重新排隊。

如何發揮nodejs單執行緒非同步非阻塞i/o效能優勢

j**a:什麼叫做同步非阻塞io呢?

6樓:優就業郭老師

這個io不用等待對方返回結果,開啟io指令執行完成後,會繼續執行指令後面的操作,當對方返回資料後會出發一個事件,告訴你資料回來了,例如使用selector的非阻塞io.你應當看看。

7樓:匿名使用者

假設你等待訊息的執行緒是a,那麼在a中再啟動個子執行緒a1,把等待訊息這個操作扔給a1去,你在a中就使用while(true){}這樣一個迴圈,反覆去呼叫a1的一個方法來獲取訊息返回結果,比如,你可以定義個訊息儲存變數object result = null;(也可以不為null,反正你可以設定一個值,這個值肯定不會出現在返回訊息中的,後續判斷操作有用)你把接收到的訊息賦值給result,然後你再提供個getresult方法,獲取result值,因為你還沒收到訊息,就會堵塞在接收那句**,那麼賦值操作也不會執行咯,因此,result還是null,那麼你在a執行緒中獲取到的result也是null,通過這個值,你就可以判斷出訊息是否返回同時又可以在a執行緒中根據實際情況去做後續的操作。以上大概是我的理解了。

為什麼 io 多路複用要搭配非阻塞 io

8樓:匿名使用者

epoll的et模式下是必須使用非阻塞io的。

et模式指的是當資料從無到有時,才通知該fd。資料讀不完,也不會再次通知,所以read時一定要採用迴圈的方式一直讀到read函式返回-1為止。此時採用阻塞的read,那麼就阻塞了整個執行緒。

gl028拉伸機為什麼不能降

拉伸機出現這種情況,要看一下是否說他這個拉伸杆有問題,然後還要看一下是不是系統這個問題。您說的這個拉昇機為什麼不能降?這個是可以上升和下降的。只要按它的上升或下降按鈕就可以。在拉伸的話能不能降是可以降的,因為這個拉伸機的話是可以降到最低的,誰能這樣我綁著我這個設定裡面設定成最低就行了。升級為什麼不能...

ios為什麼不能降級啊,真搞不懂

安徽電信網上營業廳 ios裝置一旦升級ios系統就無法降級了,因為 1 ios採用推薦升級 強制保持最新的升級策略,一旦升級就再無可能降級。2 強制保持最新系統版本是為了防止低版本中存在的漏洞對使用者造成資訊洩露。3 蘋果自ios7推出id鎖,禁止降級是為了防止有人偷盜手機通過降級的方法重新使用手機...

空調維修後溫度只能降到23度為什麼

唯愛凌寶寶 首先要檢視壓縮機是否工作,如果壓縮機熱保護器跳閘,壓縮機不工作,不會製冷。壓縮機熱保護的原因 1 散熱片過髒導致散熱不良引起熱保護。用自來水把散熱片沖洗乾淨就可以了。2 風扇轉速下降 一是電容容量下降 二是電機潤滑不良 三是電機線圈部分短路 四是風扇葉片斷裂或變形。如果壓縮機工作制冷不好...