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

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

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

一、前言

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

這篇文章只限于 linux 平臺(tái),對(duì)于 windows 平臺(tái)下,可以去參考下 IOCP 的用法,這里就不多說(shuō)了~

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

二、源碼解讀

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

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

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

//?對(duì)應(yīng)于一個(gè)加入到epoll的文件??
struct?epitem?{??
????//?掛載到eventpoll?的紅黑樹節(jié)點(diǎn)??
????struct?rb_node?rbn;??
????//?掛載到eventpoll.rdllist?的節(jié)點(diǎn)??
????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)前文件的等待隊(duì)列(eppoll_entry)列表??
????//?同一個(gè)文件上可能會(huì)監(jiān)視多種事件,??
????//?這些事件可能屬于不同的wait_queue中??
????//?(取決于對(duì)應(yīng)文件類型的實(shí)現(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)建一個(gè)epoll的句柄

源碼:

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

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

我從其他地方獲取資料說(shuō)的是:以前底層實(shí)現(xiàn)是哈希表,現(xiàn)在是紅黑樹,為了兼容所以才保留了這個(gè)參數(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)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉