浅谈Linux五种IO模型

在阅读本篇文章前希望能够了解以下知识点,会有更高的效率:内核空间与用户空间,进程切换,进程的阻塞,文件描述符

五种IO模型分别为阻塞式IO、非阻塞IO,信号驱动型IO,IO多路转接,异步IO。

引入:缓存IO

缓存IO又称为标准IO,大多数系统默认的IO操作都是缓存IO。

缓存IO的流程:在Linux的缓存IO机制中,数据会先被拷贝到内核的缓冲区,然后由内核空间拷贝至应用程序的地址空间。

缺点:数据传输过程中存在大量的拷贝工作(内核和应用程序空间之间),对cpu和内存的开销非常大。

网络IO是对socket的读取,而socket在linux中被抽象为流,因此网络IO可以抽象为对IO流的操作。

对于socket流而言,会经历两个阶段:

1.网络上的数据到达,将数据拷贝到内核的缓冲区。

2.把数据从内核缓冲区中复制到应用进程空间中。

同步通信和异步通信

首先谈到同步和异步,我们需要明白,这个同步和异步指的是同步通信与异步通信还是同步与互斥,在不同的环境下,概念则不相同。

同步通信与异步通信:

1.同步通信指的是发出一个调用后,如果没有得到结果,该调用就不返回,一旦调用返回,就能得到返回值。总结:调用者主动去等待这个返回结果。

2.异步通信指的是发出一个调用后,调用直接返回,因此不会有返回结果。之后被调用者通过信号或者回调函数的方式来通知调用者,因此调用者不需要主动地去等这个返回结果,也不会立刻得到这个返回结果。

同步与互斥:

1.进程/线程同步其实是进程/线程之间的制约关系。

2.在多线程工作环境中,为了协调线程的工作次序设定的一种制约关系。比如说临界资源。

1.同步阻塞IO

用户空间程序发出一个系统调用(recvfrom),当内核没有将数据准备好的时候,当前进程会进入阻塞状态,系统调用会一直等待。然后等待内核将数据准备好,当内核将数据准备好之后返回结果,将内核数据拷贝至用户程序空间,进程此时解除阻塞状态,进行下一步工作。

优点:

1.能够及时返回数据,没有延迟。

2.对于内核开发者来说十分省事。

缺点:

1.在整个阻塞的过程中,无法处理其他的IO请求。

2.对于用户来说要付出性能的代价。


2.同步非阻塞IO

同步非阻塞IO采用“每隔一段时间询问内核数据是否准备好了”的轮询方式,发出一个调用后如果数据还未准备好,系统调用将直接返回,并且返回EWOULDBLOCK的错误代码。

整个过程中当从内核拷贝数据到用户程序空间时,进程仍然处于阻塞状态。

优点:

能够在等待IO的时候处理其他任务(包括提交其他任务),后台可以有多个任务在同时进行。

缺点:

由于每隔一段时间询问一次内核数据的准备情况,而有可能在间隔的时间片内数据准备好,因此将增加任务完成的响应延迟。


3.IO多路转接

由于非阻塞式IO需要不断的主动轮询,而轮询占用了很大一部分过程,同时轮询会消耗大量的cpu资源,后台可能有多个IO任务在等待进行,因此就有了轮询每个任务的完成状态,一旦某个任务完成就去处理它的方法。

在UNIX/Linux下的select、poll、epoll都是完成这种工作的。

以select为例说明,相对于非阻塞轮询方式而言,select通过轮询多个socket的文件描述符,可以监听多个IO端口,当其中任何一个socket的数据准备好时,就会返回可读,然后进行recvform系统调用,将数据由内核拷贝至用户程序空间。

select、poll调用后,会阻塞进程,但与阻塞IO的不同在于,当socket数据有一部分准备好时,select就会解除阻塞,交由用户进程来处理。

特点:

通过轮询监视文件描述符的方式来控制进程的执行。


4.信号驱动型IO

当内核将数据准备好之后,我们使用SIGIO信号通知进程进行IO操作。



5.异步非阻塞

相对于同步IO的情况,异步IO不是顺序进行的,当用户发出一个调用后,无论数据是否准备好,都将直接返回给进程,然后进程去做自己的事,由内核处理数据,将数据拷贝至用户程序空间,然后有内核向进程发出通知,在IO两个阶段,进程都是非阻塞的。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值