【问题标题】:what's the difference between the threads(and process) in kernel-mode and ones in user-mode?内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?
【发布时间】:2012-03-27 22:55:50
【问题描述】:

我的问题:

1)在现代操作系统一书中,它说线程和进程可以处于内核模式或用户模式,但没有明确说明它们之间的区别。

2)为什么内核模式线程和进程的切换比用户模式线程和进程的切换成本更高?

3) 现在,我正在学习Linux,我想知道如何在Linux 系统中分别在内核模式和用户模式下创建线程和进程?

4)在现代操作系统一书中,它说进程可能处于用户模式,但在用户模式进程中创建的线程可以处于内核模式.这怎么可能?

【问题讨论】:

  • @Anycorn,这个问题涵盖了用户和内核模式之间的区别,但它没有涵盖用户和内核级调度之间的区别,我认为这个问题正在询问(至少在第 1 部分, 2 和 3)。
  • 您的意思是内核调度,系统知道线程的存在并跟踪(Windows)与使用诸如 pthread(Linux)之类的库“手动”完成的用户调度,或在内核模式下执行的线程(驱动程序;最低限度的安全性,最低限度的保护,硬崩溃)与在用户模式下执行的线程(常规进程;正常安全,程序崩溃)?您的问题的一部分暗示了一种差异,而另一些则暗示了另一种差异。此外,linux 没有线程或每个进程一个线程或每个进程多个线程,这取决于您如何看待它。
  • 我对 Tanebaum 的书也有同样的问题。区别没有明确解释。

标签: c linux operating-system


【解决方案1】:

这里有一些术语问题更多是由于历史事故造成的。

“线程”通常是指进程中的控制线程,并且可能(在这种情况下)表示“具有自己的堆栈的任务,但它与该堆栈中的其他线程共享对不在该堆栈上的所有内容的访问。同一保护域”。

“进程”倾向于指一个独立的“保护域”,它可能(并且在这种情况下确实)能够在其中拥有多个线程。给定两个进程 P1P2P1 影响 P2 的唯一方法(反之亦然)是通过某些特定定义的“通信通道”,例如文件、管道或套接字;通过“进程间”信号,如 Unix/Linux 信号;等等。

由于线程之间没有这种屏障,一个线程很容易干扰(破坏)另一个线程使用的数据。

所有这些都独立于用户与内核,但有一个例外:在“内核”中——请注意这里隐含假设只有一个内核——您可以访问始终保持整个机器状态,以及执行任何操作的完全权限。因此,您可以故意(或在某些情况下意外)忽略或关闭硬件保护,并弄乱“属于”其他人的数据。

这主要涵盖了第一季度的几个可能混淆的项目。至于第二季度,所问问题的答案是“它没有”。一般来说,因为线程不涉及(尽可能多的)保护,所以从一个线程切换到另一个线程更便宜:您不必(以任何方式)告诉硬件它不应再允许各种访问,因为线程T1T2 具有“相同”的访问权限。然而,在进程之间切换,就像 P1P2 一样,你“越过了保护屏障”,这有一些惩罚(实际的惩罚因硬件而异扩展操作系统编写者的技能)。

还值得注意的是,从用户模式到内核模式以及反之亦然,跨越了一个保护域,这又会产生某种成本。

在 Linux 中,用户进程有多种方法可以创建线程数量,包括“POSIX 线程”(pthreads)和clone 调用(clone 的详细信息非常灵活,超出了这个答案的范围)。如果你想编写可移植的代码,你可能应该坚持使用 pthreads。

在 Linux 内核中,线程的处理方式完全不同,您需要 Linux 内核文档。

我无法正确回答 Q4,因为我没有这本书,也不确定他们在这里指的是什么。我的猜测是,它们的意思是,每当任何用户进程或线程进行“系统调用”(从操作系统请求某些服务)时,这都会越过用户/内核保护屏障,然后由内核来验证用户代码对该操作具有适当的权限,然后执行该操作。执行此操作的内核部分在内核级保护下运行,因此需要更加小心。

某些硬件(如今大多已过时)拥有(或拥有)不止两个级别的硬件提供的保护。在这些系统上,“用户进程”具有最少的直接特权,但在这些系统之上,您会发现“执行模式”、“系统模式”和(最高特权的)“内核”或“核心”模式。这些旨在降低穿越各种保护障碍的成本。在“执行”中运行的代码无法完全访问机器中的所有内容,因此它可以,例如,假设用户提供的地址是有效的,并尝试使用它。如果该地址实际上是无效的,则异常将上升到下一个更高级别。只有两个级别——“用户”,非特权;和“内核”,完全特权——内核代码必须非常仔细地编写。但是,如今可以以低成本提供“虚拟机”,这几乎已经过时了对多个硬件级别保护的需求。一个人只需编写一个真正的内核,然后让它以他们“认为”的“内核模式”运行其他东西。这就是 VMware 和其他“管理程序”系统所做的。

【讨论】:

    【解决方案2】:

    用户模式线程由进程中的某些东西在用户模式下调度,而进程本身是唯一由内核调度程序处理的事情。

    这意味着您的进程会从 CPU 获得一定数量的 grunt,您必须在所有用户模式线程之间共享它。

    简单的例子,你有两个进程,一个有一个线程,一个有一百个线程。

    采用简单的内核调度策略,单线程进程中的线程获得50%的CPU,百线程进程中的每个线程获得0.5%。

    使用内核模式线程,内核本身管理您的线程并独立调度它们。使用相同的简单调度程序,每个线程将只获得不到 1% 的 CPU grunt(101 个线程共享 100% 的 CPU)。

    就为什么内核模式切换更昂贵而言,这可能与您需要切换到内核模式才能做到这一点有关。用户模式线程(显然)在用户模式下完成所有工作,因此内核不会参与线程切换操作。

    在 Linux 下,您可以使用 clone 调用创建线程(和进程),类似于 fork,但可以更好地控制事物。

    你的最后一点有点迟钝。我不能确定,但​​它可能是在谈论用户和内核模式,因为一个可能正在执行用户代码,另一个可能正在内核中进行一些系统调用(这需要切换到内核或主管模式)。

    这与讨论线程支持(用户或内核模式对线程的支持)时的区别不同。如果手头没有这本书的副本,我无法肯定地说,但这是我最好的猜测。

    【讨论】:

    • Linux下fork()创建的进程和pthread创建的线程都是Kernel模式?我看到有人回答说Linux中的任务调度是线程级别的,与进程无关。你怎么看?谢谢你的回答!
    • @city:是的,Linux 内核调度线程,而不是进程(它具有内核模式线程支持而不是用户模式)。线程组和线程组领导者存在诡计,使其看起来像用户态进程存在,但它都是烟雾和镜子:-) 请参阅stackoverflow.com/questions/4862012/…
    猜你喜欢
    • 2013-07-05
    • 2020-12-28
    • 2010-09-17
    • 2016-07-31
    • 1970-01-01
    • 2011-02-02
    • 2014-03-20
    相关资源
    最近更新 更多