阻塞和非阻塞、同步和异步

阻塞、非阻塞、同步、异步


I/O操作有两个阶段

大体就是两部分:

​ 1.数据准备:数据没来之前我是阻塞等待还是非阻塞等待

​ 2.数据读写:数据来了之后我是同步读写还是异步读写

数据准备

阻塞

​ 调用IO方法的线程进入阻塞状态

数据没到的话,线程阻塞,直到有数据来了唤醒

非阻塞

​ 不会改变线程的状态,通过返回值判断

非阻塞模式一般会有个循环,直到recv真正收到数据时才返回

数据读写

这里的同步和异步指的是IO的同步和异步一般操作系统的原理知识指的都是IO的同步和异步

还有一种应用层面的同步和异步:并发的同步(指在相同的时间间隔内有一定的执行次序)和异步;主要指的是业务上的同步和异步

应用场景:

​ 用TCP协议通信时,双方都有一个TCP接收缓冲区

​ ssize_t recv(int sockfd,void *buf, size_t len, int flgas)(此buf为用户缓冲区)

当TCP接受缓冲区来数据时!同步和异步差别也来了!!

同步

在这里插入图片描述

当TCP接受缓冲区来数据时,recv被唤醒;recv一执行,用户缓冲区开始从内核缓冲区搬数据,搬完之前不会执行下一步,返回的size大小正是用户缓冲区搬得数据大小(在用户buff中)

通俗讲!当TCP缓冲区来数据时,是用户自己调用IO接口去读去写!此间消耗的时间都记在程序中

*recv和send都是同步的IO接口

异步

在这里插入图片描述

内核向应用程序返回的是完成IO操作的事件(就是已经将内核缓冲区的数据搬到用户缓冲区了),和同步比较着来理解;recv一执行,buf里边就有数据了,真正的读写操作是由内核完成的此间不需要再程序上消耗时间

异步的灵魂是内核会通知!!!!

通知是关键!!用户把sockfd、buf、和通知方式(不止信号还有回调)通过IO接口传给内核;

当应用程序得到响应的通知时,数据已经到用户buf了,用户压根不需要把数据从内核缓冲区搬到用户缓冲区

典型的异步io接口 aio_read、aio_write

陈 硕 大 牛 说 过 : 在 处 理 I O 的 时 候 , 阻 塞 和 非 阻 塞 都 是 同 步 I O , 只 有 使 用 了 特 殊 A P I 才 是 异 步 I O 陈硕大牛说过:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊API才是异步IO IOIO使APIIO

以上操作都调用的是系统的接口,都是系统IO的同步和异步

此外还有业务层面的一个逻辑处理分同步和异步 就是处理并发的一个方式

总结

阻塞、非阻塞、同步、异步描述的都是IO的一些状态,一个典型的网络IO,包含两个阶段:数据准备(数据是否就绪)和数据读写

参考文献——施磊《腾讯课堂》

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值