Linux 中线程会互相中断吗?

Linux 中线程会互相中断吗?

我正在学习多线程的关键部分。我有一个一般性的声明:

在单CPU系统中,禁用中断是一种竞争条件的解决方案。

但我也从另一个网站了解到

线程通常不会互相中断。

那么如何禁用中断来防止竞争条件呢?这可以用 Linux 来解释吗?

答案1

第一种说法是正确的,但它在 Linux 或任何系统上都没有意义。这是因为大多数驱动程序或硬件处理都是通过中断完成的,不可能以不同的方式进行。例如,如果有数据包从网络到达,CPU 将通过网卡发起的中断得知该数据包。

但这些中断对于用户空间进程来说是不可见的,并且不会影响它们。

除了罕见的、典型的嵌入式场景之外,没有中断处理的 Linux 工作。

可能导致竞争条件的是上下文切换,即内核是否将 CPU 从某个进程中夺走并将其交给另一个进程。它通常是通过定时器中断发生的。如果只有一个进程运行,或者整个调度程序以某种方式关闭(也许在某些嵌入式环境中是可能的,但非常不典型),那么这种情况就不会发生,并且您有一个类似于 DOS 的单进程系统。确实,因为不存在多任务处理,所以不可能出现竞争条件。

在多CP​​U系统中,如果多个CPU同时处于活动状态,则也有可能出现竞争条件,因为即使没有活动的调度程序,多个线程也可以同时运行。请注意,这种情况对于 Linux(或任何非嵌入式操作系统)来说也是非常陌生的。


第二句话“线程不会互相中断”主要是正确的。线程本质上是进程,使用相同的地址空间。多个线程通常不会互相中断。也许他们可以互相发送信号,但仅此而已。该声明独立于前一个声明。

相关内容