鍍金池/ 問答/Java  PHP  Linux/ nginx是同步的網(wǎng)絡(luò)IO還是異步的網(wǎng)絡(luò)IO

nginx是同步的網(wǎng)絡(luò)IO還是異步的網(wǎng)絡(luò)IO

如題,我所知道的是nginx是多進(jìn)程的。主進(jìn)程(父進(jìn)程)通過epoll向內(nèi)核注冊IO事件,當(dāng)IO事件發(fā)生的時(shí)候內(nèi)核會(huì)發(fā)送信號給父進(jìn)程,這是父進(jìn)程通知一個(gè)子進(jìn)程去內(nèi)核的緩沖區(qū)拿數(shù)據(jù)進(jìn)行處理。也就是說nginx使用的是“IO多路復(fù)用”,IO多路復(fù)用意味著用戶進(jìn)程需要自己使用一個(gè)線程將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū),是同步的。

我不知道我上面理解的對不對,但是我看網(wǎng)上的很多資料是說nginx使用的是異步IO模型,我所理解的異步IO是:當(dāng)數(shù)據(jù)到達(dá)內(nèi)核緩沖區(qū)后,內(nèi)核負(fù)責(zé)吧數(shù)據(jù)從內(nèi)和緩沖區(qū)復(fù)制到用戶緩沖區(qū)。

所以nginx的網(wǎng)絡(luò)模型到底是什么樣的?還請大神指點(diǎn)啊!## 標(biāo)題文字 ##

回答
編輯回答
拽很帥

nginx在linux一般是用epoll, 它使用的是注冊回調(diào)函數(shù),數(shù)據(jù)準(zhǔn)備好自動(dòng)調(diào)用。這個(gè)過程其實(shí)阻塞的。master分配某個(gè)連接給worker進(jìn)程,worker同一時(shí)間的阻塞的,只能處理一個(gè)請求。。還有nginx是多進(jìn)程模型的

2017年10月4日 21:42
編輯回答
深記你

POSIX 定義:An asynchronous I/O operation does not cause the requesting process to be blocked;
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

epoll 在內(nèi)核返回就緒事件時(shí)需要用戶線程自己進(jìn)行讀寫,這個(gè)過程是阻塞的,所以是同步的而非異步。

2017年5月2日 20:58
編輯回答
尕筱澄

我理解nginx的網(wǎng)絡(luò)IO在單個(gè)具體處理進(jìn)程中是同步的。因?yàn)樗谔幚頃r(shí)是網(wǎng)絡(luò)阻塞的。

2017年9月30日 13:18