问题 低级编程:操作系统如何启动新的线程/进程?


每当引导程序加载操作系统时,可能只有一个程序流处于活动状态,对吧?这意味着,一个处理器保存指令指针并执行它在EIP寄存器指向的位置处发现的命令。此时,系统如何开始利用更多进程和/或线程(没有用户态线程,但是cpu线程)?


1614
2018-04-12 13:14


起源



答案:


操作系统将以特殊角色启动(在BIOS和引导加载程序完成之后) - 因为运行它的第一个程序将直接访问所有CPU命令。

因此,它将设置系统的各个部分 - 如设置 中断处理程序 (或中断服务程序)。完成此操作后,它可以创建“调度程序”。

实际的“进程/线程”处理将由此调度程序完成。它决定了哪些线程将被运行。它还管理所有活动线程。 CPU没有意识到所有这些事情。

一旦调度程序的主执行程序决定执行线程(或“进程”)A,它就会将进程数据复制到寄存器中(并将寄存器存储到最近运行的线程的InfoBlock中)。它将告诉CPU /定时器导致中断 ñ 微秒(或其他时间单位)。然后它将告诉cpu在非OS模式下运行“程序”(CPU唯一知道的事情)(这样它就不会在未经许可的情况下修改关键数据或注册自己的中断处理程序)。

当线程A正在执行时,硬件计时器将运行。一旦达到所需的时间偏移,就会导致中断。然后硬件将停止执行当前程序,并将调用注册的程序 Interrupt Handler 而是哪个。这个处理程序将是调度程序的一个方法(确切地说是主执行程序)。

然后,此方法将再次重新评估应调度哪个线程,以便继续调度。


5
2018-04-12 13:42



谢谢你的解释。你能告诉我当涉及几个独立的处理器/核心时这个画面是如何变化的吗? - prinzdezibel
大多数多核具有至少一些“主”处理器(参见其他答案) - 如果没有一些集中管理,L1 +缓存将无法工作。调度程序只需为每个寄存器操作寻址所需的处理器。其他一切保持不变(固定间隔计时器)。 - Marcel Jackwerth
@prinzdezible:当通过中断或通过系统调用停止当前线程时,OS调度程序通常在每个CPU内核上运行。为了可以扩展到许多核心,它不会查看所有线程,而只查看分配给该CPU的线程。如果它太忙,它会将线程推送到其他CPU。如果它不忙,它将从其他CPU拉出线程。每隔一段时间或一些计数器,调度程序就会在所有CPU上负载均衡任务(这很慢,所以不经常) - Zan Lynx


答案:


操作系统将以特殊角色启动(在BIOS和引导加载程序完成之后) - 因为运行它的第一个程序将直接访问所有CPU命令。

因此,它将设置系统的各个部分 - 如设置 中断处理程序 (或中断服务程序)。完成此操作后,它可以创建“调度程序”。

实际的“进程/线程”处理将由此调度程序完成。它决定了哪些线程将被运行。它还管理所有活动线程。 CPU没有意识到所有这些事情。

一旦调度程序的主执行程序决定执行线程(或“进程”)A,它就会将进程数据复制到寄存器中(并将寄存器存储到最近运行的线程的InfoBlock中)。它将告诉CPU /定时器导致中断 ñ 微秒(或其他时间单位)。然后它将告诉cpu在非OS模式下运行“程序”(CPU唯一知道的事情)(这样它就不会在未经许可的情况下修改关键数据或注册自己的中断处理程序)。

当线程A正在执行时,硬件计时器将运行。一旦达到所需的时间偏移,就会导致中断。然后硬件将停止执行当前程序,并将调用注册的程序 Interrupt Handler 而是哪个。这个处理程序将是调度程序的一个方法(确切地说是主执行程序)。

然后,此方法将再次重新评估应调度哪个线程,以便继续调度。


5
2018-04-12 13:42



谢谢你的解释。你能告诉我当涉及几个独立的处理器/核心时这个画面是如何变化的吗? - prinzdezibel
大多数多核具有至少一些“主”处理器(参见其他答案) - 如果没有一些集中管理,L1 +缓存将无法工作。调度程序只需为每个寄存器操作寻址所需的处理器。其他一切保持不变(固定间隔计时器)。 - Marcel Jackwerth
@prinzdezible:当通过中断或通过系统调用停止当前线程时,OS调度程序通常在每个CPU内核上运行。为了可以扩展到许多核心,它不会查看所有线程,而只查看分配给该CPU的线程。如果它太忙,它会将线程推送到其他CPU。如果它不忙,它将从其他CPU拉出线程。每隔一段时间或一些计数器,调度程序就会在所有CPU上负载均衡任务(这很慢,所以不经常) - Zan Lynx


正确,在引导过程中只有一个执行线程。通常情况是这样,直到OS初始化到低级别内存管理,调度程序等功能的程度。

在多CP​​U系统中甚至就是这种情况 - 一个核心是处理早期启动的“主处理器”,直到基础设施开始启动其他核心。

最后,它是高度针对特定操作系统的;该 英特尔架构软件开发人员手册 有硬件规格的详细信息。 (假设您正在谈论英特尔架构;其他架构可能会有很大不同。)


4
2018-04-12 13:27





(多线程)操作系统必须首先启动的是调度程序,它负责管理多个进程(因此也管理多个CPU线程,例如在多核机器上)。

此调度程序启动的第一个进程通常是某种“初始化”进程,后者又负责随后加载其他程序/进程。


3
2018-04-12 13:25