Multithreading 多线程模型概念

Multithreading 多线程模型概念,multithreading,operating-system,Multithreading,Operating System,我在读操作系统方面的恐龙书,我对多线程模型有疑问 第1行:在内核之上支持用户线程,并且在没有内核支持的情况下管理用户线程 第2行:多对一模型将多个用户级线程映射到一个内核线程 我的问题是,映射用户级线程和内核级线程需要什么?我不完全理解你的问题。在x86 CPU上运行的现代操作系统中,没有真正的内核线程。操作系统大多是中断驱动的 例如,在Linux上有systemd,它作为内核的第一个进程运行。然后systemd查看其“单元”,这些单元是允许指定下一步运行的配置文件。它负责向您展示著名的用户G

我在读操作系统方面的恐龙书,我对多线程模型有疑问


第1行:在内核之上支持用户线程,并且在没有内核支持的情况下管理用户线程

第2行:多对一模型将多个用户级线程映射到一个内核线程


我的问题是,映射用户级线程和内核级线程需要什么?

我不完全理解你的问题。在x86 CPU上运行的现代操作系统中,没有真正的内核线程。操作系统大多是中断驱动的

例如,在Linux上有systemd,它作为内核的第一个进程运行。然后systemd查看其“单元”,这些单元是允许指定下一步运行的配置文件。它负责向您展示著名的用户GUI界面。因此,您有一个目标文件,其中指定了在系统启动时应运行的几个单元

在启动时,内核将初始化很多东西,然后启动systemd。systemd进程本身是一个用户模式进程,它将在文件系统的预定义目录中查找单元文件。然后它将运行units文件中指定的内容。由于systemd是用户模式进程,因此所有运行的进程都是用户模式进程

其工作原理是内核将为计时器中断设置处理程序。它将启动计时器,计时器将倒计时到0。计时器随后将引发一个中断,该中断将启动一个处理程序。该处理程序将在内核中调用schedule()。schedule函数将确定下一步要运行的进程,并重新安排计时器

不能有用户线程运行在一个内核线程之上,而这需要始终运行一个内核线程。这是不可能的,尤其是在只有一个核心的系统上

当您启动一个可执行文件时,您正在使用的GUI界面或命令行正在内核代码中进行系统调用,该内核代码在编译期间或启动前已被动态链接。系统调用使用sysenter特殊x86指令跳转到特殊寄存器中指定的地址。引导后无法设置此寄存器。这提供了安全性,因此用户模式进程在使用
int 0x80
进行系统调用时无法更改将运行的指令。一旦进入内核模式,代码就可以访问所有硬件和所有指令

我们通过这样做实现的是安全。因为用户模式进程不能仅仅决定销毁系统或运行它想要的任何内核代码。如果用户模式进程试图运行内核代码,它将受到sysenter指令的限制,sysenter指令提供了从用户模式运行内核代码的软件接口。尽管恶意的用户模式代码会造成很大的危害,但它不能运行任何内核代码


用户模式代码和内核模式代码之间的这种分离是在不同的级别上完成的。您可以在页对页的基础上指定访问级别,并在页表中设置某些位。您还可以通过在IDT中设置某些位来指定中断的访问级别。所有这些都是由操作系统在引导时完成的。

不久前我回答了一个类似的问题,看看是否有帮助:。