zoukankan      html  css  js  c++  java
  • 网络编程

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

            异步可以进行并发

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

            异步通知机制不用轮询 

     

     

  • 相关阅读:
    php实现邮件自动发送之PHPMailer
    wnmp配置(windows+nginx+mysql+php开发环境)
    _stdcall和_cdecl,extern “C”的联系
    DLL导出的方式
    C++哈夫曼编码
    Python CGI 环境搭建
    Java学习日记——第二记:基本类型的类型转换
    测试技术的应用
    软件测试的分类
    软件测试生命周期
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5672158.html
Copyright © 2011-2022 走看看