目录
定义
1.重叠IO
重叠IO实际上就是一种异步IO,在写入IO的时候不需要进行等待。
参考:为什么叫做重叠端口?
2.完成端口
完成端口并不是实际上的一个机器端口,而是在实际套接字绑定端口接收到消息后的一种缓存机制,这种缓存机制的效率比较高。
创建方式:
HANDLE m_hIOCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0 );
3.Accept(Ex)
服务器在建立套接字并在端口上进行监听以后,这个时候如果来了一个请求,就需要有对应的处理。怎么来表示来了一个请求并触发对应的操作呢?这个时候就需要这个Accept(Ex)了。accept是先出现的,专门用来等待请求,等不到就不走。后来为了提高吞吐量,Windows在WinSock2中搞了个AcceptEx,这个函数用了完成端口(暂时理解为一个缓冲消息队列),调用完这个AcceptEx接口以后,这个函数会将备用套接字(用于表示远端地址)及所谓重叠IO结构体放到完成端口上,然后立刻返回。完成端口在接收到接入请求以后就填充传入的套接字以及数据,完成后唤醒工作线程中等待在完成端口的所谓工作线程,工作线程利用完成端口传入的数据进行程序设计者需要的操作。
参考:accept函数详解_涛歌依旧的博客-CSDN博客_accept函数
accept与三次握手的关系_努力织网的博客-CSDN博客_accept 三次握手
4.WSARecv
WSARecv并不是说从发送来的消息中获取消息题,而是向完成端口中发送一个接收消息的容器,如果有消息来了则windows内核会将消息填充并唤醒在完成端口监听的工作线程。一下为参考的一个博客,评论是精华。由此可知完成端口的真实含义和异步请求的操作流程:1、发送请求容器;2、请求得到满足,请求容器被填满;3、唤醒在完成端口监听的工作线程。
知识体系
1.通过完成端口接收并处理网络请求
通过完成端口接收并处理网络请求总体的结构:
1)网络套接字从网络接收到信息;
2)网络套接字将信息发送到完成端口;
3)工作线程实时监控完成端口,在发现有数据后立刻取出并处理;
以上为网络消息的大致处理流程。这个看上去不就是线程池嘛,这个线程池是在内核中实现,所以能避免频繁与内核打交道而导致的效率损耗。为何不在收到网络消息后立刻处理在用户缓存中,通过条件变量来控制线程池的处理呢?我想可能是在使用条件变量时会进行锁操作,而使用完成端口,从网络到最终的完成端口发送消息全部在内核完成,不用切换模式,效率较高的原因。
将来可以对Linux系统中的多路转接对比,详细研究两者差别。