阻塞、非阻塞、同步、异步
I/O操作有两个阶段
数据准备
阻塞
调用IO方法的线程进入阻塞状态
非阻塞
不会改变线程的状态,通过返回值判断
数据读写
(这里的同步和异步指的是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 陈硕大牛说过:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊API才是异步IO
以上操作都调用的是系统的接口,都是系统IO的同步和异步
此外还有业务层面的一个逻辑处理分同步和异步 就是处理并发的一个方式
总结
阻塞、非阻塞、同步、异步描述的都是IO的一些状态,一个典型的网络IO,包含两个阶段:数据准备(数据是否就绪)和数据读写
参考文献——施磊《腾讯课堂》