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

Multithreading 低级编程:操作系统如何启动新的线程/进程?,multithreading,operating-system,process,cpu,low-level,Multithreading,Operating System,Process,Cpu,Low Level,每当引导加载程序加载操作系统时,大概只有一个程序流处于活动状态,对吗?这意味着,一个处理器持有指令指针,并在EIP寄存器指向的位置执行它找到的命令。在哪一点上,系统如何开始利用更多进程和/或线程(不是用户线程,而是cpu线程)?一个(多线程)操作系统必须首先启动的事情之一是负责管理多个进程(因此也管理多个cpu线程,例如在多核机器上)的调度程序 此计划程序启动的第一个进程通常是某种“init”进程,该进程随后负责加载其他程序/进程。正确,在启动过程中只有一个执行线程。通常情况下,直到操作系统已初

每当引导加载程序加载操作系统时,大概只有一个程序流处于活动状态,对吗?这意味着,一个处理器持有指令指针,并在EIP寄存器指向的位置执行它找到的命令。在哪一点上,系统如何开始利用更多进程和/或线程(不是用户线程,而是cpu线程)?

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


此计划程序启动的第一个进程通常是某种“init”进程,该进程随后负责加载其他程序/进程。

正确,在启动过程中只有一个执行线程。通常情况下,直到操作系统已初始化到低级别内存管理、调度程序等正常工作时,才会出现这种情况

甚至在多CPU系统中也是如此——一个核心是“主处理器”,负责处理早期启动,直到基础设施启动其他核心

最终,它是高度特定于操作系统的;本手册提供了硬件规格的详细信息。(假设您谈论的是英特尔体系结构;其他体系结构可能大不相同。)

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

因此,它将设置系统的各个部分,如设置(或中断服务例程)。完成此操作后,它能够创建一个“调度器”

实际的“进程/线程”处理将由该调度程序完成。它决定将运行哪些线程。它还管理所有活动线程。CPU不知道所有这些事情

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

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


然后,此方法将再次评估应调度的线程,因此调度将继续。

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