linux - 中断上下文和进程上下文的区别?
问题描述
什么是中断上下文?什么是进程上下文?中断上下文的优点是什么?
为什么需要下半部分?为什么不把所有的处理都放在上半部分?
解决方案
进程上下文是进程的当前状态,进程上下文可以进入睡眠,可抢占,执行耗时任务,获取和释放互斥量。
中断上下文是当中断发生状态/优先级进入中断处理程序,并且当前进程停止/保存直到我们完成中断,中断上下文不是时间消耗的,不可抢占的,它不能进入睡眠状态。
Bottom Half 机制,SoftIRQ,Tasklet 工作在中断上下文中,workqueue 可以进入睡眠,所以它不会在中断上下文中运行。
进程上下文
进程中最重要的部分之一是正在执行的程序代码。这段代码是从一个可执行文件中读入的,并在程序的地址空间内执行。正常的程序执行发生在用户空间。当程序执行系统调用或触发异常时,它会进入内核空间。此时,内核被称为“代表进程执行”并且处于进程上下文中。在进程上下文中,当前宏是有效的。退出内核后,进程恢复在用户空间中执行,除非更高优先级的进程在过渡期间(过渡期)变得可运行,在这种情况下,调度程序被调用以选择更高优先级的进程。
中断上下文
执行中断处理程序或下半部分时,内核处于中断上下文中。回忆一下,进程上下文是内核在代表进程执行时所处的操作模式——例如,执行系统调用或运行内核线。在流程上下文中,当前宏指向关联的任务。此外,由于进程在进程上下文中与内核耦合(因为进程以与上述进程相同的方式连接到内核),进程上下文可以休眠或以其他方式调用调度程序。
另一方面,中断上下文与进程无关。当前宏不相关(尽管它指向中断的进程)。如果没有后备进程(因为没有进程背景),中断上下文无法休眠——它会如何重新调度?(或者如何重新安排它?)因此,不能从中断上下文中调用某些函数。如果一个函数休眠了,你就不能从你的中断处理程序中使用它——这限制了函数,所以人们可以从中断处理程序中调用它。(这是在中断处理程序中可以使用哪些函数的限制)
链接了解更多详情。
推荐阅读
- hangfire - Hangfire BackgroundJob.Enqueue 运行多次而不是只运行一次
- json - Json对象作为json日志中的字符串 - Spring Boot
- javascript - 用于在 html 的“选择”列表中添加图像的技巧
- authentication - 如何对 Blazor Web 应用程序和 api 进行身份验证?
- javascript - 图像未在 REACT 中危险地加载 SetInnerHTML
- python - 更新 JSONField() 中的键值
- java - Android Java 谷歌地图 TileOverLay “打开街道地图”
- java - 使用面临 IllegalStateException 的多个数据源时的 Spring 批处理问题:无法打开 JPA EntityManager 进行事务处理:已经值
- angular - 在 Jenkins(CI/CD)上构建 dist 时出现 Angular 文件问题
- java - 可以在不重新旋转的情况下使用 docker 容器的最长时间?