epoll實現中共享內存問題?
看了不少博客中提到,epoll_wait返回時,對於就緒的事件,epoll使用的是共享內存的方式,即用戶態和內核態都指向了就緒鏈表,所以就避免了內存拷貝消耗.那我就有一個疑問,epoll_wait函數第二參數,為什麼要現在用戶態分配內存,如果是共享,應該傳一個指針即可,內核將它指向共享的就緒鏈表即可?
那些博客抄來抄去,都是錯的。
epoll_wait的實現~有關從內核態拷貝到用戶態代碼.可以看到__put_user這個函數就是內核拷貝到用戶空間.分析完整個linux 2.6版本的epoll實現沒有發現使用了mmap系統調用,根本不存在共享內存在epoll的實現
if (revents) {
/* 將當前的事件和用戶傳入的數據都copy給用戶空間,
* 就是epoll_wait()後應用程序能讀到的那一堆數據. */
if (__put_user(revents, uevent-&>events) ||
__put_user(epi-&>event.data, uevent-&>data)) {
/* 如果copy過程中發生錯誤, 會中斷鏈表的掃描,
* 並把當前發生錯誤的epitem重新插入到ready list.
* 剩下的沒處理的epitem也不會丟棄, 在ep_scan_ready_list()
* 中它們也會被重新插入到ready list */
list_add(epi-&>rdllink, head);
return eventcnt ? eventcnt : -EFAULT;
}
你看的什麼博客?CSDN?iteye?博客園?還是今日頭條啊?
用戶態能訪問到內核使用的內存的地方就沒幾個。我不太清楚你說的是哪個。epoll_wait 的那個 struct epoll_event* 是用戶態給的。epoll 機制會在內核有狀態,但那絕不是共享內存,因為那部分數據用戶態是訪問不到的。多看源碼,代碼面前無秘密
可以下載一個源碼:
在eventpoll.c 文件里找下面這個函數:static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, int maxevents, long timeout)思考發現不合理的,看源碼一下就明白,epoll的源碼沒多少。 畢竟博文這些都是個人理解,也沒有權威解釋。
記得我第一次寫plsql觸發器腳本時,然後查了幾個函數的用法
泥煤啊,調試了半天,結果都不對,本來我就只是個半道出家的渣渣程序員,搞的我一度懷疑自己適合不適合干程序開發!耗了我一天半,最後發現那博客寫的錯的更可恨的是百度靠前三四篇博客園和csdn里的博客都是一樣的錯!很顯然他們是相互抄的
…不過,還是蠻感謝csdn和博客園的博主們,因為真的在裡面學到好多東西推薦閱讀:
※大神們來看看這樣架構 使用epoll有沒有問題?
※Linux 3.x 中epoll的驚群問題?
※node.js 底層使用的是epoll這種單線程io多路復用,還是多線程阻塞模型?
TAG:epoll |