当前位置:网站首页>阻塞 非阻塞 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
边栏推荐
- 技能大赛训练题:组策略一
- 3D rotating text animation js special effects
- 谷歌数据中心发生“电力事故”造成 3 人受伤
- YTU 2894: G--我要去内蒙古大草原
- 解决ASP.NET Core在Task中使用IServiceProvider的问题
- OSSCore 开源解决方案介绍
- Summary of whitespace, space and escape characters in C language
- EasyCVR级联时,修改下级平台名称将不同步至上级平台
- 态势丨黑客侵扰加剧,靶场为网络安全架设“防御盾”
- 面试官:项目中 Dao、Service、Controller、Util、Model 怎么划分的?
猜你喜欢
随机推荐
what is bsp in rtems
[C language] Floating point number rounding
Taro小程序跨端开发入门实战
是什么影响了MySQL性能?
什么是抽象类
第5章相似矩阵及二次型(4)
3D rotating text animation js special effects
runtime-core.esm-bundler.js?d2dd:218 Uncaught TypeError: formRef.value?.validate is not a function
第2章-矩阵及其运算-矩阵创建(1)
dedecms supports one-click upload of Word content
Gold, nine, silver and ten job-hopping seasons: technical interview questions and answers on Alibaba, Baidu, JD.com, and Meituan
金九银十跳槽旺季:阿里、百度、京东、美团等技术面试题及答案
Mount [shell][mount -o loop]
Pycharm终端出现PS问题、conda或activate不是内部命令问题..
Three-phase 380V rectified voltage
Dalian University of Technology & Pengcheng & UAE propose a mixed-scale triple network ZoomNet for camouflaged target detection, with SOTA performance!
[Microservice Architecture] Microservices and SOA Architecture (2)
bus event bus use
owl.carousel poster card Slider carousel switch
2022.8.8-----leetcode.761




![[Microservice Architecture] Microservices and SOA Architecture (2)](/img/62/70e5cd1640bc7a78525cdb662adffe.png)




