vlambda博客
学习文章列表

第95p,最常见的4种网络IO模型


推荐给朋友和朋友一起学习知识


大家好,我是杨数Tos,这是《从基础到大神》系列课程的第95篇文章,第三阶段的课程Python进阶知识:网络编程的IO模型知识。

第95p,最常见的4种网络IO模型


IO模型描述的是程序等待用户输入时处理数据的方式。

注:本文只涉及网络IO模型,IO模型有多种,这里只介绍4种常见的IO模型。

第95p,最常见的4种网络IO模型

 


一、阻塞IO

阻塞IO可以称为“一根筋”,

当调用recv()函数时,系统首先查是否有准备好的数据。

如果数据没有准备好,那么系统就处于等待状态。


当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。

第95p,最常见的4种网络IO模型

 

 


二、非阻塞IO

非阻塞IO就比较灵活一点,提交请求后,无论是否有数据,都会立刻得到一个结果


等待数据阶段(accept),就不会影响程序的运行;

1、发送请求accept,无论什么情况,都会给一个recv

2、因为一直是在执行态与就绪态之间,CPU不会处于IO阻塞状态

第95p,最常见的4种网络IO模型

 

 

 

三、IO多路复用

IO多路复用是由操作系统提供一个监管机制,能够监管socket对象和conn对象,只要有人触发了,立刻就返回可执行的对象;


当监管的对象只有一个的时候,IO多路复用的效率比阻塞IO还低;


不过,IO多路复用可以同时监管N个对象;

这个监管机制是由操作系统提供的,常见的监管机制select机制wintlinux都有)、epoll机制只有linuxepoll就是异步回调机制);


注:selectpoll都可以监管多个对象,但是poll可以监管更多的对象

 

第95p,最常见的4种网络IO模型


 

四、异步IO

应用只需要向内核发送一个read请求,告诉内核它要读取数据后即刻返回;


内核收到请求后会建立一个信号联系,当数据准备就绪,内核会主动把数据从内核复制到用户空间,等所有操作都完成之后


内核会发起一个通知告诉应用,我们称这种模式为异步IO模型。


Python中实现异步的方式也比较简单,使用asyncawait关键字就可以轻松实现异步。


Pythin中常用的异步框架,包括:sanictornadoTwisted

第95p,最常见的4种网络IO模型

 

 

其实,IO模型更重要的是理解其中的概念,具体的执行过程和专业术语不需要死记硬背。

阻塞IO模型是一根筋,发送请求,必须等到数据,否则它会一直在等;

非阻塞IO模型很灵活,发送请求,不管有没有数据它都会返回结果;

IO多路复用是“大户人家”,一个人搞不定,那我招几万个“人”来帮忙不就行了吗?(多线程)

异步IO是时间管理大师,把N个线程管理的有条不紊、井然有序。

 

 

 

以上是本期内容,如果有表达不对的内容,欢迎您的留言、斧正,我们一起天天向上。

感谢您的阅读,您的三连【关注、点赞、收藏】就是对我最大的支持,谢谢!

本文由杨数Tos原创,欢迎关注,带你一起长知识。



    推   荐   内   容