10_4阻塞和非阻塞跟poll和等待队列

news2025/1/16 5:40:24

阻塞和非阻塞

广泛上的区别就是 应用程序如果非阻塞那读取不到数据就应该马上有返回值
阻塞的话就是在应用程序去read数据,但是设备驱动没有数据,就一直卡住,直到有数据再继续往下

补充阻塞知识,应用层大部分都是阻塞
如果要非阻塞 ,应用程序在打开设备节点的时候填写int fd = open(“/dev/key0”, O_RDWR|O_NONBLOCK);,这里指定了
希望对这个节点后续的操作都是非阻塞
此时会把这个标志位传到驱动层,驱动层应该根据上面的标志位,使用正确的方法来返回值
所以read时候阻塞还是非阻塞取决于驱动的实现了

等待队列

等待队列是进程打开这个文件指定了阻塞,应用程序调用read()
read的时候因为没有数据,驱动把这个进程放入等待队列
驱动初始化应该建立一个等待队列列表,每个访问设备的进程都是一个队列项
设备不可用的时候就要将这些进程对应的等待队列项添加到等待队列里面
添加到等待队列头中以后进程才能进入休眠态

最后中断产生了数据,使用void wake_up_interruptible() 唤醒队列
队列中所有存的进程继续之前休眠前的代码

poll

可以理解poll对应的就是非阻塞了
应用程序,可以打开多个设备,使用poll进行查询数据,如果有数据
再调用read(),主打一个调用read()马上有结果
所以poll算是一个监听者

注意的点,关于休眠

阻塞是应用程序调用驱动的read,驱动发现没有数据返回给read
那驱动使用 wait_event_interruptible(key_dev->wq_head, key_dev->have_data);
上面这个函数相当于 下面三个函数
__set_current_state(TASK_INTERRUPTIBLE); //设置当前进程为休眠可中断
add_wait_queue(wait_queue_head p,wait_queue_t wait);//但是要把这个进程的信息放入等待队列中
schedule();//开始调度

而在poll中,调用到驱动的poll
执行 poll_wait(filp, &key_dev->wq_head, pts); 只是为了把当前进入放入等待队列中,不会触发休眠
休眠时第一次执行完驱动poll后,回到VFS层,vfs层帮进程休眠的
问:为啥poll还有个等待队列?
答:上面vfs层帮你休眠了,那数据来了,我怎么让你这个进程醒过来,还是得唤醒等待队列啊
在这里插入图片描述

poll的流程

在这里插入图片描述
第一步需要初始化并且创建一个等待队列,放在驱动中

第二步: app打开一些文件节点,现在这些文件节点就是我们要用poll监控的节点,
把需要监控的数据内容(POLL_IN,POLL_OUT)等和节点组成数组pds[]

应用先 poll(pfds, 2, 5000); //5s没有数据就超时 加pfds表

第三步
应用程序在while中调用poll
系统调用 ->内核的vfs poll ->驱动poll

第四步:
触发了软中断,调到vfs层,这里vfs贴心的提供了一个for循环,会第一次调用到驱动的中的poll

第五步:

到驱动层
此时调用了 poll_wait(filp, &key_dev->wq_head, pts);
把驱动中注册的等待队列头,和pts poll的一个表格进行关联,这时候等待队列中就存放了当前的进程了
假设不放入队列里,那以后发生中断时,中断服务程序去哪里找到你嘛?
注意此时还没有休眠,还得继续往走回到VFS层的

第6步:
此时自己的驱动程序返回为0,说明这个时候没有数据,回到VFS层
开始休眠

从现在开始分成两种情况
1:休眠超时情况,刚刚传入到vfs层中说应用程序只等待5s
那5s到了,在vfs层中的for循环开始新的一轮,又回到了第四步

此时是第二次进入
因为这个进程放进去过一次等待队列了,这次就不继续放了
此时还是没有数据,需要返回了

返回给应用层,没有数据,应用层继续往下执行把

第二种情况有中断产生,能返回数据
第7步,中断发生,中断里有函数wake_up_interrupt(wq_head)
这时候所有在 等待队列里的进程都被唤醒,继续往下执行

回到第4步骤,图中的黄色部分,因为被中断唤醒,进程继承从这个地方执行
再次回到for循环

进入第五步
再次调用到驱动中的poll,这时候检测到右数据,那么驱动poll,会返回POLL_IN这些掩码
传输到VFS层再到应用层

最后到第8步
再次调用到驱动中的poll,这时候检测到右数据,那么驱动poll,会返回POLL_IN这些掩码
传输到VFS层再到应用层,应用层的poll返回了有数据,根据返回值判断是哪个驱动有数据,并且是什么数据
应用层继续调用read读取数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件夹比较工具怎么用 对比两个文件夹找出多余的文件

在日常工作中,经常会接触到大量的文件,长时间堆积,文件夹会越来越多,从而导致文件重复,如果想要找出想要的文件会比较麻烦,那么你知道应该怎么来查找吗?下面就让我们来学习一下文件夹比较工具怎…

【LeetCode刷题-哈希】-- 705.设计哈希集合

705.设计哈希集合 方法:使用链地址法 设哈希表的大小为base,可以设计一个简单的哈希函数:hash(x) x mod base 开辟一个大小为base的数组,数组的每个位置是一个链表,当计算出哈希值后,就插入到对应位置的…

华为OD机试 - 计算疫情扩散时间 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

在CentOS上用yum方式安装MySQL8真实全过程记录(顺利版本)

此文参考我前面的文章《在CentOS上用yum方式安装MySQL8过程记录》,之前比较曲折,现在再安装一台mysql。 因为之前很多坑已经走过,加上这台Linux之前没安装过MYSQL,所以整个过程算是非常顺利。 安装环境:centos7 mysql…

【c++|opencv】一、基础操作---1.图像读取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 有关c操作opencv记录 1. 正文 1.1 图像读取、显示、保存 // 读取、显示、保存图像#include <opencv2/opencv.hpp> #include <iostream>us…

开发语言工具编程系统化教程入门和初级专辑课程上线

开发语言工具编程系统化教程入门和初级专辑课程上线 学习编程捷径&#xff1a;&#xff08;不论是正在学习编程的大学生&#xff0c;还是IT人士或者是编程爱好者&#xff0c;在学习编程的过程中用正确的学习方法 可以达到事半功倍的效果。对于初学者&#xff0c;可以通过下面…

20M香港服务器性能测试和租用价格,这价格不亏吗?

腾讯云香港轻量应用服务器优惠价格24元一个月&#xff0c;一年288元&#xff0c;以前是30M峰值带宽&#xff0c;现在是20M峰值带宽&#xff0c;阿腾云atengyun.com分享腾讯云香港轻量应用服务器性能测评&#xff0c;包括香港轻量服务器配置价格表、CPU性能和CN2网络延迟测试&am…

IntelliJ IDEA快捷键sout不生效

1.刚下载完idea编辑器时&#xff0c;可能idea里的快捷键打印不生效。这时你打开settings 2.点击settings–>Live Templates–>找到Java这个选项&#xff0c;点击展开 3.找到sout 4.点击全选&#xff0c;保存退出就可以了 5.最后大功告成&#xff01;

​学习一下,什么是预包装食品?​

预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装材质和容器中并且在一定量限范围内具有统一的质量或体积标识的食品。简单说&#xff0c; 就是指在包装完成后即具有确定的量值&#xff0c;这一确定的…

游戏界面设计:打造吸引人的视觉体验

如何进行游戏界面设计&#xff1f;游戏UI界面设计的前景如何&#xff1f;我相信这是许多UI设计师和想要转向UI设计的设计师非常关心的问题。今天&#xff0c;小将和你谈谈。 首先&#xff0c;游戏界面设计师的前景仍然很好。游戏用户界面是一门研究人机交互的学科&#xff0c;…

【设计模式】第19节:行为型模式之“中介模式”

一、简介 中介模式定义了一个单独的&#xff08;中介&#xff09;对象&#xff0c;来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互&#xff0c;来避免对象之间的直接交互。 中介模式的设计思想跟中间层很像&#xff0c;通过引入中介这个中间层&#xf…

分享个自己写的小程序解包工具

闲聊 前几天在吾爱破解上看到一个小程序逆向的帖子&#xff1a;windows下通杀wx小程序云函数实战 &#xff0c;想着自己也学习一下怎么逆向小程序&#xff0c;一搜 unveilr 仓库没了&#xff0c;看评论好像开始收费了。 我就用aardio写了一个解密和解包工具&#xff0c;这里免…

亚马逊、ebay卖家必读!买家账号关联问题和解决应对方案。

跨境电商卖家最害怕发生的事情之一&#xff0c;就是账号关联了。在多数卖家印象中&#xff0c;平台是不允许一个卖家同时进行多账号操作&#xff0c;一旦被发现就会被强制关停。其实并非如此&#xff0c;平台是允许将不同的亚马逊卖家账号链接在一起&#xff0c;使它们形成一个…

22款奔驰C260L升级原厂360全景影像 高清环绕的视野

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

CN考研真题知识点二轮归纳(2)

持续更新&#xff0c;上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;1&#xff09;https://blog.csdn.net/jsl123x/article/details/134095044?spm1001.2014.3001.5501 1.DCHP 动态主机配置协议&#xff0c;常用于给主机动态分配IP地址&#xff0c;它提供即插即…

IBM Spectrum LSF Session Scheduler(会话调度程序)提高总体集群利用率和系统性能

IBM Spectrum LSF Session Scheduler 提高总体集群利用率和系统性能 LSF Session Scheduler 使用户能够使用作业级任务调度程序在单个 LSF 作业的分配中运行短期任务的大型集合&#xff0c;该调度程序为作业分配一次资源&#xff0c;并对每个任务复用已分配的资源。 LSF Sessi…

css position属性与js滚动

“视口”就是浏览器窗口中实际显示文档内容的区域&#xff0c;不包含浏览器的“外框”&#xff0c;如菜单、工具条和标签。文档则是指整个网页。 1 css 的position static 正常定位&#xff0c;是元素position属性的默认值&#xff0c;元素遵循常规流。 relative 相对定位&…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

参考视频&#xff1a;https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7&#xff1a;CNN 的全局架构 卷积层除了做卷积操作外&#xff0c;还要加上 bias &#xff0c;再经过非线性的函数&#xff0c;这么做的原因是 “scaled p…

SpringCloud 微服务全栈体系(八)

第九章 Docker 二、Docker 的基本操作 1. 镜像操作 1.1 镜像名称 镜像的名称组成&#xff1a; 镜像名称一般分两部分组成&#xff1a;[repository]:[tag]。在没有指定 tag 时&#xff0c;默认是 latest&#xff0c;代表最新版本的镜像 比如&#xff1a;mysql 就是 reposito…

Linux — vim编辑器的操作

目录 1. vim的整体操作2. 命令模式下的常见命令3. 底行模式下的常见命令结语 1. vim的整体操作 我们使用 touch 创建一个文件之后&#xff0c;直接 vim 文件名 就能够进入到vim编辑器中。如果vim 文件名的文件还不存在时&#xff0c;vim会自动创建该文件&#xff0c;但需要保存…