实例:一个服务器程序的架构介绍
事变线程的流程:
个中 epoll_or_select_func() 等于上文所说的通过 select()/poll()/epoll() 等 IO multiplex 技能,确定好了哪些 TcpConnection 上稀有据到来。我的处事器代码中一样平常只会监测 socket 可读变乱,而不会监测 socket 可写变乱。至于怎样发数据,文章后头会先容。以是对付可读变乱,以 epoll 为例,这里必要配置的标识位是:
muduo 内里将 epoll_wait 的超事势件配置为 1 毫秒,我的另一个项目将 epoll_wait 超时时刻配置为 10 毫秒。这两个数值供各人参考。 这个项目中,事变线程和主线程都是上文代码中的逻辑,主线程监听侦听socket 上的可读变乱,也就是监测是否有新毗连来了。主线程和每个事变线程上都存在一个 epollfd。假如新毗连来了,则在主线程的 handle_io_events() 中接管新毗连。发生的新毗连的socket句柄挂接到哪个线程的 epollfd 上呢?这里采纳的做法是 round-robin 算法,即存在一个工具CWorkerThreadManager 记录了各个事变线程上事变状态。伪码大抵如下:
即先从第一个事变线程的 epollfd 开始挂接新来 socket,接着累加索引,这样下次就是第二个事变线程了。假如以是超出事变线程数量,则从第一个事变从头开始。这里办理了新毗连 socket “负载平衡”的题目。在现实代码中尚有个必要留意的细节就是:epoll_wait 的函数中的 struct epoll_event 数目开始到底要配置几多个才公道?存在的记挂是,多了挥霍,少了不足用,我在曾经一个项目中直接用的是 4096:
我在陈硕的 muduo 收集库中发明作者才用了一个较量好的思绪,即动态扩张数目:开始是 n个,当发明有变乱的 fd 数目已经达到 n 个后,将 struct epoll_event 数目调解成 2n 个,下次假如还不足,则酿成 4n 个,以此类推,作者奇妙地操作 stl::vector 在内存中的持续性来实现了这种思绪:
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |