關於非同步IO的乙個疑問

2022-08-17 02:27:15 字數 575 閱讀 9478

執行緒是作業系統的核心物件,多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些 cpu 時間是乙個額外的耗費。所以在一些高併發的網路伺服器程式設計中,使用乙個執行緒服務乙個 socket 連線是很不明智的。於是作業系統提供了基於事件模式的非同步程式設計模型。用少量的執行緒來服務大量的網路連線和i/o操作。但是採用非同步和基於事件的程式設計模型,複雜化了程式**的編寫,非常容易出錯。因為執行緒穿插,也提高排查錯誤的難度。

協程,是在應用層模擬的執行緒,他避免了上下文切換的額外耗費,兼顧了多執行緒的優點。簡化了高併發程式的複雜度。舉個例子,乙個高併發的網路伺服器,每乙個socket連線進來,伺服器用乙個協程來對他進行服務。**非常清晰。而且兼顧了效能。

問:為啥非同步io,因為非同步容易導致邏輯錯誤?

非同步程式設計為了追求程式的效能,強行的將線性的程式打亂,程式變得非常的混亂與複雜。對程式狀態的管理也變得異常困難。寫過nginx c module的同學應該知道我說的是什麼。我們開始吐槽nodejs那噁心的層層callback。

問:是因為執行流被拆成了小模組(每次因req導致阻塞就分割乙個小模組),導致無法覆盤原作者的思路(原來的完整執行流) ?

**:

關於Binder Thread的乙個疑問

問題描述 最近在一本書上看到這樣一句話 乙個binder服務端實際上就是乙個binder類的物件,該物件一旦建立,內部就啟動乙個隱藏執行緒。該執行緒接下來會接收binder驅動傳送的訊息。我有以下2個疑問 1 這個隱藏執行緒是在什麼地方被建立的?2 android中的系統服務也是從binder派生的...

乙個redis lock的疑問

payed key valentines day 2019 is payed date format uid,t uid,date str,event name 拿到所有的檔案,進行扣錢,傳送操作 with events cacher v2.get redis lock payed key if e...

回答乙個同事關於模板的疑問

例子打頭 p34 template class a p35 void f a void g a void foo 上面是我同事的疑問.下面是我的想法 a不是乙個類,a是個類的模板,編譯器根據給定的t值生成不同的a 型別,這些a 型別一旦生成後互相在型別上來說是沒有本質聯絡的.a string和a c...