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必须在原地等待,所以该模型的效率不高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值