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

Pan*_*der -3 c assembly operating-system kernel multiprocessing

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

首先,如何创建可在多处理器系统中运行的程序.它是硬件导向还是程序员特定的?

其次,我学习了并行编程语言,这在多处理系统中很有用,其中Java是一个但C不是.那么在C(Windows)中开发的操作系统如何才能实现多处理?

谢谢.

Joh*_*ger 5

你是对的:一个典型的C程序是单处理器.您在其中编写的语句应该一个接一个地执行,遵循所需的循环和测试.但是你可以在C中调用一个函数,说"现在不执行这个函数:创建一个新的Thread并用它执行它!"

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()
Run Code Online (Sandbox Code Playgroud)

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

但我的函数StartThread()告诉操作系统在函数上创建一个新的执行线程CalculatePi(),然后立即返回.这意味着main()可以开始重复打印出piDigits更大的值.现在有两个执行线程:一个计算pi的数字,另一个打印出它有多远.

该程序适用于任何多线程操作系统,即使是仅使用单个处理器运行的操作系统.在这种情况下,每个线程在交换到另一个线程之前将获得一点处理器时间.如果计算机有多个处理器,操作系统可能会将一个线程交给另一个 - 另一个线程 - 程序不关心或(通常)知道.

但是,并行编程语言的编写使您无需像这样显式创建新的执行线程.语言的语法和设计使得任务可以同时运行变得很明显.C不是那样的,但你仍然可以利用特殊函数调用的并发性.

  • 使用OpenMP*的C就像那样.在`for`循环之前的行上的`#pragma omp parallel`将与工作线程并行化. (2认同)

Cli*_*ord 5

如果系统级语言本质上支持多线程,那么您首先使用什么语言来实现多线程支持?

它是一种操作系统,支持多线程和跨核心的线程分配.直接支持多线程的语言在操作系统的支持下完成.

C是系统级语言,因此可用于编写操作系统.它没有对多线程的内在支持 - 这将是鸡/蛋的情况.代替OS开发者可能使用C和一定一些汇编访问需要支持多线程/多任务/多处理非存储器映射的处理器资源执行多线程/多处理支持.

给定具有多线程支持的操作系统,使用 C语言编写的应用程序级代码,如果没有对多线程的内在支持,仍然可以通过访问OS API支持来实现多线程.最终,这就是具有内在支持线程的高级语言在任何情况下都支持它 - 通过生成访问OS API的代码.

例如,多线程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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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