驱动开发DAY6

news2025/1/13 7:43:01

非阻塞IO

在应用程序中读取硬件数据时,无论硬件数据是否准备完毕,read()函数不会阻塞,继续向下执行

 阻塞IO

当应用程序中读取硬件数据时,在硬件数据没有准备好时,进程会阻塞在read()函数位置,直到硬件数据就绪,程序继续向下执行,进程阻塞等待数据时处于休眠状态

D uninterruptible sleep (usually IO) //不可中断休眠态,不能通过外部信号将进程结束

S interruptible sleep (waiting for an event to complete)//可中断休眠态

 相关函数:

1.定义等待队列头 wait_queue_head_t wq_head;

2.初始化等待队列头 init_waitqueue_head(&wq_head);

3.wait_event(wq_head, condition)

功能:检查condition的真假,如果为真,则函数执行结束,如果为假,将进程切换到不可中断休眠状态

参数:wq_head:等待队列头

           condition:标志变量

4.wait_event_interruptible(wq_head, condition)

功能:检查condition的真假,如果为真,则函数执行结束,如果为假,将进程切换到可中断休眠状态

参数:wq_head:等待队列头

           condition:标志变量 返回值:如果condition为真则返回0,如果被一个信号中断,则返回错误码-ERESTARTSYS

5.wake_up(&wq_head)

功能:将不可中断休眠态的进程唤醒,当执行这个函数时如果condition为假,则进程被唤醒后会再次休眠

参数:等待队列头地址

6.wake_up_interruptible(&wq_head)

功能:将 可中断休眠态的进程唤醒当执行这个函数时如果condition为假,则进程被唤醒后会再次休眠

参数:等待队列头地址

 IO多路复用

IO多路复用的实现机制有三种:select/poll/epoll。IO多路复用可以在一个进程中同时监听多个硬件数据,其将用户空间中监听到的事件文件描述符添加到时间集合中,调用函数进行判断集合中文件描述符对应的硬件数据是否准备就绪,如果没有一个事件发生,将进程切换到休眠状态,当有一个或者多个硬件数据准备好了,将休眠的进程唤醒,对准备好的硬件数据进行读写

 SELECT:

select函数实现多路复用的步骤:

  1. 创建一个fd_set类型的集合,用于存放需要监视的文件描述符。

  2. 将需要监视的文件描述符添加到集合中,使用FD_SET宏定义实现。

  3. 调用select函数,传入需要监视的最大文件描述符值、读集合、写集合、异常集合以及超时时间等参数。

  4. select函数会阻塞等待,直到有一个或多个文件描述符就绪或超时,返回可读、可写或异常状态的文件描述符数目。

  5. 根据返回值,可以通过FD_ISSET宏定义来判断哪些文件描述符已经就绪,进行相应的处理。

需要注意的是,在使用select函数时,需要注意文件描述符的数量和性能问题,过多的文件描述符可能会导致select函数效率降低。

 

POLL:

阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪,当文件描述符准备就绪后,该函数解除阻塞。

EPOLL:

核心操作:一颗树、一张表、三个接口

 

调用 epoll_create 创建一个 epoll 实例,并使用 epoll_ctl 向 epoll 实例中添加文件描述符,然后调用 epoll_wait 等待事件的发生。具体步骤如下:

  1. 调用 epoll_create 创建一个 epoll 实例,返回一个文件描述符。
  2. 通过 epoll_ctl 向 epoll 实例中添加文件描述符,指定要监听的事件类型和事件处理函数。
  3. 调用 epoll_wait 等待事件的发生,返回就绪的文件描述符列表。
  4. 处理就绪的文件描述符,执行相应的操作。

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

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

相关文章

C语言——如何写出好的代码?

哈喽,大家好,今天我们来学习如何才能写出优秀的代码,主要讲的是assert和const的用法。 首先,什么样的代码才算的上是优秀的代码呢?应该符合下面的要求: 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 …

自抗扰PID(梯形图源代码)

有关ADRC的详细算法和源代码,请参看专栏的系列文章,这里不再赘述,常用链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所…

x210---根文件系统制作

一、busybox的移植 1.1、busybox源码下载 (1)busybox是一个开源项目,所以源代码可以直接从网上下载。 (2)busybox的版本差异不大,版本新旧无所谓。 (3)下载busybox可以去linuxidc等镜像网站,也可以去www.busybox.net官方网站下载。 1.2、修…

技术人如何写简历?(文末有福利)

前言 笔者在滴滴、阿里和字节时候也面试了不少人,看过形形色色的简历没有上百也有大几十份了。校招季也快到了,这里总结自身经验聊一下 技术人的简历如何去写面试官是怎么样从一份简历去开展后续的面试 简历的作用 简历是你向一家公司求职的“敲门砖…

数据结构学习之路-集合

集合Set 集合的特点集合的内部实现(使用链表)集合的内部实现(使用红黑树)复杂度分析使用红黑树实现集合的限制 集合的特点 不存放重复的元素常用于去重 例如:存放新增的IP地址,统计新增IP量;存…

torch中的model.eval()、model.train()详解

👨‍💻个人简介: 深度学习图像领域工作者 🎉工作总结链接:https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结,每个链接都是一些常用demo&#xff0c…

Laravel框架05:模型和自动验证

Laravel框架05:模型和自动验证 一、模型(AR模式)概述二、定义模型三、调用模型四、基本操作1. 添加数据① AR模式② Request 2. 查询数据3. 修改操作① AR模式② update 4. 删除操作 五、控制器验证1. 基本语法2. 输出错误信息 一、模型&…

今麦郎跻身“我最喜欢中国品牌”榜,致力领航中国品牌发展新范式

在中国经济探寻高质量发展的当下,中国民营企业肩负着推动经济发展的重任。在当前中国经济向上向前的大背景下,展示中国特色、传播中国文化、践行社会责任多位一体的高质量品牌越来越受到重视。但冰冻三尺非一日之功,唯有经历时间考验&#xf…

Spring:Spring 整合 MyBatis 的具体过程

文章目录 Spring:Day 04整合 MyBatis一、配置环境1. 导入依赖2. 准备一个数据库 二、用 Spring 整合 MyBatis1. 编写通用配置文件2. 编写实现类3. 编写 Spring 配置文件4. 测试5. 分析总结 三、拓展1. 实现2. 总结 四、事务1. 概述2. 没有事务时3. 声明式事务4. 总结…

“Shell“SNAT,DNAT

文章目录 一.SNAT1.1 SNAT原理1.2 SNAT的应用环境1.3 SNAT工作原理1.4 进行SNAT转换后1.5 配置SNAT策略1.6SNAT实验 二.DNAT2.1 DNAT工作原理2.2 配置DNAT策略2.3 DNAT实验 一.SNAT 1.1 SNAT原理 SNAT原理:修改数据包的源地址。SNAT 应用环境:局域网主…

基础学习——关于卷积层的记录

文章目录 前言一、功能层1、池化层2、nn.BatchNorm2d()3、全连接层4、softmax层 二、卷积层1、普通卷积2、空洞卷积3、多尺度卷积4、分组卷积5、深度可分离卷积6、形变卷积 前言 老是忘有些模块的具体作用,记录一下。 一、功能层 1、池化层 池化层夹在连续的卷积…

总结最全面的TCP、UDP、Socket、HTTP网络编程面试题

先看一天面试的经验: 第一场: 面试官:你说一下TCP的三次握手 我:第一次Client将SYN置1......、第二次Server收........、 第三次........ 面试官:很难背吧? 我:......是啊,很难&…

harbor安装

文章目录 先决条件硬件软件网络端口 安装docker签发证书生成证书颁发机构证书 生成服务器证书向 Harbor 和 Docker 提供证书 下载harbor安装包containerd 配置私有仓库(二选一)分发证书(如上文只是路径变了)配置登录加密登录打标签并推送与拉取 docker 配…

【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

历史文章(文章累计460) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…

机器学习神经网络——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Google Colab的使用方法

什么是 Google Colab? Colaboratory是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。是一个Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。Colaboratory笔记本存储在 Google 云端硬盘中&…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏,消费者心智和市场趋势逐渐发生变化,零售市场竞争步入深水区,为品牌带来了更大考验。但反过来,也令更多潜力股加速崛起。 北京时间5月16日,名创优品集团(NYSE:MNSO;HKEX: 9896)公布…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…

【Linux】进程控制 — 进程终止 + 进程等待

文章目录 &#x1f4d6; 前言1. 再次理解fork()函数1.1 fork()之后子进程代码和数据问题&#xff1a;1.2 fork()之后操作系统做了什么&#xff1a;1.3 为什么要写时拷贝&#xff1f;&#xff1f; 2. 进程终止2.1 main函数的返回值&#xff1a;2.2 exit() 和 _exit()&#xff1a…