最近在研究一個(gè)高性能的無(wú)鎖共享內(nèi)存消息隊(duì)列,使用的fifo來(lái)通知。結(jié)合之前《基于管道通知的百萬(wàn)并發(fā)長(zhǎng)連接server模型》文章,這里總結(jié)一下常用的通知機(jī)制。
常用的通知機(jī)制中比較典型的有以下幾種:
1、signal
這種機(jī)制下,我們向被通知進(jìn)程發(fā)送一個(gè)特殊的signal(比如SIGUSR1),這樣正在睡眠的讀進(jìn)程就會(huì)被信號(hào)中斷,然后醒來(lái)。
該方法的優(yōu)點(diǎn)是:讀進(jìn)程不需要監(jiān)聽(tīng)一個(gè)額外的eventfd,適合一些不方便使用eventfd的場(chǎng)景;另外,用戶可以選擇是使用實(shí)時(shí)信號(hào)(SIGRTMIN+1),還是使用非實(shí)時(shí)信號(hào)(SIGUSR1)。
該方法的缺點(diǎn)是:通知不實(shí)時(shí)。因?yàn)樾盘?hào)的檢查只有在中斷返回的時(shí)候才會(huì)進(jìn)行,這個(gè)時(shí)間跟操作系統(tǒng)的HZ、jiffies有關(guān)。
2、socket
這種機(jī)制下,寫(xiě)進(jìn)程往socket(domain socket)寫(xiě)一個(gè)字符,然后讀進(jìn)程通過(guò)epoll得到數(shù)據(jù)到達(dá)的通知。
3、fifo
這種機(jī)制跟socket類(lèi)似,寫(xiě)進(jìn)程往fifo中寫(xiě)一個(gè)字符,然后讀進(jìn)程通過(guò)epoll得到數(shù)據(jù)到達(dá)的通知。
4、pipe
跟2、3差不多。
5、eventfd/signalfd
跟前面差不多,不過(guò)是內(nèi)核幫我們事先f(wàn)ifo、signal通知,只有比較新的內(nèi)核版本才支持。這種方式存在的問(wèn)題是需要在不同進(jìn)程間傳遞句柄,非fork方式實(shí)現(xiàn)比較復(fù)雜。
上面這幾種方式的共性是都需要陷入內(nèi)核,被通知進(jìn)程只有在內(nèi)核態(tài)才能接收通知,對(duì)于處理性能要求高的場(chǎng)景,應(yīng)該少用通知。所以,當(dāng)然就看業(yè)務(wù)場(chǎng)景發(fā)送通知的開(kāi)銷(xiāo)是不是很大了。如果請(qǐng)求量很大,讀進(jìn)程一直忙于處理,不會(huì)頻繁觸發(fā)通知,那就很合適了。
新聞熱點(diǎn)
疑難解答
圖片精選