Function 什么东西更贵?上下文切换还是函数调用?

Function 什么东西更贵?上下文切换还是函数调用?,function,architecture,operating-system,overhead,context-switch,Function,Architecture,Operating System,Overhead,Context Switch,在裸机系统(嵌入式微控制器、无MMU、无分页)上,什么更昂贵?完整上下文切换(寄存器保存和还原)或函数调用(激活记录分配) 我知道这在很大程度上取决于调用约定和硬件能力,但我该如何评估这一点呢 编辑: 为了提供更多的上下文,我尝试对两种调度方案进行建模。第一种是具有任务间上下文切换的抢占式调度器。第二个是函数指针运行队列,其中任务是状态机,分为几个可供调用的函数调用(在IO事件驱动的基础上进行调用) 在大多数情况下,我可以收集关于我的任务需要多长时间(IO和CPU时间)的良好数据,但我需要一些帮

在裸机系统(嵌入式微控制器、无MMU、无分页)上,什么更昂贵?完整上下文切换(寄存器保存和还原)或函数调用(激活记录分配)

我知道这在很大程度上取决于调用约定和硬件能力,但我该如何评估这一点呢

编辑:

为了提供更多的上下文,我尝试对两种调度方案进行建模。第一种是具有任务间上下文切换的抢占式调度器。第二个是函数指针运行队列,其中任务是状态机,分为几个可供调用的函数调用(在IO事件驱动的基础上进行调用)


在大多数情况下,我可以收集关于我的任务需要多长时间(IO和CPU时间)的良好数据,但我需要一些帮助来计算作为常量添加到模型中的额外开销成本。

因为触发上下文切换的系统调用是函数调用,而触发上下文切换的硬件中断是类似的,(并且需要调用事件/信号量,以及跳转/调用调度程序入口点,以向上下文切换发送信号),我认为函数调用在CPU周期方面会更便宜,除非传递的参数数量不合理


这听起来像是一个XY问题-为什么要问这个问题?上下文切换和函数调用几乎是正交的-一个是基于堆栈的机制,另一个选择完全不同的堆栈。

您可以通过对比这些技术及其对整体数据移动的实际影响来对此进行评估

例如,在6502上,一个中断推送:程序计数器、X、Y、a和状态寄存器。这是6字节的实际数据,需要7个CPU周期

诚然,6502是比现代设计简单得多的CPU,但它是这个问题的一个基本例子

现在,一个函数调用可以说是一个跳转子程序,它只是将当前PC推到堆栈上,然后将PC更改到新位置。在6502上,JSR需要6个周期

如果将JSR和BRK(6502的软件中断)作为基元,JSR比BRK便宜1个周期,这超出了调用帧的成本。

大多数上下文切换都是自动完成的(通过定时器或其他方式),以模拟多处理。但有些系统使用CPU陷阱原语进行系统调用(如MS-DOS中的INT和旧Mac OS中的trap)。因此,软中断仍然必须站在堆栈帧上,就像正常的子例程一样

最后,JSR可能比任何更高级的开关机制都便宜,因为它非常轻量级。中断机制通常有一个子例程所没有的间接机制(这就是为什么它们在系统调用中被如此频繁地使用)。编译器在编译时管理子例程地址


但这些是评估原始性能时需要考虑的因素。

您是否正在尝试执行一个特定的活动,并想知道使用哪个概念?@Darnight-在上面添加了新的注释我不太明白。我相信问题是试图比较苹果和橘子。方法调用最终归结为跳转指令(另外,按下/弹出两个值并更改电脑)(是的,你在回答中提到了这一点)。另一方面,上下文切换可能在任何时候都会发生,因为完全没有任何结果。它们是两件独立的事情。将新评论添加到原始帖子将新评论添加到原始帖子