关于重叠IO的疑问

xwffwx 2011-04-22 02:29:48
最近看书,重叠IO的方式。
突然发现,其实重叠IO和阻塞方式都一样需要等待。
重叠IO的操作投递之后,无论是事件激活方式还是完成例程的方式,都必须等待
凭什么说重叠IO一定比阻塞方式更有效率呢?
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙行天下之Sky 2011-04-24
  • 打赏
  • 举报
回复
虽然重叠IO是阻塞模式,但是是系统为你做好的,当有事件的时候就会通知你,而纯阻塞的模式,是你自己做的,你只能用微软给你提供的一些功能去实现阻塞方式,而重叠IO是微软在底层为你做了专门的优化,会更好的处理
zuiyuezhou888 2011-04-23
  • 打赏
  • 举报
回复
这么给你举个例子吧
你接受到一个比较大的数据,收到的数据需要回复,收到的数据还需要解析
收到数据,判断是否正确数据,然后回复,然后是对接受到的数据进行解析
在这种情况下,如果你回复使用等待的话,只能等数据发送玩在对接受到的数据进行解析

表达的不是很清晰,意思就是这么个意思
zuiyuezhou888 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xwffwx 的回复:]
我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部完成操作,当系统在处理IO请求时,我们的线程可以返回继续执行
------------------
你说的和我从书本上看到的确是一样的,但是我看代码通常都是这样写

1、事件通知方式:
当我们投递了重叠IO操作之后
WSAWaitMultipleEvents,其实就是等待IO处理完成

2、完成例程方式:
当我们投递了……
[/Quote]
使用重叠io当你调用完wsasend()的时候,程序立即返回,你可以执行wsasend()后面的代码当发送成功后,系统会以事件的方式通知你,然后你在去处理
如果单开一个线程 调用完send()后你必须等待
打个比方 你发送数据需要使用1分钟 使用重叠io 你调用完wsasend()后还可以执行剩余的代码 1分钟(大约)后你在来处理发送完后的操作
而如果使用send()这一分钟你必须等待
xwffwx 2011-04-22
  • 打赏
  • 举报
回复
我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部完成操作,当系统在处理IO请求时,我们的线程可以返回继续执行
------------------
你说的和我从书本上看到的确是一样的,但是我看代码通常都是这样写

1、事件通知方式:
当我们投递了重叠IO操作之后
WSAWaitMultipleEvents,其实就是等待IO处理完成

2、完成例程方式:
当我们投递了重叠IO操作之后
SleepEx或WSAWaitMultipleEvents,也是等待
因为书上讲,如果不使调用线程进入一种可警告的等待状态,完成例程根本不会被调用

在不使用的多线程的情况下,我们其实并没有去处理别的东西
就是等待完成。

这种等待和阻塞方式的等待有什么区别呢?
Eleven 2011-04-22
  • 打赏
  • 举报
回复
重叠模型也是一种异步IO模型。
我们知道,相对于计算机执行的其他操作而言,设备IO(文件、管道、套接字等)是比较慢的。于是在多线程结构中就考虑到采用异步的方式进行设备读写操作,即我们告诉系统对设备的读写数据,而同时应用程序的其他代码继续执行,直到获取设备操作完毕的系统通知。
在进行异步IO时,我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部完成操作,当系统在处理IO请求时,我们的线程可以返回继续执行,当操作系统处理完IO请求之后,通知我们数据操作(发送、接收、出错)完毕。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧