www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > C語言與CPP編程
[導(dǎo)讀]揭開高性能服務(wù)器底層面紗一、前言我們經(jīng)常聽說高性能服務(wù)器,那什么是高性能服務(wù)器;用大白話來解釋就是說處理事件快,效率高,占用服務(wù)器資源少,多路復(fù)用等等集萬千寵愛于一身;但是,往往要想做到高性能,這是非常難的,需要一個好的優(yōu)秀的架構(gòu)和底層接口。這篇文章只限于linux平臺,對于wi...

揭開高性能服務(wù)器底層面紗

一、前言

我們經(jīng)常聽說高性能服務(wù)器,那什么是高性能服務(wù)器;用大白話來解釋就是說處理事件快,效率高,占用服務(wù)器資源少,多路復(fù)用等等集萬千寵愛于一身;但是,往往要想做到高性能,這是非常難的,需要一個好的優(yōu)秀的架構(gòu)和底層接口。

這篇文章只限于 linux 平臺,對于 windows 平臺下,可以去參考下 IOCP 的用法,這里就不多說了~

目前主流的高性能服務(wù)器底層都是封裝了 EPOLL 接口,使用 epoll 進行事件處理,為什么 epoll 可以作為高性能服務(wù)器底層事件處理?那就讓我們從源碼下手,來揭開面紗~

二、源碼解讀

兩個至關(guān)重要的結(jié)構(gòu)體

eventpoll結(jié)構(gòu)體:

/*
?*?此結(jié)構(gòu)體存儲在file->private_data中
?*/
/*
????eventpoll結(jié)構(gòu)體是epoll的核心里面存放著許多信息,主要包括
????1.?struct?rb_root?rbr;這是一顆紅黑樹的根節(jié)點,代表著一顆紅黑樹,
????紅黑樹下面掛的是我們感興趣的socket的事件,當(dāng)我們調(diào)用epoll_ctl向
????epoll添加感興趣的socket事件時,系統(tǒng)將我們的傳遞的信息封裝成
????struct?epitem結(jié)構(gòu)體,然后掛到這顆紅黑樹的相應(yīng)節(jié)點上
????2.struct?list_head?rdllist;這是一個雙向鏈表,這個雙向鏈表中存放
????的是就緒的事件當(dāng)我們調(diào)用epoll_wait的時候這些事件會返回給用戶
????3.struct?file?*file;文件結(jié)構(gòu)指針,指向epoll文件
????*/
struct?eventpoll?{
??//?自旋鎖,在kernel內(nèi)部用自旋鎖加鎖,就可以同時多線(進)程對此結(jié)構(gòu)體進行操作
??//?主要是保護ready_list
??spinlock_t?lock;
??//?這個互斥鎖是為了保證在eventloop使用對應(yīng)的文件描述符的時候,文件描述符不會被移除掉
??struct?mutex?mtx;
??//?epoll_wait使用的等待隊列,和進程喚醒有關(guān)
??wait_queue_head_t?wq;
??//?file->poll使用的等待隊列,和進程喚醒有關(guān)
??wait_queue_head_t?poll_wait;
??//?就緒的描述符隊列,雙向鏈表
??struct?list_head?rdllist;
??//?通過紅黑樹來組織當(dāng)前epoll關(guān)注的文件描述符
??struct?rb_root?rbr;
??//?在向用戶空間傳輸就緒事件的時候,將同時發(fā)生事件的文件描述符鏈入到這個鏈表里面
??struct?epitem?*ovflist;
??//?對應(yīng)的user
??struct?user_struct?*user;
??//?對應(yīng)的文件描述符
??struct?file?*file;
??//?下面兩個是用于環(huán)路檢測的優(yōu)化
??int?visited;
??struct?list_head?visited_list_link;
};
epitem結(jié)構(gòu)體

//?對應(yīng)于一個加入到epoll的文件??
struct?epitem?{??
????//?掛載到eventpoll?的紅黑樹節(jié)點??
????struct?rb_node?rbn;??
????//?掛載到eventpoll.rdllist?的節(jié)點??
????struct?list_head?rdllink;??
????//?連接到ovflist?的指針??
????struct?epitem?*next;??
????/*?文件描述符信息fd? ?file,?紅黑樹的key?*/??
????struct?epoll_filefd?ffd;??
????/*?Number?of?active?wait?queue?attached?to?poll?operations?*/??
????int?nwait;??
????//?當(dāng)前文件的等待隊列(eppoll_entry)列表??
????//?同一個文件上可能會監(jiān)視多種事件,??
????//?這些事件可能屬于不同的wait_queue中??
????//?(取決于對應(yīng)文件類型的實現(xiàn)),??
????//?所以需要使用鏈表??
????struct?list_head?pwqlist;??
????//?當(dāng)前epitem?的所有者??
????struct?eventpoll?*ep;??
????/*?List?header?used?to?link?this?item?to?the?"struct?file"?items?list?*/??
????struct?list_head?fllink;??
????/*?epoll_ctl?傳入的用戶數(shù)據(jù)?*/??
????struct?epoll_event?event;??
};
int epoll_create(int size);

作用:調(diào)用epoll_create方法創(chuàng)建一個epoll的句柄

源碼:

SYSCALL_DEFINE1(epoll_create,?int,?size)
{
??if?(size?<=?0)
????return?-EINVAL;

??return?do_epoll_create(0);
}
從源碼來看,其實 size 這個參數(shù)并沒有什么作用,只要大于 0 就可以了~

我從其他地方獲取資料說的是:以前底層實現(xiàn)是哈希表,現(xiàn)在是紅黑樹,為了兼容所以才保留了這個參數(shù),也不知道真假,權(quán)當(dāng)了解一下~

接著看下do_epoll_create

static?int?do_epoll_create(int?flags)
{
??int?error,?fd;
??struct?eventpoll?*ep?=?NULL;
??struct?file?*file;

??/*?Check?the?EPOLL_*?constant?for?consistency.??*/
??BUILD_BUG_ON(EPOLL_CLOEXEC?!=?O_CLOEXEC);

??if?(flags?
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉