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中从始至终用户进程都没有阻塞(用户进程是被动的)

猜你喜欢

转载自www.cnblogs.com/kai-/p/12811016.html