Reactor 和 Proactor 区别

在这里插入图片描述

同步异步、阻塞非阻塞组合

同步

read()函数为例,int n = read(fd, buf. sz)

  1. 当采用同步的方式和阻塞io的方式时,buf就是从内核拷贝的数据,函数返回则可以马上知道 buf 中的数据。
  2. 当采用同步的方式和非阻塞io的方式,并且此时io未就绪,此时n = -1即返回结果为-1,并且会通过error_number的返回值可以查看为什么没有得到数据。
  3. 当采用同步的方式和非阻塞io的方式,并且此时io就绪,那么此时跟阻塞io是同样的结果,当io函数返回时,可以获取从内核当中拷贝的数据即buf中的数据。
    在这里插入图片描述

总结由此可以看到采用同步的方式可以马上获知io操作的结果。

异步:

read()函数为例,int n = read(fd, buf. sz)

  1. 当采用异步的方方式时,发起函数调用请求以后,用户态的线程会可以去做其他的事情。不管io现在处于非阻塞还是阻塞的状态,内核会进行io检测是否就绪,就绪后就会在内核当中操作,将数据拷贝拷贝到buf中,再来通知用户层,数据io操作已经完成,之后就可以去处理相应的业务逻辑。

在这里插入图片描述

总结io 函数调用后,不能获知 io 的操作结果, 此时 io 操作都由内核完成

本质区别

io 操作不同;reactor 中检测 io 是否就绪,然后操作 io; proactor 投递请求,所有 io 操作由内核完成 。

充电站
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐