基于任务的应用程序何时切换上下文?

Posted

技术标签:

【中文标题】基于任务的应用程序何时切换上下文?【英文标题】:When do task based applications switch context? 【发布时间】:2020-04-17 02:22:10 【问题描述】:

假设您有两个任务。每个都有自己的复杂模块,运行基于计划的系统和基于事件的系统。在考虑上下文切换时,任务调度程序究竟何时以及如何决定何时切换任务,并且在某一时刻它可以做到这一点吗?在执行代码块的过程中任务会切换吗?就在函数的中间?

作为参考,我在 vxworks 环境中工作。

【问题讨论】:

执行任务切换的某些时间:1)时间片到期时 2)任务执行任何 I/O 时 3)任务调用“上下文切换”函数时 4 ) 当更高优先级的任务变为“就绪”时 5) 当正在运行的任务退出时 列表继续进行 在函数执行过程中会发生这种情况吗? 任何指令和下一条指令之间以及某些重复指令期间都可能发生上下文切换。 您能否在一条指令中使用 aquire 指向共享内存的指针,例如 p = GetGlobalPtr(),然后在能够使用它之前 p->Do(); 使其变为 null 或以其他方式无效? 这是两个陈述。语句导致(大多数时候)许多指令。 【参考方案1】:

通常,操作系统调度与 C 代码块无关。它们会在各种事件发生时切换,包括:

测量您的进程使用 CPU 多长时间的计时器到期。 连接到计算机的设备报告它已完成一项任务,并且某个优先级比您的高的进程正在等待此任务。 您的进程发出了无法立即满足的请求,例如请求从键盘输入,而用户尚未键入。

在最后一种情况下,切换当然发生在您的请求点。关于您的流程在哪里执行,其他人实际上是随机的。相关的中断可以发生在您进程中的任何指令处。

在某些处理器体系结构中,甚至可能在某些指令期间发生中断:该指令可能在仅部分执行时被中断,并且寄存器将被更新以便可以恢复执行到稍后继续说明。

【讨论】:

您能否举一个上一段中提到的架构的具体示例? @Evg: ARM has some restartable instructions,但我正在考虑移动多字节指令。我不记得它在哪个架构上! IBM 系统 360?我记得,它将 C 字节从 A 移动到 B,并为将来的移动调整了寄存器——A 和 B 前进了 C 字节,而 C 递减到零。因此可以通过将当前指针和计数写入 A、B 和 C 来中断它,然后在中断点重新开始执行指令。

以上是关于基于任务的应用程序何时切换上下文?的主要内容,如果未能解决你的问题,请参考以下文章

FreeRTOS任务创建启动调度器任务切换的过程分析——基于ARM-CotexM3

在 x86 软件中断期间,究竟何时进行上下文切换?

java线程上下文切换,用于理解java程序cpu损耗分析。

CPU 上下文切换之理论篇(上)

[转]上下文切换

详解基于 Cortex-M3 的任务调度(上)