我正在尝试开发一个简单的操作系统。到目前为止,我开发的所有程序都可以在一个处理器中运行。但当我通过一个名为多处理系统的概念时,几乎所有的最新系统都基于这个概念,我有很多疑问。
首先,如何创建可在多处理器系统中运行的程序。它是硬件导向还是程序员特定的?
其次,我学习了并行编程语言,这在多处理系统中很有用,其中Java是一个但C不是。那么在C(Windows)中开发的操作系统如何才能实现多处理?
感谢。
答案 0 :(得分: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()
如果您使用旧代码执行此代码,而不使用我的(虚构)函数StartThread()
,程序将挂起很长时间,然后在完成时打印出2000000000。
但我的函数StartThread()
告诉操作系统在函数CalculatePi()
上创建一个新的执行线程,然后立即返回。这意味着main()
可以在piDigits
变大时重复打印出IBOutlets
的值。现在有两个执行线程:一个计算pi的数字,另一个打印出它有多远。
该程序适用于任何多线程操作系统,即使只有一个处理器运行的操作系统。在这种情况下,每个线程在交换到另一个线程之前将获得一点处理器时间。如果计算机有多个处理器,操作系统可能会将一个线程交给另一个,另一个线程 - 程序不关心或(通常)知道。
然而,并行编程语言的编写使得您不必显式创建新的执行线程。语言的语法和设计使得任务可以同时运行变得很明显。 C不是那样的,但你仍然可以利用特殊函数调用的并发性。答案 1 :(得分:5)
如果系统级语言本质上支持多线程,那么您首先使用什么语言实现多线程支持?
操作系统为多线程和跨核心的线程分配提供支持。直接支持多线程的语言在操作系统的支持下完成。
C是系统级语言,因此可用于编写操作系统。它没有对多线程的内在支持 - 这将是鸡/蛋的情况。相反,操作系统开发人员可能会使用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
}
}
关键在于,虽然C和C ++等系统级语言没有对线程的内在支持(因为它们习惯于实现它),但它们可以通过库无限扩展,所以语言对任何功能的支持很少是一个问题。实际上,C ++ 11标准库包括通过std::thread
类支持线程,因此在该语言中至少存在一种使用多线程的独立于操作系统的方法 - 但实现仍然依赖于操作系统支持。同样,还存在用于多线程的跨平台C库,例如pthread,它支持跨多个支持多线程的系统的可移植性。
多线程本身并不意味着或需要多处理,但它是利用具有多个执行单元的系统(无论是超线程,内核还是实际处理器)和应用程序的最常用方式当应用程序是多线程时,性能可以很好地从单核到多核。而且,多线程并不是在多个执行单元上执行代码的唯一方法;并行处理可能意味着比简单线程更精细的并发级别。 OpenMP是一组编译器指令和库例程,由许多C,C ++和Fortran编译器支持,它们支持代码并行性,而不仅仅是线程。