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
原文地址:http://10707460.blog.51cto.com/10697460/1782731