zoukankan      html  css  js  c++  java
  • python IO模式(多路复用和异步IO深入理解)

    1、事件渠道模型。事件渠道为异步IO的原型。

    2、IO模式,一次IO调用会经历两个阶段。一、等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二、将数据从内核拷贝到进程中。

    基于这两个阶段,linux系统下面产生了五种网络网络模式方案。

    -阻塞I/O(blocking IO)

    -非阻塞I/O(nobokcing IO)

    - I/O多路复用。(I/O multiplexing)

    - 信号驱动

    -异步I/O(async)

    由于信号驱动使用较少,主要介绍其余四种模式。

    3、阻塞I/O(blocking IO)在数据准备阶段和贝考数据阶段都会阻塞。用户调用recefrom 以后会一直等待数据拷贝到用户内存未至。

    2、非阻塞I/O(nobokcing IO),用户会一直调用recefrom,如果数据没有准备好。会返回一个ERROR。一直到数据准备好。因此在读数据阶段不会卡住。

    3、epoll模式,也就是IO多路复用模式。一次性可以处理多个网络IO。调用select方法。首先会卡住。直到其中一个有数据就会立即返回。然后拷贝数据。然后进入下一个循环

    4、异步IO,异步I/O不会阻塞。当用户进程发起read操作以后。可以立刻开始做其他的事情(相当于告诉在内核注册一个事件。由内核进行监控,处理完以后内核主动通知)。而另一方面从kennel角度看当他收到一个async read以后,会立马回调。所以不会产生任何阻塞。当kennel准备好数据,将数据贝考到用户内存以后,会主动通知用户,告诉read操作已完成。

    5、总结。

    blocking IO 和 nonblocking IO 区别:

      一、调用blocking IO 会一直阻塞,知道read全部完成为止。而 nonblocking IO  在ready会立即返回。相同点在于二者在coy阶段都会卡住。

    async 和 synch的区别:

       一、二者区别在于拷贝数据阶段是否会阻塞。所以上面的blocking IO、nonblocking IO、I/O多路复用都属于同步I/0。而async任何阶段不会阻塞。

    6、select poll epoll区别。

    select :他通过一个select()系统调用来监控多个文件描述符的数组。当select()返回以后,该文件描述符便会被内核修改表示位。使得进程可以获得文件描述符。从而进行后续读写操作。一、监视的文件描述符号存在最大数限制。可以通过修改内核参数来解决 2、由于select()会对所有的socket进行一次线性扫描。这也浪费了一定开销。随着文件描述符的增减。扫描时间线性增加。

    poll:去掉了最大文件数限制。缺点和select一样。另外如果将就绪的文件告诉后台进程以后,进程没有读取。下次还会继续扫描。所以一般不会丢失消息。称之为水平触发。

    epoll模式。用的最多的一种方式。同时支持水平触发和边缘触发(告诉进程描述符已经准备就绪,他只说一遍。如果程序未采取行动。下次将不会告知,这个叫边缘触发)。边缘触发较复杂。性能更高。优点:epoll相比于poll在于每次扫描只扫描活跃连接数。节省了开销。

  • 相关阅读:
    Oracle的数据库,实例,服务名
    ubuntu14.04安装oracle 11g
    sqlldr导入导出需要注意的问题
    EOF字符串
    登录plsql developer时候出现连接串问题导致的下拉列表中没有出现tnsnames.ora文件中配置的那些服务
    Oracle导出数据中的prompt,set feedback 等是什么意思
    怎么给普通用户付给权限,让它能读取v$session表
    Oracle数据库状态
    管理子程序
    pl/sql developer安装与配置
  • 原文地址:https://www.cnblogs.com/xiajq/p/9502189.html
Copyright © 2011-2022 走看看