内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

2024-05-21

我的问题:

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

2)为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多?

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

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


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

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

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

由于线程之间不存在这种屏障,因此一个线程可以轻松干扰(损坏)另一个线程使用的数据。

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

这主要涵盖了第一季度中几个可能令人困惑的项目。至于问题2,所问问题的答案是“不”。一般来说,由于线程不涉及(尽可能多的)保护,因此从一个线程切换到另一个线程更便宜:您不必告诉硬件(以任何方式)它不应再允许各种访问,因为线程T1 and T2具有“相同”的访问权限。然而,在进程之间切换,就像P1 and P2,你“跨越了保护屏障”,这会带来一些惩罚(实际的惩罚因硬件而异,在某种程度上还因操作系统编写者的技能而异)。

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

在 Linux 中,用户进程可以通过多种方式创建线程,包括“POSIX 线程”(pthreads)和clone致电(详情clone,这是非常灵活的,超出了这个答案的范围)。如果您想编写可移植代码,您可能应该坚持使用 pthreads。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别? 的相关文章

  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • 任何reinterpret_cast改变指针值的真实例子?

    根据 C 标准 reinterpret cast一个指针的T 到其他类型的指针Q 可以改变或不改变指针值 https stackoverflow com questions 1863069 casting via void instead
  • Java 相当于 C# 的 async/await?

    我是一名普通的 C 开发人员 但偶尔也会使用 Java 开发应用程序 我想知道 Java 中是否有相当于 C async await 的东西 简单来说 java 相当于 async Task
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • 在 C 的公共 API 函数中使用枚举参数是个好主意吗?

    我正在设计一个 C API 其中必须提供一种设置一些双值选项的方法 为了识别选项 我使用以下枚举 typedef enum OptionA OptionB Option 使用是一个好主意吗Option作为公共 API 函数中的参数类型 in
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • Visual Studio:同时调试多个项目?

    是否可以在 Visual Studio 中同时调试多个项目 我知道您可以从解决方案属性中选择多个启动项目 但是断点是如何处理的 如果两个项目使用同一个类 它的两个不同实例 并且我因其中的断点而停止 那么它只会阻止一个程序还是同时阻止两个程序
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • DirectX Vertex 中的 THE 是什么

    我知道 RHW 是倒数同质 W 但有人可以解释一下它的使用方法和作用吗 gamedev论坛上的说明post http www gamedev net topic 440283 reciprocal of homogeneous w and
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 在.NET MVC中,有没有一种简单的方法来检查我是否在主页上?

    如果用户从主页登录 我需要采取特定的操作 在我的 LogOnModel 中 我有一个隐藏字段 Html Hidden returnUrl Request Url AbsoluteUri 在我的控制器中 我需要检查该值是否是主页 在下面的示例
  • MonoMac 窗口关闭时没有错误

    我刚刚开始在 Xamarin Studio 中使用 MonoMac 并且遇到了最奇怪的问题 我有一个带有 NSButton 和 NSTextField 的窗口 至此 我已经删除了按钮上的事件处理程序 因此它不会执行任何操作 除了在单击它时突
  • 如何收集和存储tellp()、tellg()返回类型?

    我正在编写一个在文件中维护 linked list 的程序 因此 我通过使用tellp tellg 遍历文件并将其添加到特定的长整数 可以视为偏移量 以到达新位置 一个简单的例子是 long next offset sizeof long
  • 防止使用不完整类型实例化模板类

    我正在写一个库 它的布局看起来类似于 A h include
  • 如何在 C# 中使用 Selenium WebDriver 获取当前窗口的 URL?

    在我的应用程序中 登录时 它会导航到另一个页面 现在我需要在 selenium C 中使用 WebDriver 获取新的 URL 我找不到任何函数来执行此操作 我努力了driver Url driver getLocation and dr
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable

随机推荐