Linux内核开发之阻塞/非阻塞IO----等待对列

本文详细解释了Linux设备驱动程序中的阻塞与非阻塞IO概念,包括它们的基本原理及应用场景,并深入探讨了如何利用等待队列(waitqueue)机制实现阻塞进程的唤醒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十一过后..

小王也刚好即将大学毕业,现在要开始写简历,投简历,找工作了。到了家工作单位,小王欣喜若狂,可再一看,心都凉了半截..“咋了,小王,看你找工作,我都来了帮你大气,怕什么,不就人多点吗..”看着排到电梯口的长龙,我说(其实,我心里也害怕,可也不能说出来不是)。“不是,你不知道,我并不怕面试上有问题,有你在,技术上还是问题吗,不相信自己还不相信你啊,我主要是怕连面试的机会都没有,你看那么多人,不知道要排到哪里去了,你说每年都这样,那些人力主管部门的咋也不想个好办法来改善一下..”小王抱怨道。“呵呵,有需求才会有进步”我哈哈大笑道,“要不这样吧,看这样子,正好给你说说有关Linux设备驱动程序中的阻塞/非阻塞IO,说不定,你一会儿面试时刚好遇到,就不用愁了..”“好好,太好了,找你算没白找..”看到小王兴致来了,我也卖个关子,顿口气说道:”下面请听----Linux设备驱动程序之阻塞/非阻塞IO”阻塞:

顾名思义,就是指在执行设备操作时若不能获得资源则挂起操作,直到满足可操作的条件后再进行操作,被挂起的进程进入休眠状态,被从调度器的运行队列移 走,直到等待的条件满足。非阻塞:就是反过来,进程在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,直到可以进行位置。“小王,明白了没这两个基本的概念,比如就像今天的面试就是一个阻塞的问题”我补充到,“当然,是不是说非阻塞一定要不非阻塞好,答案是否定的,比如如果设备驱动不阻塞,则用户想获取设备操作就只能不断的用cpu查询(当然不可能放弃了),很显然这又会无谓的消耗CPU资源。在阻塞访问就不存在这样的问题了,不能获取资源的进程进入休眠,它将CPU资源让给了其他进程”。“听你这么一说我, 再结合今天这架势,我是明白了,只是你刚才说的休眠什么的…那是不是如果条件满足了,再整个休眠唤醒什么的..”小王打岔道。“不错啊, 有点我当年的风范,懂得触类旁通了,确实这样,这样,我给你两段代码,亲身感受一下吧”阻塞地都取串口一个字符非阻塞地都取串口一个字符

char buf; 

fd = open("/dev/ttys",O_RDWR);

.. ..

 res = read(fd,&buf,1); //当串口上有输入时才返回

 if(res == 1) 

{ printf("%c\n",buf); }


char buf;

fd = open("/dev/ttys",O_RDWR | O_NONBLOCK);

.. .. 

while( read(fd,&buf,1) !=1); //当串口上无输入也返回,所 //以要循环尝试读取串口

printf("%c\n",buf);


	现在我们有了阻塞的方式读取,那么阻塞的进程因为没有获得资源会进入休眠状态,现在就要聊聊有关唤醒的事了。在Linux设备驱动中,可以使用等待队
列(wait queue)来实现阻塞进程的唤醒.等待队列能够用于实现内核中的异步事件通知机制。Linux提供了有关等待队列的操作:
1) wait_queue_head_t my_queue;    //定义等待队列头
2) init_waitqueue_head(&my_queue);    //初始化队列头
   如果觉得上边两步来的麻烦,可以直接使用DECLARE_WAIT_QUEUE_HEAD(name)
3) DECLARE_WAITQUEUE(name,tsk);    //定义等待队列
4) void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
   void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

     用于将等待队列wait添加到等待队列头指向的等待队列链表中 。

5)  wait_event(queue, conditon);

     wait_event_interruptible(queue, condition);//可以被信号打断

     wait_event_timeout(queue, condition, timeout);

     wait_event_interruptible_timeout(queue, condition, timeout);//不能被信号打断

     queue:作为等待队列头的等待队列被唤醒

     conditon:必须满足,否则阻塞

     timeout和conditon相比,有更高优先级

6)  void wake_up(wait_queue_head_t *queue);

     void wake_up_interruptible(wait_queue_head_t *queue);

     上述操作会唤醒以queue作为等待队列头的所有等待队列中所有属于该等待队列头的等待队列对应的进程。

7)  sleep_on(wait_queue_head_t *q);

     interruptible_sleep_on(wait_queue_head_t *q);

     sleep_on作用是把目前进程的状态置成TASK_UNINTERRUPTIBLE,并定义一个等待队列,之后把他附属到等待队列头q,直到资源可用,q引导的等待队列被唤醒。interruptible_sleep_on作用是一样的, 只不过它把进程状态置为TASK_INTERRUPTIBLE.

    这两个函数的流程是首先,定义并初始化等待队列,把进程的状态置成TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE,并将对待队列添加到等待队列头。

然后通过schedule(放弃CPU,调度其他进程执行。最后,当进程被其他地方唤醒,将等待队列移除等待队列头。

    在Linux内核中,使用set_current_state()和__add_wait_queue()函数来实现目前进程状态的改变,直接使用current->state = TASK_UNINTERRUPTIBLE

类似的语句也是可以的。

    因此我们有时也可能在许多驱动中看到,它并不调用sleep_on或interruptible_sleep_on(),而是亲自进行进程的状态改变和切换。

“小王,听了这么多你心里有个大致的底了没,如果考官问道这方面的问题,应该挺顺利的,现在时间来不及了,晚点我给你来个例子,你看看就可以了,瞧,马上到你了,赶快准备一下,祝你好运哦..”


【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动嵌入式设备,支持C++QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状趋势。1.3论文方法与创新点说明本文采用的研究方法在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论关键技术。2.1Spring Boot框架解释Spring Boot的核心概念主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求性能需求。3.1功能需求举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计实现过程。4.1系统架构设计给出系统的整体架构设计各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计数据操作流程。4.3界面设计与实现介绍系统的界面设计用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现成果。6.2展望与改进讨论未来可能的系统改进方向新的功能拓展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值