关于linux哪些能调用schedule或者等待事件的问题

关于linux哪些能调用schedule或者等待事件的问题

对同步问题,需要注意:
1)不能调用schedule的情况(wait_event、sleep等, 等待函数内部会调用schedule):
(1)中断、
(2)软中断、
(3)tasklet、
(4)timer(基于软中断实现)、
(5)hrtimer (软中断或硬中断环境下执行)执行环境下、
(6)或者“内核线程、普通线程内核态环境下调用了preempt_disable()/local_irq_disable()后”,
不能调用schedule()函数。

因为spin_lock成功后,spin_lock内部调用了preempt_disable,所以spin_lock后,不能调用schedule()。当然spin_unlock会调用preempt_enable,所以后面可以根据什么执行context来判断是否能调用schedule()函数。

2)能调用等待函数的情况
(1) workqueue(内部实现用到kernel thread)、
(2) kernel thread、
(3) 普通线程的内核态,
这些context下,可以调用schedule()。前提是没有调用preempt_disable禁止抢占和local_irq_disable禁止中断等操作时。

具体的原因和原理,请看我的课程:
https://edu.51cto.com/course/17155.html

https://edu.51cto.com/course/17132.html

关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

原文地址:https://blog.51cto.com/8906847/2367974

时间: 2024-10-10 21:24:24

关于linux哪些能调用schedule或者等待事件的问题的相关文章

c# 调用外包程序 等待处理完成结果

string root = @"J:\yaoqianshu"; string pythonPath = "解压缩拷贝启动动画测试(新).py"; string ccccPath = ""; ProcessStartInfo myProcess = new ProcessStartInfo(); myProcess.WorkingDirectory = root; myProcess.FileName = pythonPath; Process o

Linux下otl调用MySQL数据库

整体流程结构 otl用头文件otlv4.h来声明接口,具体实现在linux下是由unixODBC来实现:通过FreeTDS驱动最终调用MySQL的DBMS(个人观点) 要安装的软件及步骤 所以要安装的有unixODBC,FreeTDS 具体安装参考:http://wenku.baidu.com/view/89e9e711a2161479171128de.html(此文章里面的设置有问题,参考本文中的"关于odbcinst.ini和odbc.ini的说明一节") 关于odbcinst.i

android native HAL程序 java程序 linux kernel打印调用栈的方法

android native HAL程序 java程序 linux kernel打印调用栈的方法 关于android java打出调用栈的方法 1)方法一:refs:frameworks/base/services/java/com/android/server/ActivityManagerService.javastartProcessLocked(){Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "amProcessStart&quo

SQL SERVER中的OLEDB等待事件

OLEDB等待事件介绍 OLEDB等待类型是SQL SERVER 数据库中最常见的几种等待类型之一.它意味着某个会话(SPID)通过SQL Server Native Client OLEDB Provider发生了调用请求并等待数据库返回所需的数据.它出现在远程系统(remote system )或网络连接速度不够快,因此调用服务器必须等待要返回结果的情况下.OLEDB等待事件一般是由那些活动造成呢?它一般由下面一些事件引起: 远程过程调用(Remote procedure calls) 链接

【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

[等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Enqueue队列等待 ② Enq数据字典 ③ enq: AE - lock ④ enq: MR锁 ⑤ enq: DX - contention ⑥ enq: SQ - contention 序列等待     2.2  相关参考文章链接 [推

Oracle db file parallel write 和 log file parallel write 等待事件

一. db file parallel write等待事件 引自如下blog: http://oradbpedia.com/wiki/Wait_Events_-_db_file_parallel_write db文件并行写 db文件并行写等待事件属于Oracle数据库写入程序(DBWR)进程,因为它是将块从SGA写入数据文件的唯一进程.当是写入时,DBWR进程编译一组脏块,将批处理交给操作系统,并等待db文件并行写事件以完成I / O.虽然用户会话从来没有遇到db文件并行写等待事件,但这并不意味

Oracle之 等待事件log file sync + log file parallel write (awr优化)

这是3月份某客户的情况,原因是server硬件故障后进行更换之后,业务翻译偶尔出现提交缓慢的情况.我们先来看下awr的情况. 我们能够看到,该系统的load profile信息事实上并不高,每秒才21个transaction.先来看看top5events: 从top 5event,我们能够发现,log file sync的avg wait很之高,高达124ms.大家应该知道,对于绝大多数情况 下,log file sync的平均等待时间是小于5ms的,这个值有点高的离谱. 我们知道,产生log

Oracle Study之-- enq:SQ contention等待事件

Oracle Study之-- enq:SQ contention等待事件 通过AWR Report发现"enq:SQ contention"等待事件: 应用环境: 转自:http://www.xuebuyuan.com/1027129.html enq:SQ contention/row cache lock/DFS lock handle(SV) 这三个等待事件都与Oracle 的Sequence 有关. Oracle Sequence Cache 参数说明 http://blog

db file sequential read等待事件 --转载

db file sequential read db file sequential read等待事件有3个参数:file#,first block#,和block数量.在10g中,这等待事件受到用户I/O等待级别的影响.当处理db file sequential read等待事件的时候,牢记以下关键想法. l         Oracle进程需要一个当前不在SGA中的块,等待数据库块从磁盘读入到SGA中 l         要看的两个重要的数字是单独会话的TIME_WAITED和AVERAGE