初探IO模型及缓冲机制

在我们使用基于事件驱动的EventMachine编写并发IO的时候,往往会遇到需要指定IO复用模型EM.epoll,这个调用 会大幅提高IO复用的效率,下面我们来看看linux到底有哪些IO复用模型吧。

IO多路复用

  • PPC/TPC模型

    这种模型的思路很简单,就是没到来一个连接就给其开辟一个进程或者是线程,这种模型虽然将各个IO连接的 界限划分的很清楚,但是每个IO连接都有自己的进程或者是线程,所以连接多了必定会耗费资源,而且线程间切换带来的 开销往往无法忍受,所以这种模型能承受的连接数不会太大,一般只有几百个左右。

  • select模型

    与上面的模型不同,select模型是使用一个进程(线程)来处理问题,但是每个进程能打开的文件描述符是有限制 的,一般为1024/2048,这样每个IO连接占用一个文件描述符,那么连接数就被无形地限制了。那么应该可以通过修改 FD_SETSIZE来增加连接数量啊,但是处理器是通过轮询的方式来检查每个FD的,这样必然会导致效率问题。处理器 处理的每个FD就会将数据从内核拷贝至用户进程中。

  • Epoll模型

Epoll是对上面两种模型的改进,它没有对连接数进行限制,这个限制应该是内核可以打开的最大文件数目(注意 文件描述符限制和最大可打开的文件数目的区别,跟文件是否是同步打开有关)。当有IO事件到来的时候,Epoll不仅会 告诉处理器有事件发生,而且会告诉处理器是哪个FD状态发生了变化,然后通过共享内存的方式省去了将FD中的内容 拷贝出来的困扰。

IO缓冲

我们会经常听到这个词,但是经常会感到疑惑,缓冲会大幅提高IO读写的性能,但是缓冲到底发生在什么地方还是 一头雾水,是内核中还是用户线程中。这里得从UNIX环境编程中带缓冲的IO和不带缓冲的IO说起。

当我们使用read或者write系统调用的时候,而不是包装过的函数调用,数据被读出或者写入磁盘中,这就是不带 缓冲的IO,但是这不能阻止内核的缓冲区,所以不带缓冲的IO只是在用户级或者在stream流上没有进行缓冲,但是内核 缓冲蚀躲不过的。

当然在带缓冲的IO中,我们会使用用户缓冲区,即所谓的stream流缓冲,这样就构成了两级缓冲区,数据通过流缓冲 到内核缓冲再到磁盘。

数据库缓存

在我们日常写代码的过程当中,经常要用到缓冲机制,即将一些近期或是经常访问的结果保存起来,下次当请求 进来的时候,直接返回结果就ok了。这样是我们在一台机器上进行的缓存设计,但是在分布式系统环境中,特别是 数据库的访问量很大的时候,需要做分布式架构的缓存,最常用的就是memcached。

首先memcached使用内存管理数据,这也是它很高效的原因(速度瓶颈在于网络),所以它的数据是易失性的,这与是cache文件保存数据 的本质区别。它的突出优点就在于它的分布式,能够为比较大的web项目提供共享的数据库缓存访问。



Previous     Next
zhing /
Published under (CC) BY-NC-SA in categories linux  tagged with linux