一、非阻塞IO的轮询读写

---如果当前进程有多个输入终端和多个输出终端呢?
while((n=read(STDIN_FILENO,buf,buf_size))>0){
   if(write(STDOUT_FILENO,buf,n)!=n)
     err_sys("write_error")
}
1、以上结构可以看出,当前进程具有一个输入终端(文件)和一个输出终端(文件)
会很有可能会发生阻塞。降低了程序的吞吐量,可以采用非阻塞IO解决。
2、如果当前进程有多个输入或者输出呢?
---可以考虑利用多个线程来解决,线程同步的复杂性,
---可以考虑多进程解决,同样存在父子进程之间的信号同步问题 依然利用一个进程,利用非阻塞的文件描述符,遍历每个文件描述符号进行非阻塞IO,缺点是浪费CPU资源。 二、异步IO  非阻塞IO并不是异步IO,切记!!!!!
 非阻塞IO只是调用时,函数会立刻或延迟返回,当条件不满足时,不会一直阻塞。
 异步IO是指将当前进程告诉内核,我对哪个文件描述符的读/写感兴趣,请在条件满足时通过信号告诉我,
 我去利用预先定义的函数去处理。避免了轮询,节省CPU资源。
 但同样存在一些问题:
 1、设备范围有限制,可能只对网络或终端设备文件描述符号有效,针对类似设备才会有信号
 2、条件满足信号对整个进程只有一个,与进程打开的文件描述符数量相比远远不够,为了区分是哪一个描述符准备好了
   ,仍然需要将这两个描述符设置为非阻塞的,非阻塞IO尝试轮询。
三、select/poll/pselect
 针对异步IO的问题,系统提供了IO多路转接。
 select(int maxfdcode,fd_set * readfds,fd_set * writefds,
     fd_set * exceptfds,struct timeval *tvptr)
 (一)原理
  select我们需要告诉内核:
  1、我们关心的文件描述符
  2、对每个描述符,我们关心的条件,是读条件满足还是写条件满足,还是异常条件满足
  3、我们获取条件满足的信息,愿意等待多长时间
  从select返回后,内核会告诉我们:
  1、已经准备好的描述符总数量
  2、对于读写或异常这三个条件中的每一个,哪些描述符已经准备好
 利用以上返回消息,就可以调用相应的IO函数,一般是read/write,因为确信该函数不会阻塞。  (二)参数解释

  2、fd_set:可以理解为一个文件描述符位列表,位置索引就是文件描述符编号。
            如果对某个文件描述符感兴趣就设置相应编号索引对应的位为1。
            当条件满足时,内核会设置相应的位为0,当返回时,我们就可以判断出是哪一个描述符准备好了。
  1、maxfdcode:是我们感兴趣的描述符最大编号+1,因为是从0开始的。目的是减少内核扫描的范围。
  3、tvptr:如果为NULL,永久等待;如果为0,立即返回不等待;如果》0,就是等待指定时间后返回,无论是否有满足条件
           存在。
  4、返回值:0表示没有满足条件存在,大于0表示有满足条件存在,-1表示有错
  5、如果fd_set都设置为NULL,等加于sleep,精度更高  (三)感兴趣文件描述符设置   FD_ISSET(int fd,fd_set *fds):判断一个文件描述符,是否依然在描述符号条件集合中打开着或者说是条件不满足。
  FD_ZERO(fd_set *fds):清零,需要重新注册感兴趣的文件描述符。第一步就是要作的。
  FD_SET(int fd,fd_set *fds):注册感兴趣条件的文件描述符
  FD_ClR(int fd,fd_set *fds):注销感兴趣条件的文件描述符
  (四、poll)
  利用一个描述符列表,代替三个条件列表,更简单
  列表中每个元素是一个数据结构:描述符编号,兴趣事件集合,当前发生的事件
四、再论异步IO,重点asio
   int aio_read(struct aiocb *aiocb)
   int aio_write(struct aiocb *aiocb)
   --成功返回操作被系统放入操作请求队列中
   --次(const struct aiocb *aiocb)--返回同步操作的完成状态 0-ok -1-fail EINPROGRESS-处理中
   --aio_return(const struct aiocb *aiocb)--利用上步骤判断,同步操作成功后调用一次,
                                            返回read/write正确调用的返回值(比如读取的字节数量),出错返回-1
   --aio_suspend(struct aiocb *aiocbstruct aiocb[] * aiocbs,nsize,timeout)
                                          --等待异步IO的完成。如果超时没有任何完成,那么返回-1,errno-EAGAIN
                                           -任何一个完成,都返回0
                                           -都完成直接返回
   --aio_cancel(int fd,const struct aiocb *aiocbstruct aiocb * aiocb)--调用后,利用aio_error检查,发回ECANCELEDconst struct aiocb *aiocb
               struct aiocb *aiocbstruct aiocb *aiocbstruct aiocb *aiocbstruct aiocb *aiocbstruct aiocb *aiocb)
   可以后跟 aio_fsync(int op,struct aiocb *aiocb)同步或者异步同步文件到存储
   (一) 参数aiocb
   
   
    五、更狠的列表IO,批量操作,异步通知
   int lio_listio(mode,aiocb[] *aiocbs,nsize,struct sigevent sigevent)
    --aio控制块中的aio_lio_opcode会表明当前的动作,是读还是写,如果是读,那么就会去调用aio_read方法,写同理。
    --mode 决定是否异步,如果是NOWIAT,那么立即返回,IO请求入队
    --sigevent是在列表中所有IO完成后,才会得到通知调用,这不会妨碍各个IO请求的异步通知,适合于完成后作一些处理
const struct aiocb *aiocb
 

非阻塞IO与异步IO的更多相关文章

  1. [翻译]各个类型的IO - 阻塞, 非阻塞,多路复用和异步

    同事推荐,感觉写的不错就试着翻译了下. 原文链接: https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non ...

  2. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  3. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...

  4. 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  5. 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  6. IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

    IO模型介绍: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * signal driven IO 信号驱动IO ...

  7. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

  8. python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  9. Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...

  10. 阻塞IO、非阻塞IO、同步IO、异步IO等

    https://www.cnblogs.com/zingp/p/6863170.html 阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 4 select/poll/epoll的区别 ...

随机推荐

  1. 开关电源ac-dc推荐电路

    在使用AC-DC电源模块SA系列时,如果碰到对模块的输出纹波噪声要求较高或对EMC要求严格的场合,应对模块进行必要的滤波处理使到满足不同环境的特殊要求,以下推荐一滤波电路供参考: 图中各元件的说明:1 ...

  2. 软件版本 Alpha、Beta、Rc

    软件版本的周期 α.β.γ 表示软件测试中的三个阶段 α :第一阶段,内部测试使用 β: 第二阶段,消除了大部分不完善的地方,仍可能存在漏洞,一般提供给特定的用户使用 γ: 第三阶段,产品成熟,个别地 ...

  3. 3_08_MSSQL课程_Ado.Net_子查询

    子查询 1.把一个查询结果作为一个表来使用,就是子查询. 2.把一个查询结果作为一个 表达式进行使用就是子查询. (分页Sql)

  4. OpenCV学习 - 图片集合成视频

    这个很简单,没什么好说的...这里给出学习手册: 1.官方教程:https://docs.opencv.org 2.这个是一些video相关的API参考:https://docs.opencv.org ...

  5. redhat 7.6 流量监控命令、软件(2) iftop 监控网络IP实时流量

    1.安装iftop,先要安装flex.bison.libpcap编译安装 解压红箭头的两个文件 tar  -zxvpf  iftop-0.16.tar.gz tar  -zxvpf   libpcap ...

  6. 简单聊一聊Ansible自动化运维

    一.Ansible概述 Ansible是今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误.Ansible通过本身集成的非常丰富的模块 ...

  7. css3内外阴影同时显示

    内外阴影同时显示: box-shadow: 0px 0px 0.4rem rgba(255,255,255,0.5) inset,0px 0px 0.7rem rgba(185,119,143,0.9 ...

  8. Python流程控制-2 条件判断

    条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下 ...

  9. Linux命令:vi | vim命令

    vim - vi 增强版.文本编辑器 格式:vim [options] [file ..] 说明:如果file存在,文件被打开并显示内容,如果文件不存在,当编辑后第一次存盘时创建它 [options] ...

  10. flex布局(非常重要)

    首先明确一点是, flex 是 flex-grow.flex-shrink.flex-basis的缩写.故其取值可以考虑以下情况: flex 的默认值是以上三个属性值的组合.假设以上三个属性同样取默认 ...