多路IO转接——前导

文章目录

  • IO的概念
    • 但是操作系统是怎么知道当前 卡当中是有数据:
      • 中断.中断向量 中断向量表
    • 底层数据到达时操作系统做了啥:
      • 硬中断 软中断
    • 软中断
    • 硬中断
    • 中断
  • 高级IO为何高效
    • 高级IO的本质
    • 五种IO模型
    • 我们使用一个例子来讲解五种IO模型
    • 高效IO 的本质
    • 同步IO vs 异步IO
    • 为什么是内核收到数据
    • 多路IO转接高效的原因
  • fcntl

IO的概念

  • 但进程阻塞接口直观看到进程卡住了,等待着某个事件就绪
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

fcntl

fcntl函数主要是用来操作文件描述符的

一个文件描述符,默认都是阻塞IO,fcntl可以让文件描述符为非阻塞的
但是骑士除了fcntl的方式,还有好几种方法,如open的时候,可以设置第二个参数为O_NONBLOCK,可以让打开的文件描述符就是非阻塞的,或者调用recv等接口的时候,设置flags 为O_NONBLOCK

传入的cmd值不同,后面追加的参数也不一样,fcntl函数有5个功能
复制一个现有的描述符(cmd=F_DUPFD).
获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).
我们此处只是用第三种功能 获取/设置文件状态标记, 就可以将一个文件描述符设置为非阻塞.

接口测试:

测试代码:默认read读取为非阻塞,每次往标准输入里面读取一个数据,默认缓冲区为空,便会卡住让我们输入数据

非阻塞等待

在非阻塞的情况下,我们读取数据,如果数据没有就绪,系统是以出错的形式返回的(不是错误)

没有就绪和真正的错处,使用同样的方式标识的,如何进一步区分呢rno=11()
EAGAIN(EWOULDBLOCK):给非阻塞用的,这两个是一样的,errno=11,底层没有就绪,try again

什么叫做等事件就绪,
IO事件就绪

  1. 读事件就绪,读缓冲区里面有数据,为了减少用户态内核态的过度切换,就让一次读取的数据足够多,水位线(低于就发)
  2. 写事件就绪,发送的缓冲区有足够的空间进行拷贝

文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树跨区域 络的通信学习 络层的作用22969 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年8月13日
下一篇 2022年8月13日

相关推荐