在Intel x86汇编中如何实现并发?

13
我很好奇如何在Intel x86汇编上编写并发软件。使用线程或带有yielding的协程都很有趣。
我知道在汇编中这样做并不实际,但我只是好奇。
注:保留了原文中的HTML标签。

可能是什么是“多核”汇编语言?的重复。 - Ciro Santilli OurBigBook.com
很棒的问题...我很想看到有人发布一个例子哈哈:) 不过这会很大!!! - War
2个回答

14
如果你在讨论用户空间,那么做法和C语言一样。也就是说,你会使用适当的参数调用pthread_create()(或者你操作系统上的“创建新线程”API),其中包括新线程“主”函数的地址,然后你就可以开始了。
如果你在谈论没有操作系统帮助的裸机级别,那么你将为新线程的堆栈分配一块内存块(从你之前编写的内存分配器中),设置一个定期的计时器滴答声,运行(你之前编写的)调度程序代码,保存寄存器内容并在你的线程堆栈之间切换等等。
至于如何用汇编语言来代替C语言进行操作?嗯,除了要多付出很多汗水和眼泪,基本上是一样的。

1
关于第二部分(没有操作系统的帮助),你需要使用什么样的汇编指令来在不同的核心上运行一些代码?我意识到我可以使用基于时间片的切片和抢占自己的线程来实现基本的多任务处理,但是对于真正的物理核心,在那里它们实际上同时运行代码,该怎么办呢?这是如何工作的?我想我正在询问操作系统如何以一般术语为多核CPU进行多线程处理。 - Tower
1
原则上很简单,只需将CPU的IP(指令指针)寄存器设置为您希望它开始运行的位置即可。实际上,启动所有核心是非常复杂的(例如如何设置中断),并且有一个规范:http://www.intel.com/design/pentium/datashts/242016.htm。 - janneb

14

在X86处理器上,多处理器(和多线程)通信是通过APIC(高级可编程中断控制器)http://en.wikipedia.org/wiki/Intel_APIC_Architecture完成的。

当操作系统启动时,只有一个逻辑处理器正在运行操作系统代码,以符合传统的单处理器行为。

操作系统使用APIC向每个其他线程发送“SIPI”(启动互处理器中断)。 每个线程都会唤醒,并更新内存区域,以便主线程知道它有多少处理器可用。 每个线程宣布自己后,进入低功耗、可中断状态。

当操作系统想要在这个逻辑处理器上运行一些东西时,它要求当前正在运行的处理器通过APIC发送一个IPI(互处理器中断)。 任务完成后,逻辑处理器可以返回到低功耗状态,等待下一个中断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接