编程语言如何实现多处理?

How can Multiprocessing be achieved by Programming Languages?

我正在尝试开发一个简单的操作系统。到目前为止,我开发的所有程序都可以 运行 在单个处理器中。但是当我经历了一个几乎所有最新系统都基于的名为多处理系统的概念时,我产生了很多疑问。

首先,我如何创建一个可以在多处理器系统中 运行 的程序。它是面向硬件的还是特定于程序员的?

其次,我学习了并行编程语言,这对 Java 是一种但 C 不是的多处理系统很有帮助。那么用C(Windows)开发的OS如何实现Multiprocessing呢?

谢谢。

你是对的:典型的 C 程序是单处理器的。您在其中编写的语句应该一个接一个地执行,并根据需要服从循环和测试。但是你可以在 C 中调用一个函数 "don't execute this function now: create a new Thread and execute it with that!"

int maxPlaces;
int piDigits;

void CalculatePi() {
   // write code to calculate pi to maxPlaces
      // Update piDigits as you go
} // CalculatePi()

int main() {
   maxPlaces = 2000000000;
// CalculatePi(); // OLD CODE: Don't do this! Instead, do...
   StartThread(CalculatePi);
   while (piDigits<=maxPlaces) {
       Print(piDigits);
   } // while
} // main()

如果您使用旧代码执行此代码,而不使用我的(编造的)函数 StartThread(),程序将挂起很长时间,然后在完成时打印出数字 2000000000。

但是我的函数 StartThread() 告诉 OS 在函数 CalculatePi() 上创建一个新的执行线程,然后立即 return。这意味着 main() 可以开始重复打印出 piDigits 的值,因为它变大了。现在有两个执行线程:一个计算 pi 的数字,另一个打印它已经走了多远。

该程序可以在任何多线程 OS 上运行,即使那些 运行 只有一个处理器。在那种情况下,每个线程在交换到另一个线程之前都会获得一点处理器时间。如果计算机有多个处理器,OS 可能将一个线程分配给一个线程,将另一个线程分配给另一个——程序不关心或(通常)知道。

然而,并行编程语言的编写使得您不必像这样显式地创建新的执行线程。该语言的语法和设计使得任务可以同时 运行 变得显而易见。 C 不是那样,但您仍然可以利用特殊函数调用的并发性。

如果系统级语言本质上支持多线程,您会首先使用哪种语言实现多线程支持?

是操作系统提供了对多线程和线程跨内核分布的支持。直接支持多线程的语言在 OS.

的支持下这样做

C 是一种系统级语言,因此可用于编写 操作系统。它没有对多线程的内在支持——那将是 chicken/egg 的情况。相反,OS 开发人员会实现 multi-threading/multi-processing 支持,也许使用 C 和必要的一些汇编程序来访问支持 multi-threading/multi-tasking/multi-processing.

所需的非内存映射处理器资源

给定一个支持多线程的操作系统,应用程序级代码用诸如 C 之类的语言编写而没有对多线程的内在支持,仍然可以通过访问多线程OS API 支持它。最终,这就是高级语言 with 对线程的内在支持在任何情况下都支持它的方式 - 通过生成访问 OS API.[=12= 的代码]

例如,多线程 C 代码可能如下所示(简化的伪代码):

#include <os_api.h>

void thread1()
{
    for(;;)
    {
        // do stuff
    }
}

void thread2()
{
    for(;;)
    {
        // do stuff
    }
}

int main()
{
    OS_BeginThread( thread1 ) ;
    OS_BeginThread( thread2 ) ;
    for(;;)
    {
        // do stuff
    }
}

关键在于,虽然系统级语言(例如 C 和 C++)不具备对线程的内在支持(因为它们用于实现),但它们是可以无限扩展的通过图书馆,所以对任何功能的语言支持很少有问题。事实上,C++11 标准库包括通过 std::thread class 对线程的支持,因此在该语言中至少有一个 OS 独立的使用多线程的方法——但是实现仍然依赖于操作系统的支持。同样,还有用于多线程的跨平台 C 库,例如 pthreads,它提供了一定程度的跨系统可移植性,支持多线程。

当然,多线程本身并不意味着或需要多处理,但它是利用具有多个执行单元(无论是超线程、内核还是实际处理器)的系统的最常用方法,当应用程序是多线程时,应用程序性能可以从单核扩展到多核。此外,多线程并不是在多个执行单元上执行代码的唯一方式。并行处理可能意味着比简单线程更细粒度的并发级别。 OpenMP 是一组编译器指令和库例程,受许多 C、C++ 和 Fortran 编译器的支持,它们以比仅线程更细的粒度支持代码并行性。