前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux五种IO模型

linux五种IO模型

作者头像
envoke
发布2020-09-17 14:20:23
5900
发布2020-09-17 14:20:23
举报

linux五种IO模型

同步和异步的区别:

同步和异步的区别

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

在web项目中

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

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

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

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

占用cpu资源过多。

linux五种IO模型

阻塞式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方法读取数据,不管有没有拿到数据,都会立即返回结果,如果不能拿到数据,就会再次轮询请求内核获取数据。能拿到数据程序就继续向下执行

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • linux五种IO模型
    • 同步和异步的区别:
      • linux五种IO模型
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档