Linux杂谈:Linux IO模型
Posted Stoneshen1211
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux杂谈:Linux IO模型相关的知识,希望对你有一定的参考价值。
文章目录
简单记录一下linux下的几种I/O模型,防止遗忘。
1 同步阻塞IO
同步阻塞IO是最简单的IO模型,在使用这种模型进行数据接收的时候,如果没有数据,会一直等待,即阻塞在这里,直到有数据才返回。
2 同步非阻塞IO
同步非阻塞IO,在使用这种模型进行数据接收的时候,不管有没有数据都会返回,不阻塞。如果没有数据,立马返回;如果有数据,从内核空间拷贝数据后返回。
如果我们需要读取数据,但是没有数据立马返回,那么我们就需要不断的去轮询,查看是否有数据,如果没有数据,继续轮询,直到有数据;这种情况需要不断轮询,不断的去请求数据,导致CPU资源。
3 IO多路复用
在前面的同步非阻塞IO中,需要不断的轮询去查看是否有数据。IO多路复用在同步非阻塞IO基础上,加入了超时时间。在超时时间内,如果没有数据,就会阻塞等待;如果有数据,就会立马返回;如果超过超时时间,没有数据,也立即返回。
从上面的描述来看,IO多路复用没有太大的优势,只是加入了一个等待时间。它的优点在于“多路”,即可以同时处理监听多个IO请求,提高了程序的效率。
4 信号驱动IO
信号驱动IO是指在进程开始时候就注册一个信号的处理函数,即回调函数,然后进程继续执行其它操作。当有数据时候,系统会发出一个信号,然后就会调用回调函数进行处理。
5 异步IO
异步IO是指如果用户要对IO进行读写操作,会告诉内核进行IO操作(即告诉内核用户读写缓冲区的位置,以及IO操作后通知用户的方式),然后立马返回,不阻塞;内核会在IO操作完成后,通知用户,此时的数据已经由内核拷贝到用户空间,可以直接对数据进行处理。
在上面的 同步阻塞IO/同步非阻塞IO/IO多路复用/信号驱动IO 等模型都是同步IO模型,即同步IO只是用来通知有数据,IO的读写都是由用户空间,应用程序主动去读写的。而异步IO的读写操作是在内核空间完成的,完成之后再通知应用程序。
以上是关于Linux杂谈:Linux IO模型的主要内容,如果未能解决你的问题,请参考以下文章