标签:
1、select、epoll区别 http://www.cnblogs.com/Anker/p/3265058.html
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024
总结:
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
(3)epoll和select在每个socket都很活跃的时候性能差别不大,但是在不活跃的时候差别很大。epoll不会因为FD数目的增加而线性下降。
(4)epoll支持的sokcet的数量最大为操作系统所支持的最大文件的句柄相关。最大文件数量是和内存相关的,具体的值可以通过cat /proc/sys/fs/file-max查看。1G的内存机器上大约可以支持10万个句柄。
(5)epoll通过mmap,避免了用户空间和内核空间的拷贝。
2、 IO发展
JDK1.4 BIO 主要是同步非阻塞(和锁的自旋相似,避免大量的上下文切换造成吞吐量低,适用于大并发和IO压力较大的系统,构造稳定的系统),网络操作支持了异步阻塞。
JDk 1.7 AIO 主要是异步非阻塞
3、模型的思考
1、阻塞和非阻塞
阻塞可能造成大量的上下文切换,同时不能感知IO设备或者竞争是否繁忙
同时程序对阻塞的线程没有控制能力。这造成系统不稳定,很可能内存爆掉。
非阻塞的程序编写复杂,在IO操作时需要和锁的循环自旋类似,需要不断的重试IO操作。这种行为可以避免大量的上下文切换。
上面所说的造成上下文切换肯定是在大流量情况下才会很好的体现,所以非阻塞非常适用于大流量系统的开发。
2、同步异步
异步可以进行并发
异步可以解耦(调用方不会因为被调用方系统的处理时间的长短影响)
异步通知机制不用轮询
标签:
原文地址:http://www.cnblogs.com/YDDMAX/p/5672158.html