事件select模型
windows处理用户行为的两种方式
消息机制:
核心:
消息队列
处理过程:
将所有的用户操作, 如点鼠标、按键盘等所有操作按顺序被记录, 装入一个队列
特点:
由操作系统维护, 我们需要把消息取出来, 分类处理
有先后顺序
异步选择就是基于消息机制的。
事件机制:
核心:
事件集合
处理过程:
每个操作绑定一个事件, 事件由调用API创建
将事件投递给系统, 让系统监视
如果操作发生, 对应事件就会被标记位有记号
我们检测事件集合, 处理
特点:
所有事件都是我们自己定义的, 系统只是将他们置为有/无信号
无序的
事件选择就是应用事件机制。
局部事件机制(需要我们绑定), 整体消息机制(全面)
事件选择的逻辑
函数:
WSAEventSelect()
第一步:
创建事件对象(变量)
函数:
WSACreateEvent();
第二步:
为每一个事件绑定一个socket以及操作accept、read、close并投递给操作系统, 相当于操作系统单开了一个线程, 我们不用管了:异步。
可以模仿fd_set
函数:
WSAEventSelect();
第三步:
查看事件是否有信号
函数:
WSAWaitForMultipleEvents();
第四步:
有信号的话就分类处理
函数:
WSAEnumNetworkEvents();
事件:
FD_WRITE:只在accept之后立即产生一次
优化思路:
有序处理:
相对有序, 让大家再第一个循环都能得到处理
每次传递一个事件
增加事件列表:
创建多线程、线程池
增加事件数量:
一组上限由WSAWaitForMultipleEvents()决定, 无法变大
如果一个一个投递, 那么就可以变多了
或者一组一组投递