幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

高性能定时器策略之时间轮定时器算法

  时间轮定时器是有多个时间槽(slot)组成,每个时间槽代表时间的基本跨度。类似于一个时钟,时钟指针以恒定的速度每往下走一步,代表一个时间跨度。
  时间槽的个数是固定的,用SN(SlotNum)表示,每转动一次可称为一个滴答(tick),所以转动一周也就需要个SN滴答。每一个滴答需要的槽间间隔为SI(SlotInterval),则转一周也就共需要(SNSI)时间单位。
  时间轮的每个槽都指向一个定时器链表,每个链表的定时器都有一个相同的特性:相差(SNSI)的整数倍,也即是一周的整数倍。正是由于时间轮有这样的特性,所以可以根据定时器的触发时间和时间轮的槽数,把定时器hash到对应的链表上。
  一个简单的时间轮如下图:
  比如我们要插入一个超时时间为TI的定时器,那么计算器应该插入到槽对应的链表的方式如下:
  TS(CS(TISI))SN
  CS代表当前的槽位,因为时间轮定时器不停的在走。
  时间轮采用的是hash的思想,把各个定时器分散到不同槽的链表中,这个避免了单个链表的过长,提高了效率。
  从上面的公式可以看出,对时间轮而言,当SI越小的时候,定时器的精度就越高;当SN槽数越多时,效率越高,因为定时器被分配到不同的链表中,链表的长度也就相对短了,提高了遍历效率。
  下面实现一个简单的时间轮,代码如下:
  includestdio。hincludestdlib。hincludestring。hincludeunistd。hincludesystime。hincludesyssocket。hincludesystypes。hincludesysepoll。hincludeincludetime。hdefineBUFFERSIZE64缓冲区长度defineSLOTSNUM60时间轮上槽的数目结构体声明typedefstructtwtimertwtimer;typedefstructclientdateclientdate;EPOLL回调函数typedefvoid(epollcallbackt)(int,int);structtwtimer{introtation;记录定时器在时间轮上转多少圈后触发inttimeslot;记录定时器属于时间轮上的槽位(对应的链表)void(cbfunc)(clientdate);定时器回调函数clientdateuserdate;client数据twtimerprev;指向前一个定时器twtimernext;指向下一个定时器};用户数据structclientdate{intsockfd;charbuf〔BUFFERSIZE〕;twtimertime;};每1秒时间轮转动一次,也即是槽间隔为1秒staticconstintSI1;时间轮的槽,其中每个元素指向一个定时器链表,链表无序twtimerslots〔SLOTSNUM〕;事件的当前槽intcurslot0;twtimermalloctwtimer(introtation,inttimeslot){twtimertimer(twtimer)malloc(sizeof(twtimer));memset(timer,0,sizeof(twtimer));timerrotationrotation;timertimeslottimeslot;timerprevNULL;timernextNULL;timercbfuncNULL;timeruserdateNULL;returntimer;}voidfreetwtimer(twtimertimer){if(NULLtimer)returnNULL;if(NULL!timeruserdate)free(timeruserdate);free(timer);}voidtimewheel(){inti0;for(i0;iSLOTSNUM;i)slots〔i〕NULL;}遍历每个槽,销毁定时器voiddeltimewheel(){inti0;for(i0;iSLOTSNUM;i){twtimertmpslots〔i〕;while(tmp){slots〔i〕tmpnext;freetwtimer(tmp);tmpslots〔i〕;}}}根据定时器timeout创建一个定时器,并把它插入到一个合适的槽中twtimeraddtimer(inttimeout){if(timeout0)returnNULL;intticks0;待插入的超时时间小于时间轮的槽间隔SI,则将ticks向上调整为1,否则将ticks向下调整为timeoutSIif(timeoutSI){ticks1;}else{tickstimeoutSI;}计算待插入的定时器在时间轮转动多少圈后被触发introtationticksSLOTSNUM;计算待插入的定时器应该被插入到哪个槽中intts(curslot(ticksSLOTSNUM))SLOTSNUM;创建新的定时器,它在时间轮转动rotation圈后被触发twtimertimermalloctwtimer(rotation,ts);若第ts个槽为空,则插入定时器,并将该定时器置为该槽的头结点if(!slots〔ts〕){printf(addtimer,rotationisd,tsisd,curslotisd,rotation,ts,curslot);slots〔ts〕timer;}else否则,将定时器插入其中{printf(slots〔d〕isnotnull,ts);timernextslots〔ts〕;slots〔ts〕prevtimer;slots〔ts〕timer;}returntimer;}voiddeltimer(twtimertimer){if(!timer)return;inttstimertimeslot;slots〔ts〕是目标定时器所在槽头结点,若目标定时器为头结点,则需要重置第ts个槽的头结点if(timerslots〔ts〕){slots〔ts〕slots〔ts〕next;if(slots〔ts〕){slots〔ts〕prevNULL;}}else{timerprevnexttimernext;if(timernext){timernextprevtimerprev;}}freetwtimer(timer);}SI时间到后,调用该函数,时间轮向前滚动一个槽的间隔voidtick(){twtimertmpslots〔curslot〕;遍历该槽对应链表的所有定时器,查看是否触发while(tmp){if(tmprotation0){tmprotation;tmptmpnext;}else到期,执行任务{tmpcbfunc(tmpuserdate);if(tmpslots〔curslot〕){printf(deleteheadincurslot,curslotd,curslot);slots〔curslot〕tmpnext;freetwtimer(tmp);if(slots〔curslot〕)slots〔curslot〕prevNULL;tmpslots〔curslot〕;}else{tmpprevnexttmpnext;if(tmpnext){tmpnextprevtmpprev;}twtimertmp2tmpnext;freetwtimer(tmp);tmptmp2;}}}更新时间轮的当前槽,以反映时间轮的转数curslotcurslotSLOTSNUM;}
  测试如下inttotal0;记录1s定时器触发次数voidtest(clientdatecd){printf(totald,total);}voidtestaddtimer(inttimeout,void(cbfunc)(clientdate)){twtimertimer;timeraddtimer(timeout);timercbfunccbfunc;}voidtestcretetimer(){创建一一个2秒5秒10秒70秒,85秒的定时器testaddtimer(2,test);testaddtimer(5,test);testaddtimer(10,test);testaddtimer(70,test);testaddtimer(85,test);timetnow;structtmtmnow;time(now);tmnowlocaltime(now);printf(testcretetimerdatetime:dddd:d:d,tmnowtmyear1900,tmnowtmmon1,tmnowtmmday,tmnowtmhour,tmnowtmmin,tmnowtmsec);}保存触发定时器相应的fd和回调,在该回调中进行遍历时间轮typedefstructepollcallbackinfo{intiFd;epollcallbacktpfEpollCallBack;}epollcallbackinfo;创建一个触发定时器intcreateTimer(longlMSec,intepfd,epollcallbacktpfEpollCallback){structitimerspecestTimer;structepolleventevent;inttimerfd;intiSec(int)(lMSec1000);intret1;memset(event,0,sizeof(event));event。eventsEPOLLINEPOLLHUPEPOLLERR;memset(stTimer,0,sizeof(stTimer));stTimer。itvalue。tvseciSec;stTimer。itvalue。tvnsec(lMSec1000)1000000;stTimer。itinterval。tvseciSec;stTimer。itinterval。tvnsec(lMSec1000)1000000;timerfdtimerfdcreate(CLOCKMONOTONIC,0);if(1!timerfd){if(0timerfdsettime(timerfd,0,stTimer,NULL)){epollcallbackinfopmalloc(sizeof(epollcallbackinfo));piFdtimerfd;ppfEpollCallbackpfEpollCallback;event。data。ptrp;retepollctl(epfd,EPOLLCTLADD,timerfd,event);}else{printf(timerfdsettimeFailed);}定时器时间设定或添加epoll错误时,释放资源if(0!ret){printf(addtoepollfailedorsettimefailed);close(timerfd);timerfd1;}}else{printf(createtimerfdfailed);}returntimerfd;}voidtimerreadtimerFd(inttimerfd){uint64texp;(void)read(timerfd,exp,sizeof(uint64t));total;return;}epoll上定时器回调,每触发一次则调用一次tick()voidcommomTimerCB(intuiEvent,intiTimeFd){timerreadtimerFd(iTimeFd);tick();}intmain(){structepolleventwaitevent〔100〕;intepfd;inttimerfd;epollcallbacktpfEpllCallback;inti0;structitimerspecestTimer;longlMSec1000;1s定时器时间intcount;epfdepollcreate(1);if(1epfd){printf(epollcreateerror);return1;}printf(createepollfd:d,epfd);timewheel();testcreatetimer();timerfdcreateTimer(lMSec,epfd,(epollcallbackt)commomTimerCB);if(1timerfd){printf(failedtocreatetimer);return1;}for(;;){waitfdsepollwait(epfd,waitevent,100,1);printf(countd,count);for(i0;iwaitfds;i){epollcallbackinfot(epollcallbackinfo)waitevent〔i〕。data。ptr;pfEpllCallback(epollcallbackt)(unsignedlong)tpfEpllCallback;pfEpllCallback(waitevent〔i〕。events,tiFd);}}return0;}

女儿那么乖,刚上大学就怀孕了?妈妈不敢信,家长需注意2点在面对孩子教育问题的时候一般很多人都会特别的应接不暇,很多人都认为孩子平时的时候特别乖巧懂事,但是长大以后却慢慢的开始出现了变化,自己平时那么乖的女儿,为什么会做出一些让人不可……经常觉得口渴口干,原来是糖尿病的苗头?能用中药治疗吗?糖尿病,是当代人常见的慢性病之一。糖尿病主要以慢性增高的血糖为特征的代谢疾病群,因为胰岛素不敏感等原因,令血液中的葡萄糖得不到利用,从而导致血糖偏高诱发失明、截肢、肾衰、……宝宝添加辅食有讲究,牢记十不吃,别等孩子厌食或生病才后悔文菁妈建议孩子在6个月添加辅食,很多家长到了孩子满6个月那一天,就开始隆重地给孩子添加辅食。殊不知,孩子是建议6个月添加辅食,但并不是说6个月这一天是一定要添加辅食……小特遭艾伦逆转出局!北爱赛颜丙涛演零封进四强北京时间10月16日凌晨,20212022赛季斯诺克巡回赛北爱尔兰公开赛结束八强争夺,中国名将颜丙涛。其他比赛中,本土巨星艾伦03落后下轰破百连胜五局,53逆转淘汰夺冠热门特鲁……叶酸在美国市场下架?过量补充叶酸,或会对身体产生什么影响平时适当的补充叶酸,有利于人体心血管健康,特别是卒中患者,有助于病情的稳定,对于孕妇和胎儿来说,也可以预防胎儿畸形,美国有一段时间曾经实行强制叶酸摄入的政策,不觉很多人养成了吃……科技趣闻超1。7亿个微小空间碎片包围地球哈喽大家好,今天小编又来给大家分享最新的资讯了。据报道,有相关专家表示,有超过1。7亿个1厘米以下空间碎片正围绕地球飞行,飞行速度可达5。6万公里每小时。目前近地空间碎片总质量……中国乒乓精神是生命燃烧的颂歌电影中国乒乓记忆中体育题材的影片,当数《勇敢的人们》了。那个跳木马不过的小胖子(伊利尔),给我留下了深刻的印象。现在才知道那是50年前阿尔巴尼亚老电影一一娇生惯养的孩子(……西北狼,活下去!陕西长安竞技自救,球迷回应令人动容这样一种气氛令人惊讶我从未见过其他国家这个级别联赛的球队,拥有这样一座体育场以及填满球场看台的球迷。我感觉,今天晚上我们踢得是中超2018年4月25日,在当年的足协杯第四轮比赛……AMDR97845HX游戏本处理器跑分曝光,超6900HX9IT之家2月3日消息,跑分软件PassMark网站现已出现AMDR97845HX的多核心跑分数据,其分数暂居榜首。如上图所示,12核的AMDR97845HX多核跑分467……三星GalaxyZFold5爆料4nm定制骁龙895芯片IT之家1月7日消息,根据越南科技媒体ThePixel报道,三星内部已经开始测试GalaxyZFold5,这款可折叠机型将会配备高通的骁龙9855G芯片。这款神秘的芯片采用4n……比亚迪也开始有降价动作了?离正式官宣还远吗?离1月初比亚迪悍然宣布涨价才过去一个月的时间,就有各地网友号称在当地的比亚迪4S店发现了变相降价式的促销活动。有一位来自山东的网友更是将当地比亚迪4S店的促销宣传直接描述成降价……荣耀赵明称MagicV将超越市售所有折叠屏手机近日,荣耀手机的官方微博发布了一条有关荣耀CEO赵明先生的采访。赵明先生在采访中不仅透露了还未发布的折叠屏新品荣耀MagicV的相关设计,还表示荣耀MagicV作为荣耀的折叠屏……
从小培养孩子的逻辑思维能力,轻松做学霸,父母要抓住2个黄金期我曾很苦恼儿子,3、4岁的时候说话还没逻辑,心里有话总是说不出,和别的小朋友发生不愉快,儿子总是输者,因为有理也说不出。一次,儿子和一个小朋友发生了冲突,两个孩子差点打起……为什么人们吃芹菜时不吃叶子?或还有人不清楚,建议尽早了解此外,芹菜当中富含膳食纤维,多吃芹菜可以加速胃肠蠕动,滋润肠道,缓解便秘,减轻肠道负担,芹菜中所含的各种营养素也可以帮助身体补充所需的营养素并提供能量。芹菜又便宜又脆,芹……8月31日联赛球员注册汇总广东男篮完成18人注册,苏伟并未出现在名单中CBA官方更新国内球员注册信息,广东男篮完成18人注册,老将苏伟并未出现在名单中。苏伟,1989年7月28日出生,身高2……闻泰科技被英国政府要求剥离NWF至少86股权公司回应影响不大点蓝字关注,不迷路来源:e公司继日前赛微电子(300456)收购德国汽车芯片厂商Elmos被禁,闻泰科技(600745)已宣布收官的英国晶圆厂NewportWafe……Go程序提速42,只需改变一个字符梦晨发自凹非寺量子位公众号QbitAIGo语言本来就以轻量快速著称,一位GitHub员工却偶然发现:只改变一个字符的位置,能把一段代码运行速度提高足足42。……拆开手机看看内部有哪些零件吧?智能手机功能强大不但作为通信工具用,还可以玩游戏,拍照以及看电影,电视剧等等。它已成为人们生活中不可或缺的工具,但你是否了解它内部的复杂电子零件呢?以iPhone手……马来西亚侵占的5个南沙岛礁建设极好,中国需警惕战略要地琼台礁1980年6月,马来西亚侵占中国南沙弹丸礁,1986年10月,该国又连续侵占我国光星仔礁和南海礁,1999年北约轰炸我驻南联盟大使馆,马来西亚又趁机侵占了我国南沙群岛簸箕礁和浪……韩国宣称开发出可用于量子计算的新型单电子器件据韩联社12月22日报道,韩国标准科学研究院(KRISS)和韩国科学技术院(KAIST)12月22日宣布,开发出了可以活用在量子信息技术上的新型单电子器件。图片来自:韩联……人间迪奥的称号到底花落谁家?众所周知,人间XXX是将一个品牌的特点发挥到了极致才能有的头衔,很多大牌都有其专属称号的明星,今天咱就来讲讲六大蓝血品牌之一DIOR,到底哪位大使才是众望所归的人间迪奥呢?……热评丨宇宙快递见证天舟实力再升级12日10时03分,在长征七号遥六运载火箭的托举下,天舟五号货运飞船在我国文昌航天发射场成功发射。点火起飞后约2个小时,天舟五号顺利与在轨运行的空间站组合体进行自主快速交会对接……科比大女儿谈婚论嫁!体重240斤,19岁发育成熟身材傲人科比大女儿娜塔莉亚因为打扮老气引起热议。在参加2022美国时尚大奖颁奖典礼时,娜塔莉亚穿了一件粉红色的长裙,还包了头巾,把自己打扮成一名印度妇女。娜塔莉亚这打扮,引起了网……抄书的第87天,育儿也分段位,高段位家庭里爸爸这么告诉孩子(最近越来越懒了,很少写定时发表的稿子了,都是拖到临睡前去完成。呃,我是越拖越皮松了吧。其实文中说得很好,有时候爸爸的旁敲侧击真的比妈妈天天在耳边的喋喋不休更管用。但是很多……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网