在学习"汇编语言"(在x86架构上的linux中,使用GNU作为汇编程序)的同时,一个令人振奋的时刻是使用system calls的可能性.这些系统调用非常方便,有时甚至是作为程序runs in user-space所必需的

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

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

my question is therefore twofold (with an extra bonus question underneath it):

  • 可以编写汇编程序吗
  • 如果我有非常小的线程(与线程的总执行时间一样小)、性能损失,或者根本不值得付出努力,那么我会获得性能提升吗?

我的猜测是,在没有系统调用的情况下,多线程汇编代码是not种可能的.即使是这样,您是否有尽可能高效地实现线程的建议(或更好的建议:一些真正的代码)?

推荐答案

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

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

Edit:将Ira Baxter的答案与Parlanse合并.如果首先确保程序在每个逻辑线程中都有一个线程运行,那么就可以构建自己的调度程序,而无需依赖操作系统.不管怎样,你都需要一个调度程序来处理从一个线程跳到另一个线程的问题.在调用调度程序之间,没有处理多线程的特殊汇编指令.调度器本身不能依赖于任何特殊的程序集,而是依赖于每个线程中调度器部分之间的约定.

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

Linux相关问答推荐

如何判断程序是在终端上运行还是在后台运行?

从一个文件中读取文件名并将文件名和内容存储到另一个带有|的文件中作为分隔符

bind() 错误 98 - 地址已在使用中

Bash shell 脚本未通过 TRUE 条件

如何在REPL控制台中使用PowerShell将特定的CSV列转换为TitleCase?

使用文件名重新打开 linux 管道(仅从一侧)

如何使用 Golang 清除终端中的最后一行

为什么我的 Docker 进程不断在我的 Raspberry Pi 上重新启动?

为什么要命令; ls -l file_doesnot_exists > /dev/null 2>&1 正在工作; ls -l 2>&1 file_doesnot_exists > /dev/null 不是

如何使用 awk 重新排列列?

nohup 是否可以跨管道工作?

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

如何将通配符参数传递给 bash 文件

从 Linux shell 将多个文件从一个目录复制到另一个目录

如何在 Ubuntu 12.04 中更改 Jenkins 安装的端口号

如何下载较旧的 google play 服务?

我可以在 Ubuntu 上使用 Homebrew 吗?

Monit 守护程序 - 连接到 monit 守护程序时出错

如何链接到 GCC 中特定版本的共享库

Linux如何确定下一个PID?