网络编程

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、同步异步

        异步可以进行并发

        异步可以解耦(调用方不会因为被调用方系统的处理时间的长短影响)

        异步通知机制不用轮询 

 

 

posted @ 2016-07-15 00:11  YDDMAX  阅读(190)  评论(0编辑  收藏  举报