非阻塞和异步是不是同一回事?

sangwf 2006-11-14 10:00:00
谢谢!如果不是,麻烦讲一下区别,谢谢!
...全文
328 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
末日3000 2007-04-28
  • 打赏
  • 举报
回复
嗯,支持楼上的
elssann 2007-04-27
  • 打赏
  • 举报
回复
还是我来给出正确答案吧,几年前在这里就解答过。

非阻塞IO和异步IO 是两回事。

1:非阻塞IO一般都是在User Mode里完成的,而异步IO是在Kernel Mode里完成的。

2:假设某个socket的发送缓冲区目前空闲的是512KB,而你调用非阻塞IO发送2M的数据,那么只会发出512K,发送了512KB後,函数调用会返回,这时候你需要检测WSAGetLastError和已经发送出去的数据大小,以重新发送剩下的。 而当你调用异步IO的时候,你的数据其实并没有发出去,可以看着这个调用只是在系统内核里作了一个登记,登记后你的调用马上就返回了,并告诉你你的数据正在PENDING。这时候,你可以去做其他的事情,当内核把你的数据发送后,会通知你发送结果是成功还是失败,以及发送出去了多少。

都将近两年时间没有写SOCKET程序了,哎,
关于异步IO的描述肯定是正确的,非阻塞的的描述有点不敢确定是不是正确的。
microyzy 2007-04-27
  • 打赏
  • 举报
回复
有那么复杂嘛。。。本是一回事
mimong_lin 2007-04-25
  • 打赏
  • 举报
回复
哦,可能说得简了。

阻塞与非阻塞,是单个函数的调用结果,

而同步与异步,是多个操作在一起的结果。

真如LS有人说的,非阻塞是异步的基础。
mimong_lin 2007-04-25
  • 打赏
  • 举报
回复

阻塞,是单个函数的调用结果,
而异步,是多个操作在一起的结果。

突发的奇想,不知道是不是。大家指正。
sangwf 2006-11-16
  • 打赏
  • 举报
回复
谢谢,我还是想知道网络阻塞的底层实现。。
rickerliang 2006-11-16
  • 打赏
  • 举报
回复
这个东西大概原理是这样的(不过很古老的原理了,不知道现在还适用不,操作系统的知识)
同步IO,又叫编程IO,在进行IO操作(就是通过系统调用)时,OS把cpu调度到IO操作例程上(IOroutine),cpu时间都花在IO操作上,没有时间理会你的程序,所以你的程序就被阻塞了。
异步IO,实现的机制有很多种,举些例子:IO控制器、DMA等。在进行IO操作时,cpu给IO控制器发送IO操作指令启动IO操作(该指令只负责启动IO操作),之后cpu继续执行你的程序代码(你的代码没有被阻塞);至于IO操作例程则由IO控制器完成。在IO控制器完成IO操作后,给cpu发个中断,通知cpu IO操作完成,由于中断产生了,os可能会调用响应的中断例程来响应中断,这些例程可能是你程序的一个回调函数,又或者是一个setevent调用。
回调函数这个很容易了解,至于setevent情况,你的程序必须要有响应的等待事件的调用(该事件就是IO完成事件了),例如waitforsingleobject或者GetQueuedCompletionStatus(IOCPs)

本人观点,请指正
sangwf 2006-11-16
  • 打赏
  • 举报
回复
那我的阻塞的理解对不对呢?就是底层实现来说,还是使用了异步。谢谢!
rickerliang 2006-11-16
  • 打赏
  • 举报
回复
对于socket来说
阻塞就是同步IO
异步IO:
进行IO系统调用时是非阻塞
sangwf 2006-11-16
  • 打赏
  • 举报
回复
我的理解对么?谢谢!
sangwf 2006-11-15
  • 打赏
  • 举报
回复
进程阻塞,当条件满足时,又会被唤醒。对于socket来说,可能有数据可读就可以唤醒进程,那这个有数据可读的时间怎么得到的呢?是不是又使用了异步来实现?就是等到数据到达之后,给一个通知?谢谢!
danscort2000 2006-11-15
  • 打赏
  • 举报
回复
不是
非阻塞会一直发送到无法发送,然后立即返回
而异步则不管你怎么操作,都立即返回
mimong_lin 2006-11-14
  • 打赏
  • 举报
回复
这个版块讨论过了,你搜一下就可以了。
nuaawenlin 2006-11-14
  • 打赏
  • 举报
回复
非阻塞是进行异步操作的基础

18,357

社区成员

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

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