首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux x86气体程序集中不需要系统调用就可以创建线程吗?

在Linux x86气体程序集中不需要系统调用就可以创建线程吗?
EN

Stack Overflow用户
提问于 2009-04-03 17:31:43
回答 7查看 32.7K关注 0票数 44

在学习“汇编语言”(在linux中使用x86架构使用GNU作为汇编程序)时,aha时刻之一是使用系统调用的可能性。这些系统调用非常有用,有时甚至是您的程序在用户空间中运行所必需的。

但是,系统调用在性能上相当昂贵,因为它们需要中断(当然还有系统调用),这意味着必须从用户空间中的当前活动程序切换到运行在内核空间的系统。

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

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

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

  • 是否可以编写汇编程序代码,可以同时在多个核上同时运行多个线程,而不需要系统调用?
  • 如果我有非常小的线程(在线程的总执行时间中很小)、性能损失,或者根本不值得付出努力,那么我会获得性能增益吗?

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-15 08:45:44

简单地说,你做不到。当你写汇编代码时,它会在一个和唯一一个逻辑(即硬件)线程上依次运行(或使用分支)。如果希望在另一个逻辑线程上执行某些代码(无论是在同一核心上,还是在同一CPU上的不同核心上,甚至在不同的CPU上),则需要让操作系统设置另一个线程的指令指针(CS:EIP),以指向要运行的代码。这意味着使用系统调用来让操作系统做你想做的事情。

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

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

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

票数 31
EN

Stack Overflow用户

发布于 2009-06-16 04:48:33

“医生,医生,我这么做很疼”。医生:“别那么做”。

简单地说,您可以在不调用昂贵的OS任务管理原语的情况下进行多线程编程。只需忽略用于线程调度操作的操作系统。这意味着您必须编写自己的线程调度程序,而且永远不要将控制传递回操作系统。(在线程开销方面,你必须比那些非常聪明的操作系统家伙更聪明。)我们之所以选择这种方法,正是因为windows进程/线程/光纤调用太昂贵,无法支持几百条指令的计算粒度。

我们的PARLANSE编程语言是一种并行编程语言:参见http://www.semdesigns.com/Products/Parlanse/index.html

PARLANSE在Windows下运行,提供并行的“谷物”作为抽象并行结构,并通过高度调优的手写调度程序和PARLANSE编译器生成的调度代码相结合来调度这些谷物,该编译器考虑到谷物的上下文,以最小化调度开销。例如,编译器确保谷物的寄存器在可能需要调度(例如“等待”)时不包含任何信息,因此调度程序代码只需要保存PC和SP。事实上,调度程序代码常常根本得不到控制;分叉的谷物只是存储分叉的PC和SP,切换到编译器预先分配的堆栈,然后跳转到谷物代码。谷物的完成将重新启动forker。

通常有一个同步谷物的联锁,由编译器使用本机锁DEC指令来实现,这些指令实现的就是计数信号量。应用程序可以从逻辑上分出数百万个谷物;如果工作队列足够长,调度程序将限制父粒度生成更多的工作,因此更多的工作不会有帮助。调度器实现工作偷取,允许缺乏工作的CPU从相邻的CPU工作队列中捕获现成的谷物。这已经实现为处理多达32个CPU;但我们有点担心,x86供应商可能会在未来几年里使用更多的!

PARLANSE是一个成熟的语言;我们从1997年开始使用它,并在其中实现了数百万行并行应用程序。

票数 19
EN

Stack Overflow用户

发布于 2009-04-03 17:38:11

实现用户模式线程。

历史上,线程模型被概括为N:M,也就是说,在M内核模型线程上运行的N个用户模式线程。现代使用是1:1,但并不总是这样,也不一定是那样的。

您可以在单个内核线程中维护任意数量的用户模式线程.只是你有责任在它们之间进行足够频繁的切换,使它们看起来都是并行的。当然,您的线程是协作的,而不是先发制人的;基本上,您在自己的代码中分散了rather ()调用,以确保定期切换。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/714905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档