IO

来源:互联网 发布:我国人口增长数据 编辑:程序博客网 时间:2024/06/18 14:59
1,select,poll,epoll
select由数组管理,每当注册一个事件,占用一个数组位置,32位机器上大小为1024, 64位上大小2048,每次来请求都会
遍历数组,看是否有可处理的事件,没有就睡眠。消息传送采用内存拷贝方式

poll和select很像,但是用的链表,所以没有长度限制。

epoll基于事件回调机制,根据fd等信息可以直接定位到处理程序,类似回调时直接通知进程。没有最大连接数限制,上限是最大打开文件数,只扫描活跃的连接,使用共享内存

区别(epoll相对select优点)主要有三:
1.select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024 表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。
2.epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。
3.使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。

select,epoll都属于IO多路复用
java的nio在linux底层是通过epoll实现的,如果linux2.6及以上版本,则是epoll。nio用Buffer和Channel通过缓冲机制
提高了处理能力

2,IO模型

(1)同步阻塞IO(Blocking IO):即传统的IO模型。用户发起请求后需要等待内核返回结果后才继续往下走。如图

(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。用户发起请求后可以立即返回,然后轮询查看结果。如图

(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。阻塞是因为线程会等待select或epoll找到合适的事件处理返回。如图

用户线程(IO线程)一直select阻塞,直到有数据到来,然后交给相应的注册事件去处理,而用户线程可以继续监听其他数据,也就是一个用户线程可以同时处理多个IO请求

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。


同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

转载自梅小西的笔记:http://note.youdao.com/share/?id=227d28fcf8302e69623be8d21d14cf97&type=note#/

0 0
原创粉丝点击