网络IO的阻塞/非阻塞与同步/异步

在学习网络IO的时候总是被阻塞/非阻塞, 同步/异步搞得团团转, 本文是自己对这部分的一些学习心得

IO模型

小明去打水
杯子:用户空间
水:数据
饮水机:内核空间

阻塞/非阻塞IO

小明拿杯子去打水, 饮水机内不一定有水, 当饮水机没水

  1. 他就在原地等待, 直到饮水机有水, 阻塞IO
  2. 他就先离开, 等一会儿再来看看饮水机有没有水, 非阻塞IO
  • recv时可设置成阻塞和非阻塞
  • 阻塞时, 会一直等待, 直到有数据了才往下执行
  • 非阻塞时, 当没有数据时, 便会直接返回, 往下执行

IO复用

小明厌倦了总是要亲自去看饮水机有没有水, 因此他让宿管阿姨帮忙, 如果有水再叫他过来打
这次宿舍楼有多台饮水机

  1. 宿管阿姨只告诉小明饮水机有水, 但没告诉他是哪台饮水机有水, 小明只能挨个去试, select
  2. 宿管阿姨不仅告诉小明饮水机有水, 还告诉他哪几台有水, 因此小明只有去有水的饮水机那里打水就可以了, epoll
  • 在recv前, 先调用select/epoll, 如果有数据, 那么才recv
  • 因为recv时肯定是有数据的, 所以可以当是非阻塞
  • select/epoll可设置超时时间

同步/异步IO

小明拿杯子去打水, 假设现在饮水机有水

  1. 打水时, 等待杯子盛满(内核层->应用层), 同步IO
  2. 不等杯子盛满, 先离开, 等杯子满后, 宿管阿姨通知他, 异步IO
  • 同步IO是等待内核空间将数据拷贝到用户空间 (recv等是同步IO)
  • 异步IO是不等待拷贝, 可以先去执行其他任务, 等到数据拷贝完成时再通知 (aio_read是异步IO)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值