不同操作系统使用哪些多线程方法以及它们为何重要:
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(Solaris v9 之前的版本)使用多对多
为什么它们很重要?
- 响应能力 - 在一个线程中浏览网页,在其中加载图像 另一个
- 资源共享 - 允许多个事件线程同时进行 地址空间
- 经济 - 用于进程创建的内存和资源是 线程共享进程资源时成本高昂(Solaris 是 30 倍) 创建过程比线程慢)
- 可扩展性 - 在多处理器中,线程可以在不同的处理器上并行运行, 单线程进程只能在一个处理器上运行,无论 存在多少个处理器
请您参考如下方法:
问题不在于什么操作系统使用什么模型。 如果用户应用程序使用线程(或类似的东西),这些线程可以以不同的方式映射到内核进程。如果反过来,操作系统提供线程(大多数操作系统都提供线程,其中包括您指定的操作系统),那么用户可见线程可能与内核线程相同。 但是,我始终可以使用选择不同映射的库/运行时系统(vm)/编译器。
在某些情况下会出现差异。例如,假设所有用户可见的线程都是由作为单个进程/线程运行的运行时系统模拟的。在这种情况下,诸如lock
之类的系统调用可能会阻塞该内核进程,从而阻塞该应用程序的所有用户线程。为了避免这种情况,运行时通常会拦截某些调用并关心自己。
这是一般情况。详细来说,可能会稍微复杂一些。例如,如果您编写使用 GUI 的 WIndows 程序,则必须了解编程模型,尤其是与事件循环相关的内容。此外,除了进程和线程之外,Windows 还提供作业和纤程作为执行单元(或更准确地说:考虑进行调度和资源管理的实体)。