5种I/O模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5种I/O模型相关的知识,希望对你有一定的参考价值。

1.Unix环境下有5种I/O模型:

    阻塞I/O,非阻塞I/O,信号驱动I/O(select和(e)poll),I/O复用(select和(e)poll),异步I/O(Posix.1的aio_系列函数)。


2.一个I/O分为两个过程:

  a. 等

  b. 数据搬迁


3.详细一一介绍<形象的以钓鱼比喻>

(1) 阻塞I/O

  首先,应用程序调用一个IO函数,导致应用程序阻塞,直到数据准备好。如果数据准备好了,就从内核拷贝到用户空间。如果没有准备好就一直等。

  就像是一个人在钓鱼,当没鱼上钩时,就坐在岸边一直等。

技术分享

(2) 非阻塞I/O

  与(1)不同的是,当数据没有准备好时,不要将进程睡眠,而是返回一个错误。如此反复测试,直到数据准备好。测试过程中会占用CPU大量的时间。

  就像一个人在钓鱼时,不是坐在岸边什么也不做,一直傻等,而是,一边低头玩手机,一边抬头看看鱼儿有没有上钩。

技术分享

(3) 信号驱动I/O(select和(e)poll)

 我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程运行但不阻塞,当数据准备好时,进程收到一个SIGIO信号,可以在信号处理函数中调用I/O。

  就像是一个聪明的人,不想自己一直盯着鱼竿,他在鱼竿上系了个铃铛,当铃铛响,就相当于告诉他一个信号——已经有鱼儿上钩了。

技术分享

(4) I/O复用(select和(e)poll)

  此模型会调用select或poll函数,它们会使进程阻塞,但于阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,且可以同时对多个读操作,写操作I/O函数进行检测,直到有数据可读可写,才调用I/O操作函数

  就像是一个人拿了好多钓鱼竿钓鱼,在岸边一直巡逻,当有上钩时就拿起鱼竿。

技术分享

(5) 异步I/O(Posix.1的aio_系列函数)

  调用aio_read函数,告诉内核描述字,缓存区指针,缓冲区大小,文件偏移以及通知的方式,然后立即返回。当内核将数据拷贝到缓冲区后,再通知应用程序。

  就像一个人雇了另一个人给他钓鱼,另一个人只需告诉他是否钓到鱼,他自己不需了解其中的过程。

技术分享

  4. 几种I/O模型的比较

(1)前四种模型:都是同步的。第一、二阶段基本相同,都是将数据从内核拷贝到调用者的缓冲区。不同的是等的方式不同。

(2)异步I/O的两个阶段都不同于前四个模型。

技术分享


本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1782731

以上是关于5种I/O模型的主要内容,如果未能解决你的问题,请参考以下文章

5种网络I/O模型

网络I/O模型--5种常见的网络I/O模型

UNP卷一学习笔记:I/O模型

UNP卷一学习笔记:I/O模型

Linux下5种IO模型以及阻塞/非阻塞/同步/异步区别

vSocket模型详解及select应用详解