• 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 连接了,就把这个文件描述符放到内核的另
    一块区域,应用程序就可以直接拿着一部分处理了,效率又提升了一些。

  • 相关阅读:
    Mac 安装 mysqlclient
    Linux下切换Python版本的几种方法
    django执行python manage.py makemigrations 时报错AttributeError: 'str' object has no attribute 'decode'
    Linux下切换Python版本的几种方法
    django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
    解决https网页无法加载http资源问题
    Git——本地仓库与远程仓库关联
    vue项目笔记(五)——vue不同环境配置不同的打包命令
    配置系统读取配置2
    依赖注入概要
  • 原文地址:https://www.cnblogs.com/junbaba/p/14291100.html
Copyright © 2020-2023  润新知