【发布时间】:2023-03-06 10:52:01
【问题描述】:
.NET 线程是轻量级用户模式线程还是内核模式操作系统线程?
另外,除了 SQL Server,.NET 线程和操作系统线程之间是否存在一一对应关系?
我也很感兴趣,因为 Thread 类有一对对称的方法,名为 BeginThreadAffinity 和 EndThreadAffinity,其文档巧妙地表明 .NET 线程是对真实操作系统线程的轻量级抽象。
另外,我不久前在一些堆栈溢出线程本身上读到,微软试图在 CLR 中保持这种分离,就像 SQL Server 所做的那样。我记得有一些项目正在为此使用 Fiber API,但我不能说我理解了我所读内容的所有细节。
我想要一些关于这个主题的更详细的文献,例如 .NET 线程的内部结构与 Windows 创建的线程的内部结构。虽然有大量关于 Windows 创建的线程结构的信息,但 Jeffrey Richter 的 Advanced Windows Programming 书就是其中的来源之一,例如,我找不到任何专门介绍内部线程的文献.NET 线程的结构。
有人可能会争辩说,此信息可在 .NET 源代码中获得,该源代码现已公开,或者使用诸如 Reflector 或 IL Spy 之类的反汇编程序,但我没有看到任何代表线程控制块 (TCB ) 和程序计数器 (PC) 和堆栈指针 (SP) 或线程的等待队列,或线程当前属于 Thread 类的队列列表。
我在哪里可以阅读到这方面的信息?文档中是否提到了其中任何一个?我已经阅读了所有these pages from the MSDN,但他们似乎没有提及。
【问题讨论】:
-
在普通的桌面应用程序和 Web 应用程序中,一个 .NET 线程对应一个操作系统线程,至少在 Windows 上是这样。在 SQL CLR 托管世界中,这不一定是真的,而且我不知道在其他平台上运行的 .NET 核心运行时。我不认为 .NET 线程被记录为对应于 os 内核线程,这很可能只是一个实现细节。
-
@LasseV.Karlsen 非常感谢。
-
@WaterCoolrv2 虽然安迪的回答是正确的,但它没有回答。问题的第一部分。在这里查看更详细的答案*.com/questions/49524899/…
标签: c# .net multithreading clr