zoukankan      html  css  js  c++  java
  • BIO/NIO

    以下为自己总结,比较陌生的一块知识,如有错误欢迎指出:

    前置知识:
    1 我们的用户程序并不能直接访问磁盘等硬件设备,机器的硬件设备需要通过内核才能访问到,应用程序只能先访问内核,再通过内核才能访问到硬件。
    2 内核有一个保护模式,不是应用程序随随便便就能访问内核的,需要中断去协助才能访问内核。
    3 应用程序是怎么调到内核的?CPU在执行代码编译后的指令时,虽然看起来是方法调用,但实际是系统调用,CPU 访问到特定命令后访问内核。
    4 可以把整个IO 看作是两大部分,连接部分和处理数据部分,连接部分说的就是阻塞非阻塞的问题,处理数据部分说的就是同步非同步的问题。
    5 linux 中,一般都是同步的,只有windiws下 IOCP 是真正的异步,由内核生出一个子进程去做数据处理而不是程序自己调用。

    BIO:
    字面意思是阻塞同步IO。客户端连接请求过来,每一个新的连接进来就需要一个新的线程去支持连接,然后这个线程去做对应的事情。
    优点:简单,在连接数较少的时候是很好的。
    缺点:当连接数特别多的时候,需要很多线程去支持,对资源是一种很大的消耗;线程很多,中断处理就很频繁,线程间的切换频繁,分到CPU的实际处理时间就减少,
    资源利用率不高。


    针对以上缺点,就有了以下的
    NIO:
    字面意思是非阻塞同步IO。客户端连接请求过来,每一个新的连接进来,就有一个专用的线程直接返回,不管能不能连接都有立马的返回值【连接添加到连接列表中】。然后应用程序不断的询问内核
    时候有数据可以处理,如果有的话就处理,没有的话就去看下一个连接时候有数据处理。
    优点:连接是非阻塞的,不用生出很多线程来,资源得到了保护。
    缺点:假如有一万个IO连接,但是实际发送数据的只有三个,应用程序去寻找可以处理的IO时,就有9997次是无用的,这个地方就浪费了CPU。

    针对以上缺点,就有了以下的
    多路复用模型:
    select[select poll其实是差不多的东西,select有数量限制]
    poll

    接着NIO看,如果有一万个连接进来,然后select就统一去访问内核,由内核统一返回有哪些IO是可以处理的【内核返回的都是状态】,然后应用程序依次去访问内核,这个时候就只需要访问
    有效的几个连接,时间复杂度就大大降低了。
    优点:访问时间复杂度大大降低
    缺点:select的时候,访问内核这一步存在重复操作。


    epoll:
    解决了上述缺点:在内核上开辟一块区域,用于存放文件描述符[fd],连接进来就把对应的文件描述符放进去,如果能处理这个IO 连接了,就把这个文件描述符放到内核的另
    一块区域,应用程序就可以直接拿着一部分处理了,效率又提升了一些。

  • 相关阅读:
    文件上传与下载/Mail
    监听器/国际化
    过滤器
    父类转为子类涉及到的安全问题
    连接池
    【MySQL】Windows10下的安装与配置
    【neo4j】关于出现The old parameter syntax `{param}` is no longer supported. Please use `$param` instead的问题
    关于GitHub上传超过100M文件方法
    记录一次在知道创宇公司的实习面试经历
    《机器学习实战(基于scikit-learn和TensorFlow)》第七章内容学习心得
  • 原文地址:https://www.cnblogs.com/junbaba/p/14291100.html
Copyright © 2011-2022 走看看