分类: C/C++
2013-07-03 09:36:04
记得之前有人问,为什么iocp, epoll不是遍历的,今天突然想说几句
---------------------------------------
网络数据的流程:
设备(网卡)---io中断---cpu---应用程序
------------------------------------------------------
iocp对每个新的套接字都绑定了网卡(CreateIoCompletionPort),这样,网卡有网络事件时,cpu就会把网络事件写到一个队列,叫完成队列,GetQueuedCompletionStatus的线程从完成队列取网络事件,返回
select是 select的线程主动去问cpu, 我的套接字1是否有网络事件,我的套接字2是否有,我的套接字3是否有;
而iocp的线程,是只要完成队列里有事件,就取出来。
------------------------------
epoll是给每个套接字绑定了一个回调函数,当cpu知道有网络事件时,主动通知epoll_wait的线程,该线程调用就绪套接字的回调函数。 所以epoll也不是轮询