什么';s C#螺纹类型?

什么';s C#螺纹类型?,c#,.net,multithreading,winapi,C#,.net,Multithreading,Winapi,在三种类型的线程(内核级、用户级和混合型)之间,C#(或更一般的.NET)使用哪种类型?内核线程(1:1) 术语“内核线程”可以用来指完全在内核空间中运行的实际线程,也可以指由内核调度的用户空间线程。术语“内核支持的”线程是指后者,即在用户空间中运行但由内核促进的线程,这通常意味着内核对其进行调度 内核线程具有特权,可以访问用户模式线程不受限制的内容。看看维基百科上的“”。在Windows上,用户模式对应于环3,而内核模式对应于环0 用户级线程(N:1) “用户级线程”通常指用户空间可见的线程。

在三种类型的线程(内核级、用户级和混合型)之间,C#(或更一般的.NET)使用哪种类型?

内核线程(1:1) 术语“内核线程”可以用来指完全在内核空间中运行的实际线程,也可以指由内核调度的用户空间线程。术语“内核支持的”线程是指后者,即在用户空间中运行但由内核促进的线程,这通常意味着内核对其进行调度

内核线程具有特权,可以访问用户模式线程不受限制的内容。看看维基百科上的“”。在Windows上,用户模式对应于环3,而内核模式对应于环0

用户级线程(N:1) “用户级线程”通常指用户空间可见的线程。也就是说,当调用线程标准的“创建线程”函数时创建的内容。通常,术语“用户级线程”用于表示由应用程序代码创建的线程,而不管系统如何实现它。它可能是一个纯用户空间线程,几乎没有内核支持,也可能是由内核调度的线程

混合线程(M:N)[维基百科] M:N将一些M个应用程序线程映射到一些N个内核实体或“虚拟处理器”。这是内核级(“1:1”)和用户级(“N:1”)线程之间的折衷。通常,“M:N”线程系统比内核或用户线程更复杂,因为需要更改内核和用户空间代码。在M:N实现中,线程库负责在可用的可调度实体上调度用户线程;这使得线程的上下文切换非常快,因为它避免了系统调用

.Net线程是使用Win32 API的用户级线程,并将其包装为一个漂亮的框架!
详情请参阅:

    • 这不取决于C本身,而取决于运行时CLR

      .Net可被视为支持两种模式:

      • 仅限用户土地调度(或)。在这种模式下,一个用户land线程可以执行上下文切换到另一个用户模式线程,而无需实际更改内核线程。这种模式增加了大量的编码开销,但在内核级上下文切换中节省了宝贵的10-20微秒
      • 混合动力车型(目前最受欢迎)。在此模型中,托管代码需要访问内核,例如读取文件。通过一组API,代码执行从用户land.NET调用进入Windows API,进入内核、驱动程序、HAL层和物理驱动器。然后返回调用堆栈获取数据。如果上下文切换是由线程调度器启动的,那么用户线程和内核线程将被更改
      不允许直接内核模式线程,因为托管代码没有在内核模式下运行的权限。它只能调用windowsapi,而windowsapi又会切换到内核模式


      如果使用
      线程
      任务
      线程池
      -CLR使用混合模型。使用混合模型是因为CLR创建托管对象来表示该类。任何托管代码都在用户区域中运行。然而,每一个不是作为fibber创建的线程(见下文),不管它是否在线程池中,都有底层的内核数据结构。内核数据结构用于保存线程的内核状态—内核线程id、创建和退出时间、进程id、开始线程地址、安全访问令牌、十几个计时器、CPU寄存器、内核堆栈等。所有这些都需要在上下文切换期间更新,但我们只需要花费大约10-20*10^-6秒的时间

      如果您使用围绕UMS的C++调用包(如许多其他),则CLR尝试使用UMS模式。但这只适用于您专门手动操作的少数线程。您的应用程序仍将使用混合模型,在用户模式下,只有几个手动拾取的线程(光纤)将在彼此之间手动生成。但即使在这种模式下,OS任务调度器也会在某个时刻启动内核线程切换,所以您不会永远执行UMS调度的线程

      为了完整起见

      • 内核模式调度是一种非常低级的机制,只能从内核访问。这意味着,只有在开发操作系统内部构件或某种驱动程序时,才能使用它。这样的调度很难使用,任何错误都会导致整个操作系统冻结/卡住/崩溃/下单或转换到任何其他不可预测的状态。内核级线程需要大量的开发和测试工作。例如,Windows任务调度器或内存管理服务使用内核模式调度。您能想象一下,为了使这些组件在一个高度多线程的环境中保持稳定,编写这些组件需要多少时间吗

      相关:@MichaelPerrenoud-问题本身就是一句话,michael!你说.net的线程类使用用户级线程。混合线程如何?谢谢你的努力,我的意思是当我从.net的线程类创建实例时,哪些模型是有效的?如果我创建多个线程类实例,混合模型是有效的还是用户级的?这样说吧。如果我运行一个创建1000(额外)个线程的C#应用程序,任务管理器会显示该应用程序有1001个线程。我认为.net使用混合模型,我的意思是,当我从.net中的Thread对象创建实例时,这些模型中的哪一个有效?你能为我们提供一个参考吗?