当前位置:网站首页>阻塞 非阻塞 poll机制 异步
阻塞 非阻塞 poll机制 异步
2022-08-10 10:40:00 【生活需要深度】
1 阻塞
阻塞操作:是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操 作条件后在进行操作。
read()-->HelloRead
驱动中如何实现阻塞?可以定义一个休眠等待队列
wait_queue_head_t q;//定义一个休眠等待队列头
init_waitqueue_head(&q);//初始化休眠等待队列
使用:helloRead:
wait_event_interruptible(q,con)-->使请求读数据的进程休眠--》休眠期可被 中断
wait_event(q,con)-->休眠期不能被中断
HelloWrite:-->写入数据后唤醒读进程读数据
wake_up_interruptible(&q);-->唤醒可被中断的休眠进程
wake_up;
con=1;
con:休眠进程进程的唤醒条件:1 唤醒 0 休眠
注:当进程正常运行时,进程在运行对列中等待被运行。
当进程休眠时,进程在休眠等待队列中等待被唤醒运行
2 非阻塞
非阻塞操作:是指在不能进行设备操作时,并不休眠或挂起进程,而是给请求进程立 即返回一个非正确的值,底层设备驱动通过不停的查询设备操作是否可进行 ,直到操作可进行后返给请求进程一个正确的结果。
read-->非阻塞
应用层:open("dev/haha0",O_RDWR|O_NONBLOCK);
驱动层:HelloRead()
if(设备中没有数据可读)
{
if(应用层传入了O_NONBLOCK标志)
{
给应用程序返回非正确的值
}
else
{
阻塞进程;
}
}
else
阻塞
g_charcount:表示实际写入到内核中的字符个数
3 poll机制
io多路复用--》select poll epoll
HelloPoll(struct file *pFile, struct poll_table_struct *ptable)
实现:1 将监控文件描述符的进程放入监控队列--》poll_wait(pFile,&q,ptable)
ptable:轮询表
将当前操作文件的进程加入到休眠等待队列中,将该队列加入到ptable.
2 系统对监控队列中的修眠进程监控,若休眠进程的文件描述符上有IO数据发生,系统会将该进程激活。
return mask;
mask:用来描述操作是否可以立即无阻塞执行的位掩码
mask:是一个32bits的整数,它的没每一个bit位代表了设备的一种操作状态(每一个BIT位都可以用一个宏来表示)
POLLIN:有数据可读
POLLRDNORM:有普通数据可读
POLLOUT:有数据可写
POLLERR:指定文件描述符发生错误
4 异步IO
异步IO:读进程去设备中读数据,设备没有数据可读,那么当前进程阻塞,若内核检测到设备有数据可读时,会给读进程发送通知信号,读进程会执行该信号对应的处理动作去读数据。
应用:
A(读数据进程)
1 注册一个信号处理函数 signal(SIGIO,hander);
2 打开设备文件 fd=open("/dev/haha0",...);
3 设置文件描述符的宿主 fcntl(fd,F_SETOWN,getpid());
4 读取文件描述符的标志 int flags=fcntl(fd,F_GETFL);
5 设置文件描述符标志 fcntl(fd,F_SETFL,flags|FASYNC)->异步通知标志
while(1);
hander-->read()
注:fcntl:是系统调用函数,用来设置或获取文件描述符的属性
B(写数据进程)
1 open("/dev/haha0");
2 write-->helloWrite-->给读进程发信号
3 close
驱动:
1 HelloFasync
1 定义一个全局的异步通知结构体--》关联信号发送方和接收方
2 初使化异步通知结构体
fasync_helper(fd,pFile,on,&fasync)
2 HelloWrite
kill_fasync(&fasync,SIGIO,POLL_IN);
SIGIO-->fasync-->fd(读)--》getpid()==A
边栏推荐
- ZZULIOJ 1124: 两个有序数组合并
- Codeforces 814 C. An impassioned circulation of affection (dp)
- Dry goods!ASSANet: Making PointNet++ faster and stronger
- ISO9001在讲什么?过程方法和风险思维
- STM32 encapsulation ESP8266 a key configuration function: implementations of AP mode and the STA mode switch, server and the client to create
- dedecms supports one-click upload of Word content
- Memory problems difficult to locate, it is because you do not use ASAN
- 关于json转换器缺失的问题,报错内容:No converter found for return value of type
- What is affecting MySQL performance?
- 14道高频手写JS面试题及答案,巩固你的JS基础
猜你喜欢
runtime-core.esm-bundler.js?d2dd:218 Uncaught TypeError: formRef.value?.validate is not a function
ESP8266 Tutorial 1 - Introduction to ESP8266 Hardware Platform
"Data Strategy" Results-Driven Enterprise Data Strategy: Organization and Governance
Redis (three) - detailed configuration file, publish and subscribe, new data types
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
Short video software development - how to break the platform homogenization
"Time Series Database" uses cassandra to scan time series data
网络安全笔记6——数字证书与公钥基础设施
谷歌数据中心发生“电力事故”造成 3 人受伤
动作捕捉系统用于室内组合定位技术研究
随机推荐
GPU加速Pinterest推荐模型,参数量增加100倍,用户活跃度提高16%
Introduction to cross-end development of Taro applet
Redis (six) - transaction and lock mechanism of Redis6 (unfinished, to be supplemented)
这些年我开源的几个小项目
runtime-core.esm-bundler.js?d2dd:218 Uncaught TypeError: formRef.value?.validate is not a function
3D旋转文本动画js特效
2022.8.7-----leetcode.636
大连理工&鹏城&UAE提出用于伪装目标检测的混合尺度三重网络ZoomNet,性能SOTA!
Flutter实战-请求封装(五)之Isolate线程改造
关于json转换器缺失的问题,报错内容:No converter found for return value of type
WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)
EasyCVR级联时,修改下级平台名称将不同步至上级平台
js猜拳小游戏源码
Swin Transformer作者曹越加入智源,开展视觉基础模型研究
兼容移动和PC的loading加载和toast消息插件
组合模式:Swift 实现
Summary of whitespace, space and escape characters in C language
「时序数据库」使用cassandra进行时间序列数据扫描
What is an abstract class
In August the DB list latest scores - database Engines