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

            异步可以进行并发

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

            异步通知机制不用轮询 

     

     

  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5672158.html
Copyright © 2011-2022 走看看