线程的并发执行是由多处理器或操作系统调度来实现的。windows和linux都在内核中提供线程支持,有多处理器或调度来实现并发。用户实际使用线程并不是内核线程,而是存在于用户态的用户线程。用户线程并不一定在操作系统内核里对应同等数量的内核线程。对用户来说,如果有三个线程同时执行,可能在内核中只有一个线程。
一对一模型对于直接支持线程的系统,一对一模型始终是最为简单的模型。一个用户使用的线程就唯一对应一个内核使用的线程,但返回来,一个内核里面的线程在用户态不一定有对应的线程存在。
对于一对一模型,线程之间的并发是真正的并发,一个线程因为某个原因阻塞,并不会影响到其他线程。一对一模型也可以让多线程程序在多处理器的系统上有更好的表现。
一般直接使用API或者系统调用创建的线程均为一对一线程。
一对一线程的两个缺点:
多对一模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户态的代码来进行,相对于一对一模型,多对一模型的线程切换要快速许多。
多对一模型的问题就是如果一个用户线程阻塞了,那么所有的线程都将无法执行。在多处理系统上,处理器的增多对多对一模型的线程性能不会有明显帮助。多对一模型得到的好处是高效的上下文切换和几乎无限制的线程数量。
多对多模型多对多模型结合了多对一和一对一的特点,将多个用户线程映射到少数但不止一个内核线程上。
一个用户线程阻塞并不会使得所有的用户线程阻塞。并且对用户线程数量也没有什么限制,在多处理器系统上,多对多模型的线程也能得到一定的性能提升,不过提升的幅度没有一对一模型高。