linux驱动开发-阻塞非阻塞
从并发的需要,引起的竞争状态,到解决竞争状态的方法机制:
禁止中断
信号量
自旋锁
Completion
原子操作
目标:
掌握进程睡眠和唤醒的方法
掌握阻塞型I/O的实现方法
掌握poll/select系统调用的实现方法
阻塞:进程休眠和唤醒
非阻塞:非阻塞IO selec poll系统调用
休眠的意义?
从调度器的运行队列-》某个等待队列
唤醒等待队列可能发生的情况
当调用wake_up时,所有等待在该队列上的进程都被唤醒,并进入可运行状态
如果只有一个进程可获得资源,此时,其他的进程又将再次进入休眠
如果数量很大,被称为”疯狂售群”
独占等待
与普通休眠的不同
等待队列入口设置了WQ_FLAG_EXCLUSIVE标志时,则会被添加到等待队列的尾部。而没有这个标志的入口会被添加到头部。
在某个等待队列上调用wake_up时,它会在唤醒第一个具有WQ_FLAG_EXCLUSIVE标志的进程之后停止唤醒其他进程。
使进程进入独占等待函数:
-------------------poll函数-----------------------
void poll_wait(struct file *,wait_queue_head_t *,poll_table *);
向poll_table添加一个等待队列
如果当前没有文件描述符可用来执行I/0,则内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。
http://blog.chinaunix.net/uid-30558445-id-5524932.html poll函数调用过程 描述简单。
poll_wait只是把本进程挂入某个队列,应用程序调用poll > sys_poll > do_sys_poll > poll_initwait,do_poll > do_pollfd > 我们自己写的poll
函数后,再调用schedule_timeout进入休眠。如果我们的驱动程序发现情况就绪,可以把这个队列上挂着的进程唤醒。可见,poll_wait的作用,只是为了让
驱动程序能找到要唤醒的进程。即使不用poll_wait,我们的程序也有机会被唤醒:chedule_timeout(__timeout),只是要休眠__time_out这段时间。
示例:
static unsigned int xxx_poll(struct file *filp,poll_table *wait)
{
struct xxx_pipe *dev = filp->private_data;
unsigned int mask=0;
down(&dev->sem);
poll_wait(filp,&dev->inq,wait);
poll_wait(filp,&dev->outq,wait);
if(read_buffer_not_empty) //如果接收buffer不为空,可读
mask |= POLLIN | POLLRDNORM; /*可读取*/
if(write_buffer_not_full) //如果写buffer不满,可写
mask |= POLLOUT | POLLWRNORM; /*可写入*/
up(&dev->sem);
return mask;
}
linux驱动开发-阻塞非阻塞相关推荐
- Linux设备驱动开发-linux驱动中的非阻塞访问方式
前面已经详细分析过了阻塞访问方式,下面就来继续分析一下非阻塞的访问方式. 什么是非阻塞的访问方式呢?非阻塞操作的进程在不能进行设备操作时,并不挂起,他或者是放弃当前的进程执行,或者是不停地进行查询,知 ...
- Linux驱动开发6 阻塞与非阻塞
阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候 一定要考虑到阻塞和非阻塞.本章我们就来学习一下阻塞和非阻塞 IO ,以及如何在驱动程序中 处理阻塞与非阻塞, ...
- 详解Linux驱动技术(五) _设备阻塞/非阻塞读写
在Linux驱动程序编写过程中,设备阻塞/非阻塞读写是一种非常重要的技术.它可以实现高效的数据传输和事件处理,提高系统的性能和响应速度.在本文中,我们将深入探讨Linux驱动技术(五) _设备阻塞/非 ...
- Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
很多人对阻塞,非阻塞,同步,异步,并发,竞态的概念不是很清晰,今天我把我理解的用一个模型来说明一下这些概念. 首先建立一个模型: 我们去银行办理业务,屌丝的做法是: 1.银行未准备好,则一直排队,直到 ...
- 搭稳Netty开发的地基,用漫画帮你分清同步异步阻塞非阻塞
Netty Netty是一款非常优秀的网络编程框架,是对NIO的二次封装,本文将重点剖析Netty客户端的启动流程,深入底层了解如何使用NIO编程客户端. Linux网络编程5种IO模型 根据UNIX ...
- 五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型
五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型 1. IO基本概念 1.1 IO概念 1.2 IO的两个阶段 1.2.1 IO的两个阶段-例子说明 1.2 IO种类 2. 五种IO模型 2. ...
- 浅谈阻塞/非阻塞、同步/异步——从linux read()系统调用出发
浅谈阻塞/非阻塞.同步/异步 –从linux IO系统调用出发 阻塞与非阻塞主要从进程/线程的角度出发: 阻塞(blocking):教科书年年考的概念--调用方(主线程)发起调用之后挂起直到被调用方法 ...
- 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 嵌入式 Linux 驱动开发你想知道的都在这
最近看到公众号上写的一篇文章,关于嵌入式 Linux 驱动开发的方方面面,感觉提供不错,此处特意贴出来供大家参考借鉴. 1.嵌入式驱动开发到底学什么 嵌入式大体分为以下四个方向: 嵌入式硬件开发:熟悉 ...
- 最全Linux驱动开发全流程详细解析(持续更新)
Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...
最新文章
- ajax设置自定义请求头信息
- linux 窗口管理器_您最喜欢的Linux窗口管理器是什么?
- Kotlin — 运行代码片段(以轻量级方式编写和无需创建整个应用程序的方法)
- MQTT采集协议转换器转103 104 cdt 61850动环工业网关可定制试用
- SQL Server学习之路(一):建立数据库、建立表
- 使用FFmpeg工具进行推流、拉流、截图、变速、转换,及常见问题处理
- jxbrowser 6.18 以及 6.16 破解 整合
- 面向深度学习的多模态融合技术研究综述
- Matlab中table2array函数使用
- python数独解题器_Python编写的超帅数独可视化解题器
- ifconfig命令作用范围!
- bzoj 4408: [FJOI2016]神秘数 主席树
- python mask_python_mask_array的用法
- ICCV 2021 | 美团“LargeFineFoodAI“研讨会开幕在即,互动有奖
- 苹果语音备忘录可以转文字吗?可以语音转文字的备忘录便签
- 提问的智慧!高手如何成长为高手,高手原来也是像我一样的菜鸟!
- 中科院谭铁牛爱徒研发出《碟中谍5》中的步态识别技术,不看脸50米内在人群中认出你
- redis的MULTI与PIPELINE
- webUpload上传附件
- P4391 [BOI2009]Radio Transmission 无线传输(Kmp)