• 网络编程


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

            异步可以进行并发

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

            异步通知机制不用轮询 

     

     

  • 相关阅读:
    20170926-构建之法:现代软件工程-阅读笔记
    我的swift的ui标签
    内存管理:内存泄漏和空悬指针
    闭包
    泛型,修饰符和异常处理
    类型转换,接口和扩展
    初始化2
    类的继承和初始化1
    枚举与可选值
    swift中的类和结构
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5672158.html
Copyright © 2020-2023  润新知