zoukankan      html  css  js  c++  java
  • GIL,IO模型,BIO,NIO,IO多路复用,AIO

    GIL

    只针对cpython解释器,只适用于cpython解释器,(pypy:没有gil锁)python出的时候,是单核cup,开启线程,垃圾回收,让其他线程停掉,只走垃圾回收线程,不会有并发问题

    同一时刻,实际上只有一条线程在执行,有一把全局锁,只要线程执行,必须获得这把锁,才能执行
    多核cpu出现,cpython,只能有一条线程执行,就是由于GIL锁的原因
    python不能利用多核优势
    想要分到不同cpu上执行,需要开进程(解释器进程),进程里最少有一条线程,开进程,非常耗资源
    在某些情况下,并不是进程开的越多,程序执行越快
    IO密集型,开线程,计算密集型,开进程 只适用于python


    BIO

    IO 操作本质

    数据复制的过程中不会消耗CPU

    # 1 内存分为内核缓冲区和用户缓冲区
    # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用
    # 3 而IO操作、网络请求加载到内存的数据一开始是放在内核缓冲区的
    

    AIO 是彻底的异步通信。
    NIO 是同步非阻塞通信。
    有一个经典的举例。烧开水。
    假设有这么一个场景,有一排水壶(客户)在烧水。

    AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
    NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
    BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

    IO 模型

    BIO(Blocking IO) – 阻塞模式I/O

    用户进程从发起请求,到最终拿到数据前,一直挂起等待; 数据会由用户进程完成拷贝

    NIO(non-blocking) – 非阻塞模式I/O

    用户进程发起请求,如果数据没有准备好,那么立刻告知用户进程未准备好;此时用户进程可选择继续发起请求、或者先去做其他事情,稍后再回来继续发请求,直到被告知数据准备完毕,可以开始接收为止; 数据会由用户进程完成拷贝

    IO Multiplexing - I/O多路复用模型

    类似BIO,只不过找了一个代理,来挂起等待,并能同时监听多个请求; 数据会由用户进程完成拷贝

    AIO – 异步I/O模型

    发起请求立刻得到回复,不用挂起等待; 数据会由内核进程主动完成拷贝

    同步I/O 与 异步 I/O

    • 同步I/O
      • 概念:导致请求进程阻塞的I/O操作,直到I/O操作任务完成
      • 类型:BIO、NIO、IO Multiplexing
    • 异步I/O
      • 概念:不导致进程阻塞的I/O操作
      • 类型:AIO

    注意:

    • 同步I/O与异步I/O判断依据是,是否会导致用户进程阻塞
    • BIO中socket直接阻塞等待(用户进程主动等待,并在拷贝时也等待)
    • NIO中将数据从内核空间拷贝到用户空间时阻塞(用户进程主动询问,并在拷贝时等待)
    • IO Multiplexing中select等函数为阻塞、拷贝数据时也阻塞(用户进程主动等待,并在拷贝时也等待)
    • AIO中从始至终用户进程都没有阻塞(用户进程是被动的)
  • 相关阅读:
    函数参数太多的一种简化方法
    laravel 获取所有表名
    使用 laravel 的 queue 必须知道的一些事
    git "refusing to merge unrelated histories" 解决方法
    使用 xhprof 进行 php 的性能分析
    php 性能优化
    js原生实现轮播图效果(面向对象编程)
    nextSibling 和nextElementSibling
    如何在页面中使用svg图标
    svg动画 animate
  • 原文地址:https://www.cnblogs.com/kai-/p/12811016.html
Copyright © 2011-2022 走看看