Reactor 和 Proactor 区别
同步异步、阻塞非阻塞组合
同步
以
read()
函数为例,int n = read(fd, buf. sz)
- 当采用
同步
的方式和阻塞io
的方式时,buf
就是从内核拷贝的数据,函数返回则可以马上知道buf
中的数据。 - 当采用
同步
的方式和非阻塞io
的方式,并且此时io
未就绪,此时n = -1
即返回结果为-1
,并且会通过error_number的返回值可以查看为什么没有得到数据。 - 当采用
同步
的方式和非阻塞io
的方式,并且此时io
就绪,那么此时跟阻塞io
是同样的结果,当io
函数返回时,可以获取从内核当中拷贝的数据即buf
中的数据。
总结:由此可以看到采用同步的方式可以马上获知io
操作的结果。
异步:
以
read()
函数为例,int n = read(fd, buf. sz)
- 当采用
异步
的方方式时,发起函数调用请求
以后,用户态
的线程会可以去做其他的事情。不管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等技术内容,立即学习