【很干】搞懂阻塞非阻塞、同步异步、IO多路复用的同步还是异步

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达!


典型的一次IO分为两阶段:数据准备数据读写 阶段

数据准备阶段:根据系统IO的操作状态分为:

  • 阻塞:卡在接受函数,直到接收数据完成
  • 非阻塞:调用接受函数后直接返回,不需要等待

数据读写阶段:根据数据应用程序和内核的交互方式分为:

  • 同步:等待数据接收完成才能进入下一个业务逻辑
  • 异步:不需要等待,可以处理别的东西,当数据接收完成操作系统通知我们去处理这一段数据

阻塞非阻塞

这里我们用recv()函数举个例子

先修

  • recv仅仅是把接收缓冲区中的数据从内核区copy到参数给进去的buf中
  • recv仅仅是copy,真正的数据接受是协议完成的

对于要接受的fd我们分为阻塞fd和非阻塞fd

对于阻塞fd,调用recv()后会等待数据copy完成,缓冲区没有数据也会卡在这一步;

  • 如果出现返回值为0的情况,代表什么呢?

答:对端断开连接;

  • 返回值>0代表什么?

答:实际copy的数据大小;

对于非阻塞fd,调用recv()后,可以是完整的数据也可以是0,跟阻塞fd不同在于,如果返回值为0,代表目前缓冲区没有东西,就不等了;如果是阻塞fd缓冲区没有东西是会一直阻塞在这里等待直到有数据或者对端断开返回0;

这里强调一下,同步和异步是针对通讯的工作模式,阻塞和非阻塞是针对socket的IO操作

同步异步

这里先讲讲通讯工作模式的同步异步

通信的同步是指客户端在发送数据后,需要得到回应才会进行下一步工作;这样双方就是一个同步的状态;

通信的异步是指客户端发送请求后,不需要等待服务端的回应就可以进行下一步发送下一个请求,这样对于所有的请求动作来讲将在服务端得到异步,这点需要反复读品一下其中的意思;

那我们回来说说关于socket的同步/异步

说到socket的同步,个人感觉是蛮像阻塞的概念的,都是有了结果才返回;

异步是告诉系统我要recv数据,然后马上返回,数据到达后系统又来通知你(同步异步有个重要的不同就是通知这个行为),然后程序再recv数据

对于轮询的select或者poll来讲,例如读事件发生,就是缓冲区有数据了,系统对于缓冲区有数据的fd进行一个标记,我们去检查标记再进行调用recv。

打电话这个例子:

同步是指你给小明打电话,没人在,过一会再打才能知道在不在;(类比上文发送数据,接收数据);

异步是指你给小明打电话,这人不在,就告诉接电话的人(操作系统),小明回来了你打给我;

I/O多路复用

复用的意思是线程反复调用

select/poll/epoll这些函数是让操作系统帮我们看看缓冲区是不是有数据到来,如果缓冲区有数据就把相应的fd打个标签,这样我们就可以用recv函数copy缓冲区的数据,所以称为同步IO;

那如果是异步IO的话,操作系统会直接进行数据copy后,我们直接进行响应的业务处理;


再引用知乎上 卢毅luis 前辈的话

在这里插入图片描述

所以我们能看到,对于一个socket来说阻塞/同步,非阻塞/异步来讲概念不是完全独立分开的

阻塞和非阻塞,应该描述的是一种状态,同步与非同步描述的是行为方式


如果这篇文章有帮助到你希望留下一个赞,文中如果有不对的地方也欢迎大佬指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值