Linux五种IO模型

1.什么是io流

当不同的介质在进行数据传输的时候就需要使用io流,io流是把数据以一种无结构的字符序列以流的形式在不同的介质之间进行传递。注意,数据源可以是文件也可以是其他的介质比如数据库等。数据的目的地可以是程序也可以是任何需要读取数据的地方。

2.同步、异步、阻塞、非阻塞的区别

这四个词的含义是不同的。他们可以互相组合,就是理论上来说至少有四种io流的实现。
同步和异步:这两个词是针对被调用方的。同步就是被调用方直到完成了自己的工作才会给调用方反应。异步就是被调用方先给调用方反应告知我已经收到请求,然后再去完成自己的工作,等工作完之后再以某种形式通知调用方。
阻塞和非阻塞:这两个词是针对调用方的。阻塞指的是调用方发出请求后,一直在这等着。直到被调用方给出自己已经完成的时候才会去做其他的事情。非阻塞指的是调用方在发出请求后,就去做其他的事情了。
举个例子:老王告诉小王把信送到邮局
同步:小王接收到命令之后,二话不说,撒腿就跑到邮局,然后才打电话告诉小王我把信送到了。老王这之前也不知道小王到底听没听明白,直到小王的电话老王才知道小王把任务完成了。老王很生气,把小王一顿毒打。
异步:小王很精明,在收到命令之后。先跟老王说了一句,我知道了。然后再去送信。老王很欣慰。
阻塞:老王告诉小王送信之后,就在原地找了个板凳坐着。直到小王通知到老王信已经送到了,老王才起身去忙自己的事。
非阻塞:老王告诉小王送信之后,老王就先去忙自己的事了。一会再给小王打个电话确认一下或者等小王给自己打电话通知自己。

3.Linux下面的5种io模型

首先先解释几个名词:
用户态和内核态:系统的内存会分为用户态和内核态两种。一般我们写程序都是计算机编译成各种指令来完成的。这些不同的指令有不同的权限。有的权限可以访问用户内存但是无法访问内核内存,有的指令可以访问内核内存。给权限分级的话,最高为0级,既可以访问内核内存也可以访问用户内存。最低为3级,只能访问内核内存。这样做的好处就是保证了系统的安全性。我们把有0级权限的指令为内核态,把有3级权限的指令称为用户态。
下面是一张简单的io流程(整个系统对数据的io很复杂,这里只是把大致的逻辑画出来以便后续理解模型时易于理解)
第一个是读,第二个是写。
在这里插入图片描述
在这里插入图片描述
图里面出现了大量的缓冲区的原因是因为CPU的执行速度要远远大于IO的速度,所以需要缓冲区来保证数据不会丢失。
下面的各类io模型都以读文件来举例。

1.阻塞io模型

阻塞io指的是用户创建一个线程去读取数据,那么这个线程会一直阻塞到内核线程通知用户线程数据已经准备好了,然后才会去把数据拷贝到用户内存,然后程序进行读取。这期间用户线程一直是阻塞的。

2.非阻塞io模型

这个模型和上面的区别就是,线程如果发现内核数据没有准备好,那么不在阻塞,而是直接返回,然后通过轮询的方式去询问内核数据是否准备好,准备好就把数据拷贝到用户内存进行读取。

3.信号驱动io模型

信号驱动指的是,线程如果发现内核数据没有准备好既不阻塞也不采取轮的方式,而是离开去做其他的事情。如果内核数据准备好,会发给用户线程一个信号,然后用户线程在执行相关操作。

4.io多路复用模型

这个指的是用户可以把多个io注册到一个管道上,然后由这个统一的管道来监听多个内核线程的准备状态。那个内核进程的数据准备好就通知管道,然后管道在把数据拷贝到用户内存。

5.异步io模型

上面的io模型实际上都是同步的,因为把数据从内核内存拷贝到用户内存都是需要调用方来完成的。真正的io异步就是直接让内核线程直接把数据拷贝到用户内存。等全部的处理工作都做完,再去通知用户线程。注意,现在的系统对异步io支持的还不是很完全,所以大部分都是采用的io复用来实现(比如netty框架)。

上面就是LINUX下面的5种io模型,下次我就要讲一下java里面的三中内存模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值