1. 基本含义
while (1) {
events = getEvents()
for (e in events) {
processEvent(e);
}
}
对调度的显式控制来代替多线程,也就是说运行processEvent(e)时系统只运行该活动。
2. 如何实现
select()或者poll()
select()检查IO描述符集合,返回就绪描述符的总数
阻塞与非阻塞:阻塞接口在返回给调用者之前完成所有工作;非阻塞接口开始一些工作,但立即返回,从而让所有需要完成的工作都在后台完成
注意:不要阻塞基于事件的服务器
3. 异步IO
普通IO操作会阻塞,为了基于事件的并发正常工作,提出了异步IO
这些接口使应用程序能够发出IO请求,并在IO完成之前立即将控制权返回给调用者;另外的接口让应用程序能够确定各种IO是否完成。
进一步:可以使用信号的机制,消除重复循环系统的需要
4. 缺点
基于事件的并发编码比基于多线程的并发复杂:当事件处理程序发出异步IO请求时,它必须打包一些程序状态,以便下一个事件处理程序在IO最终完成时调用,“手工栈管理”
当系统从单CPU切换到多CPU时,基于事件的简单性将消失
不能与某些类型的系统活动集成,比如分页(隐式阻塞)
随着时间推移,基于事件的代码难以管理