当前位置: 首页 > 面试题库 >

是否可以在Linux x86 GAS程序集中创建没有系统调用的线程?

任飞龙
2023-03-14
问题内容

在学习“汇编语言”(在Linux中,使用GNU作为汇编语言的x86体系结构)的同时,其中一件令人惊奇的事情是可以使用系统调用。这些系统调用非常方便,有时甚至需要在程序在用户空间中运行时使用。
但是,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有系统调用),这意味着必须从用户空间中当前的活动程序到内核空间中运行的系统进行上下文切换。

我要说的是:我目前正在实现一个大学项目的编译器,并且我想添加的其他功能之一是对多线程代码的支持,以增强编译程序的性能。
。因为某些多线程代码将由编译器本身自动生成,所以这几乎可以保证其中也将包含非常少的多线程代码。为了获得性能上的胜利,我必须确保使用线程可以实现这一目标。

但是我担心的是,为了使用线程,我 必须
进行系统调用和必要的中断。因此,微小的(自动生成的)线程将受到进行这些系统调用所花费的时间的极大影响,这甚至可能导致性能损失…

因此,我的问题是双重的(在其下面有一个额外的奖金问题):

  • 是否可以编写可以在多个内核上同时运行多个线程 无需系统调用的汇编代码?
  • 如果我的线程非常小(在线程的总执行时间中很小),性能下降,或者是否值得付出所有努力,我是否可以获得性能提升?

我的猜测是,没有系统调用就 不可能 实现多线程汇编代码。即使是这种情况,您是否有建议(或什至更好:一些实际代码)建议尽可能高效地实现线程?


问题答案:

简短的答案是您不能这样做。当您编写汇编代码时,它在一个且仅一个逻辑(即硬件)线程上按顺序(或带有分支)运行。如果您希望某些代码在另一个逻辑线程上执行(无论是在同一内核上,在同一CPU上的不同内核上,还是在不同CPU上),则需要让OS设置其他线程的指令指针(CS:EIP)指向要运行的代码。这意味着使用系统调用来使操作系统执行您想要的操作。

用户线程不会为您提供所需的线程支持,因为它们都在同一硬件线程上运行。

编辑:将 Ira Baxter的答案与 Parlanse 结合 在一起
。如果确保您的程序在每个逻辑线程中都有一个运行的线程开始,那么您可以构建自己的调度程序而无需依赖操作系统。无论哪种方式,都需要一个调度程序来处理从一个线程到另一个线程的跳变。在调用调度程序之间,没有特殊的汇编指令可处理多线程。调度程序本身不能依赖任何特殊的程序集,而是依赖于每个线程中调度程序各部分之间的约定。

无论哪种方式,无论您是否使用操作系统,都仍然必须依靠某些调度程序来处理跨线程执行。



 类似资料:
  • 问题内容: asm_execve.s: 生成文件: 程序已执行,但未调用sys_execve: 预期输出为: 该Assembly程序应该像以下C代码一样工作: 系统调用参数有问题吗? 问题答案: 该系统调用 时 被调用,但你确实传递错误参数。 (您可以通过使用运行可执行文件来查看此内容。) 存在三个问题: 不以0结尾的字符串。(您可能会很幸运,因为在此示例中的本节中没有任何内容,但是不能保证…)添

  • 我正在编写一个多线程Java程序,其中每个线程可能需要将其标准输出重定向到一个单独的文件。每个线程都有自己的文件。是否有可能在“每个线程”的基础上重定向System.out,还是所有线程对System.out全局更改?

  • 我对系统调用感到困惑。 问题是:是否有一个系统调用服务例程,它总是被调用,以便找到特定的系统调用,如写、读等。? 系统调用是否也存储在函数指针向量中?像这张照片上显示的那样? 如果是这样,为什么有可能添加您自己的系统调用,而没有可能添加您自己的中断处理程序?为什么中断向量是固定大小的,而系统调用向量不是? 引自Silberschatz操作系统概念: 系统调用通常以陷阱的形式到达中断向量中的特定位置

  • 我想在使用RXJava的非主线程中调用“onSensorChanged”方法。 这是我的传感器代码。

  • 我试图为流星应用程序创建一个5.1.1的Android模拟器。到目前为止,我一直在遵循这些步骤,但是当我试图创建时,我得到消息“没有CPU/ABI系统映像可用于此目标”。 我搞砸了吗? 使现代化 我不确定它是否重要,但是当我打开SDK时,我得到了这些信息: 吸引人https://dl.google.com/android/repository/addons_list-2.xml 成功获取加载项列表