当前位置:   article > 正文

IO模型_io耗时操作

io耗时操作

IO模型

IO指的是输入输出,输入输出都是一个耗时的操作,程序中一旦遇到了输入输出就会被阻塞,导致程序效率降低,IO模型也就是输入输出模型,是为了提高IO效率而出现。

IO本质上也分为不同类型,其中最典型的就是网络IO,由于网络速度比运算速度慢很多,所以大量的时间都是在等待网络IO,这也是我们要关注的重点!

copyData与waitData

网络通讯时,应用程序的数据是交由操作系统来进行发送的,同样接收数据时也是操作系统先收到消息。

为了更好的理解IO模型,需要先了解数据的接收和发送经历了哪些阶段过程。

1.发送数据时 send sendto

数据从应用程序内存copy到系统缓存,后续操作由操作系统完成,只需经历copydata阶段

import socket
​
c = socket.socket()
c.connect(("127.0.0.1",9898))
​
while True:
    data = input(":")
    if not data:continue
    c.send(data.encode("utf-8")) # 阻塞函数 速度较快 感觉不到阻塞

 

2.接收数据时 recv recvfrom accept

向操作系统发起读取操作后,必须要等待数据到达缓冲区,然后在从缓冲区copy到应用程序内存

所以接收数据 需要先经历waitData 再经历copyData

import socket
​
s = socket.socket()
s.bind(("127.0.0.1",9898))
s.listen()
​
while True:
    c,addr = s.accept() # 阻塞
    while True:
        data = c.recv(1024)  # 阻塞
        print(data.decode("utf-8"))

 

 

IO模型分类

阻塞IO

阻塞IO指的是程序一旦发起了相关的调用后,必须在阻塞在原地,等待IO操作结束后才能继续执行。

目前所学的所有TCP程序都属于阻塞IO模型(gevent除外),默认情况下socket提供的一系列方法都是阻塞的

如:recv send accept等,

需要强调的是:无论是什么样的IO模型都必须经历waitData和copyData,区别就在于对这两个阶段的处理方式不同。

阻塞IO具体流程如下:

 

大量的时间都耗费在等待waitData和 copyData上,而阻塞IO必须在原地等待,所以该模型的效率不高。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/770003
推荐阅读
相关标签
  

闽ICP备14008679号