文章目录
- 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事件就绪
- 读事件就绪,读缓冲区里面有数据,为了减少用户态内核态的过度切换,就让一次读取的数据足够多,水位线(低于就发)
- 写事件就绪,发送的缓冲区有足够的空间进行拷贝
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树跨区域 络的通信学习 络层的作用22969 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!