這里將以對話的形式進行:
A:
普通的線程是可以被其他線程中斷掉的,而基于select、epoll的事件處理函數實際上是不可以被其他事件(線程)中斷的。
我這個理解對嗎?
B:
圖片里的應該是對是否可以并行,多路復用的說法,
傳統的io操作,可以在主進程里串行等待執行完再處理下面的邏輯,但邏輯上沒有強相關的情況,可以并行去執行各種io(用戶態),而主進程或其他子線程可以繼續做其他事
傳統的io線程,主進程中是可以中斷的,知道線程id,去中斷就可以
而select, epoll 主要是為了實現多路復用吧,配有監聽進程的,不會被其他線程中斷的
A:
哦哦 那如果在bind cpu1的進程使用了epoll 并開啟了監聽 注冊好了事件處理函數 那么觸發多個事件的時候也只能順序地在本cpu上挨個處理 不能擴散到其他cpu上 對吧?
看代碼好像是這樣。那這樣的話 如果把一臺機器上所有的核都用上 實際上就和多線程一樣了。
B:
是的
A:
但是又有個問題 如果所有進程都在運行事件處理函數 那我此時再開啟一個另外服務的進程不就是沒用了嗎 因為每個核都不可中斷。這樣只能等到某個核的事件處理函數搞好了才能讓出cpu。
那么如果一個8核的cpu 8個核都被業務進程bind 然后事件處理函數中又有讀取本機數據庫的操作 但是數據庫進程又不能占到cpu 這樣不就系統不就死鎖了嗎。
感覺這樣就很不合理。
B:
如果一個核上有進程在跑,那肯定是要等處理完,新的服務進程才能使用
8核的這種情況,如果一直沒占用著,那肯定是需要擴容的,或者調成業務的邏輯。另外數據庫的連接是在線程里處理的吧
A:
哦哦
或者把數據庫放到云上 以網絡請求的方式獲取
這樣一來我大概懂了
B:
嗯,數據庫和業務服務是分開部署的
A:
這幾天在看操作系統導論的 看到基于線程的服務器與基于事件的服務器的區別感覺不是很理解。
我之前學網絡編程以及看公司里面的框架是基于事件的,就沒見到過基于線程的。
基于線程的服務器里感覺應該用協程更好理解 顯式yield而不是讓操作系統進行切換。
B:
嗯,工業里肯定是基于事件的,各層之間是分開部署的,不會都揉在一起
A:
主要是我之前以為事件處理的時候是可以被其他進程中斷的這樣就不能理解為何阻塞了
B:
嗯,c++里的協程是一種方案,java里其實沒協程,但可自己去實現
A:
嗯 協程我也沒用過
23標準才比較全 20的協程還需要自己再封裝
參考
https://zhuanlan.zhihu.com/p/32961438
http://t.zoukankan.com/feng9exe-p-10485519.html
https://blog.csdn.net/Chen4852010/article/details/123163903
http://www.imxmx.com/Item/1/117655.html