码迷,mamicode.com
首页 > 其他好文 > 详细

5种I/O模型

时间:2016-05-25 07:08:45      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:接口   搬迁   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模型

标签:接口   搬迁   i/o模型   

原文地址:http://10707460.blog.51cto.com/10697460/1782731

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!