多线程模型概念

时间:2020-12-27 20:53:00

标签: multithreading operating-system

我正在阅读关于操作系统的恐龙书,我对多线程模型有疑问。


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

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

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

1 个答案:

答案 0 :(得分:-1)

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

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

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

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

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

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

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

用户模式代码和内核模式代码之间的这种分离是在不同级别完成的。您可以在页表中设置某些位来指定页到页的访问级别。您也可以通过设置 IDT 中的某些位来指定中断的访问级别。所有这些都在操作系统启动时完成。

相关问题