同步和异步的区别
同步:程序从上往下执行 异步:程序从上往下执行会有多个分支共同执行(即开多个线程)。
在web项目中
因为web项目是基于请求和响应来做的。在同步的情况下,代码从上往下执行,如果其中某个方法耗时很长 ,会导致客户端一直转圈,不能及时收到回复。
如何解决:采用多线程或者mq技术。但此种情况存在一些问题:采用多线程的情况下不能及时拿到返回结果。
多线程或者mq情况下解决方案: 请求进来以后,根据请求的id设置一个状态标志,如果查询成功以后,标志设为true,否则为false。在false的情况下返回补救信息,比如:正在查询中。之后,前台在进行轮询ajax请求接口,当标志为true的时候,就可以拿到结果
使用多线程实现异步IO存在那些缺陷
占用cpu资源过多。
阻塞式IO:
阻塞式IO图解
recvfrom方法读取数据,当数据没有到达linux内核空间的时候一直阻塞,等数据拿到了之后再复制一份发送给用户空间,程序才会继续执行
非阻塞式IO
非阻塞式IO图解
不管有没有拿到数据,都会立即返回的结果,如果结果有数据,就继续执行,如果没有数据,再次轮询请求数据。这样就不会导致阻塞,但是非常消耗CPU资源
阻塞式IO和非阻塞式IO,和悲观锁和乐观锁极其类似
复用IO(select,poll,expo)
之后会详细介绍,持续更新
信号驱动IO
事件驱动,回调的形式
AIO
异步非阻塞IO
BIO 阻塞式IO 实现步骤:
创建socket服务器端和客户端(只能支持一次请求)
添加while循环(可以支持多次请求,但是还是单线程执行)
添加线程池,采用多线程的方式去跑(这种方式即为伪异步)
伪异步的存在的问题:占用服务器内存太多,同时有一万个请求进来,及时存在线程池,超过最大线程数以后,也会等待
BIO演变NIO的过程
BIO为阻塞式IO NIO为非阻塞式IO
BIO演变NIO的过程:首先使用while循环,能够接收多次请求。之后再使用线程池支持多个请求共同执行
阻塞式IO和非阻塞式IO的区别
阻塞式IO:recvfrom方法读取数据,当数据没有到达linux内核空间的时候一直阻塞,等数据拿到了之后再复制一份发送给用户空间,程序才会继续执行
非阻塞式IO:recvfrom方法读取数据,不管有没有拿到数据,都会立即返回结果,如果不能拿到数据,就会再次轮询请求内核获取数据。能拿到数据程序就继续向下执行