linux五种IO模型

linux五种IO模型

          • 同步和异步的区别:
          • linux五种IO模型

同步和异步的区别:

同步和异步的区别

同步:程序从上往下执行
异步:程序从上往下执行会有多个分支共同执行(即开多个线程)。

在web项目中

因为web项目是基于请求和响应来做的。在同步的情况下,代码从上往下执行,如果其中某个方法耗时很长 ,会导致客户端一直转圈,不能及时收到回复。

如何解决:采用多线程或者mq技术。但此种情况存在一些问题:采用多线程的情况下不能及时拿到返回结果。

多线程或者mq情况下解决方案: 请求进来以后,根据请求的id设置一个状态标志,如果查询成功以后,标志设为true,否则为false。在false的情况下返回补救信息,比如:正在查询中。之后,前台在进行轮询ajax请求接口,当标志为true的时候,就可以拿到结果

使用多线程实现异步IO存在那些缺陷

占用cpu资源过多。

linux五种IO模型

阻塞式IO:

阻塞式IO图解linux五种IO模型_第1张图片

recvfrom方法读取数据,当数据没有到达linux内核空间的时候一直阻塞,等数据拿到了之后再复制一份发送给用户空间,程序才会继续执行

非阻塞式IO

非阻塞式IO图解
linux五种IO模型_第2张图片
不管有没有拿到数据,都会立即返回的结果,如果结果有数据,就继续执行,如果没有数据,再次轮询请求数据。这样就不会导致阻塞,但是非常消耗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方法读取数据,不管有没有拿到数据,都会立即返回结果,如果不能拿到数据,就会再次轮询请求内核获取数据。能拿到数据程序就继续向下执行

你可能感兴趣的:(Netty框架)