日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【2019-11-07】twemproxy事件--by 閆昌

 小世界的野孩子 2020-02-16

epoll簡(jiǎn)介:

函數(shù):epoll_create;、epoll_ctl;、epoll_wait;

epoll_create(size);//size 低版本生效,高版本不生效

epoll 的LT模式

水平觸發(fā)模式,epoll_wait的處理流程為:遍歷就緒的鏈表,把fd的buf中有數(shù)據(jù)的fd返回給用戶,并在鏈表中保留該節(jié)點(diǎn),buf中沒(méi)數(shù)據(jù)的則從鏈表中剔除,放回紅黑樹(shù)中,這么做的好處是,只要fd中海油未處理的數(shù)據(jù),都會(huì)通過(guò)epoll_wait讀取到,缺點(diǎn)是,每次需遍歷,性能差。

epoll的EL模式
邊緣觸發(fā)模式,epoll_wait就非常簡(jiǎn)單,返回鏈表中所有的fd給用戶,并情況就緒列表,放回紅黑樹(shù)中,等待新事件到來(lái)。好處就是性能高,缺點(diǎn)是,用戶拿到fd后讀取其數(shù)據(jù)時(shí)每次沒(méi)讀取完,造成事件的丟失。

twemproxy對(duì)事件的使用

twemproxy對(duì)epoll/kqueue/evport進(jìn)行了統(tǒng)一封裝,一般linux使用epoll, mac使用kqueue,Sun Solaris使用evport,為了統(tǒng)一底層api調(diào)用,對(duì)上面的三種事件處理api進(jìn)行了接口的統(tǒng)一: event/nc_event.h

相關(guān)結(jié)構(gòu)體

struct event_base {
     int???ep;??/* epoll descriptor */
     struct epoll_event *event;?/* event[] - events that were triggered */
     int????nevent;?/* # event */
     event_cb_t???cb;?/* 回調(diào)函數(shù)event callback */
     };

事件處理核心api參考:

  • event_base_create()? ? 創(chuàng)建事件循環(huán)管理fd
event_base_create(int nevent, event_cb_t cb)
{
   ep = epoll_create(nevent);
   event = nc_calloc(nevent, sizeof(*event));
   evb = nc_alloc(sizeof(*evb));
   evb->ep = ep;
   evb->event = event;
   evb->nevent = nevent;
   evb->cb = cb;
}
  • event_add_in()? ? ? ? ? ? ?將一個(gè)fd的讀事件納入事件管理器的管理中
event_add_in(struct event_base *evb, struct conn *c)
{
  struct epoll_event event;
  int ep = evb->ep;
  event.events = (uint32_t)(EPOLLIN | EPOLLET);//ET模式
  status = epoll_ctl(ep, EPOLL_CTL_MOD, c->sd, &event);
}
  • event_add_out()? ? ? ? ? ?將一個(gè)fd的讀寫(xiě)事件納入事件管理器的管理中
event_add_out(struct event_base *evb, struct conn *c)
{
  struct epoll_event event;
  int ep = ev->ep;
  event.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
  status = epoll_ctl(ep, EPOLL_CTL_MOD, c->sd, &event);
}
  • event_add_conn()? ? ? ? 將一個(gè)fd的讀寫(xiě)事件納入事件管理器的管理中
event_add_conn(struct event_base *evb, struct conn *c)
{
   struct epoll_event event;
   int ep = evb->ep;
   event.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
   event.data.ptr = c;
   status = epoll_ctl(ep, EPOLL_CTL_ADD, c->sd, &event);
}
  • event_wait()? ? ? ? ? ? ? ? ? 從事件管理器中獲取準(zhǔn)備好讀/寫(xiě)的fd列表,并調(diào)用cb進(jìn)行處理
event_wait(struct event_base *evb,int timeout)//自己封裝的epoll_wait
{
 struct epoll_event event;
 int nevent = evb->nevent;
 for(;;) {
   int i, nsd;
   nsd = epoll_wait(ep, event, nevent, timeout);
   for(i =0; i < nsd; i++) {
    struct epoll_event *ev = &evb->event[i];
    uint32_t events =0;
    if(ev->events & (EPOLLIN | EPOLLHUP))    {
        events |= EVENT_READ;
    }
    if(ev->events & EPOLLOUT) {
        events |= EVENT_WRITE;
    }
    if(evb->cb != NULL) {
        evb->cb(ev->data.ptr, events);//執(zhí)行回調(diào)函數(shù) cb是在 event_base_create添加 
    }
   }
  }
}

怎么用:

todo

負(fù)載均衡算法

redis協(xié)議的解析

多個(gè)redis命令在一起怎么處理,粘包問(wèn)題

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多