在Linux x86 GAS assembly中,是否可以在没有系统调用的情况下创建线程?

在学习“汇编语言”(在x86体系结构上的linux中使用GNU作为汇编程序)的同时,aha的一个重要时刻是使用系统调用的可能性。这些系统调用非常方便,有时甚至在程序在用户空间中运行时也是必需的。
然而,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有系统调用),这意味着必须从用户空间中当前的活动程序切换到内核空间中运行的系统

我想说的一点是:我目前正在实现一个编译器(用于一个大学项目),我想添加的额外功能之一是支持多线程代码,以提高编译程序的性能。因为一些多线程代码将由编译器本身自动生成,这几乎可以保证其中也会有非常少量的多线程代码。为了获得性能上的胜利,我必须确保使用线程能够实现这一点

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

因此,我的问题有两个方面(下面还有一个额外的问题):

  • 可以编写汇编程序吗
    可以运行多个线程的代码
    同时在多个核上
    一次,没有系统的需要
    电话
  • 如果我有非常小的线程(与线程的总执行时间一样小)、性能损失,或者根本不值得付出努力,那么我会获得性能提升吗

我的猜测是,如果没有系统调用,多线程汇编代码是不可能的。即使是这样,您是否有尽可能高效地实现线程的建议(或更好的建议:一些真正的代码)

简而言之,你不能。当您编写汇编代码时,它在一个且仅在一个逻辑(即硬件)线程上按顺序(或通过分支)运行。如果希望某些代码在另一个逻辑线程上执行(无论是在同一个内核上,还是在同一个CPU上的不同内核上,甚至是在不同的CPU上),则需要让操作系统设置另一个线程的指令指针(CS:EIP)以指向要运行的代码。这意味着使用系统调用让操作系统执行您想要的操作

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

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

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

发表评论