多线程Linux与Windows One

多线程Linux与Windows One,windows,linux,multithreading,ubuntu,windows-7,Windows,Linux,Multithreading,Ubuntu,Windows 7,不同的操作系统使用哪些多线程方法?它们为什么重要: Multithreading Models Many-to-One - many user threads to one kernel thread One-to-One - each user thread is mapped to a kernel thread Many-to-Many - Many user threads to smaller or equal # of kernel threads 这就是

不同的操作系统使用哪些多线程方法?它们为什么重要:

Multithreading Models

    Many-to-One - many user threads to one kernel thread
    One-to-One - each user thread is mapped to a kernel thread
    Many-to-Many - Many user threads to smaller or equal # of kernel threads
这就是我对多线程模型的了解

  • Solaris使用多对一
  • Linux和Windows系列(至少到XP,不确定Win7)使用一对一
  • IRIX、HP-UX和Tru64 UNIX(v9之前的Solaris)使用多对多
为什么它们很重要

  • 响应性-在一个线程中浏览网页,在 另一个
  • 资源共享-允许在同一个线程中执行多个活动 地址空间
  • 经济性-创建进程所需的内存和资源 线程共享进程资源时成本高昂(Solaris是30倍 创建进程比线程慢)
  • 可伸缩性-在多处理器中,线程可以在不同的处理器上并行运行, 单线程进程只能在一个处理器上运行,而不考虑 有多少个处理器

  • 问题不是,什么操作系统使用哪种模型如果用户应用程序使用线程(或类似的东西),这些线程可以以不同的方式映射到内核进程。反过来,如果操作系统提供线程(其中大多数是您指定的操作系统),那么用户可见线程可能与内核线程相同。 但是,我始终可以使用选择不同映射的库/运行时系统(vm)/编译器

    在某些情况下会出现差异。例如,假设所有用户可见的线程都是由作为单个进程/线程运行的运行时系统模拟的。在这种情况下,像
    lock
    这样的系统调用可能会阻塞这个内核进程,从而阻塞该应用程序的所有用户线程。为了避免这种情况,运行时通常会截取cerain调用并关心自己


    这是一般情况。具体来说,它可能更复杂一些。例如,如果您编写了一个使用GUI的WIndows程序,您必须了解编程模型,尤其是与事件循环相关的内容。此外,除了进程和线程之外,Windows还提供作业和光纤作为执行单元(或者更准确地说,是用于调度和资源管理的实体)。

    回答了自己的问题,编辑了原始内容:

    这就是我对多线程模型的了解

    Solaris使用多对一 Linux和Windows系列(至少到XP,不确定Win7)使用一对一 IRIX、HP-UX和Tru64 UNIX(v9之前的Solaris)使用多对多 为什么它们很重要

    响应性-在一个线程中浏览网页,在另一个线程中加载图像 资源共享-允许在同一地址空间中有多个活动线程 经济性—当线程共享进程资源时,创建进程的内存和资源非常昂贵(Solaris创建进程的速度比线程慢30倍)
    可伸缩性-在多处理器中,线程可以在不同的处理器上并行运行,无论存在多少个处理器,单线程进程只能在一个处理器上运行

    +1是-这是“用户空间线程”的大问题-任何可能阻塞的API调用都必须由用户线程管理器中的状态机“模拟”,以防止调用阻塞运行光纤的内核线程。这通常非常困难/不可能(例如,如果API没有非阻塞版本)。此问题也适用于用户空间线程可能调用的任何库。这一切都是如此混乱、约束和僵化,以至于我不知道有谁会使用“用户空间线程”。我当然不会。我对Linux的最新版本不太熟悉,但按照以前的工作方式,我不会说“内核线程”。更像是,有一个线程,当程序执行系统调用时,它可以进入内核模式,当系统调用完成时,它可以从内核模式返回到用户模式,等等,“内核线程”意味着其他的东西——一个在内核模式下花费100%时间的线程,并且没有直接参与任何特定的用户模式线程或进程。