线程模型

最近阅读<现代操作系统>时,讲到线程根据其存在的位置分为用户级线程和内核级线程。用户级线程存在于用户空间中,他的创建,销毁,调度都由用户空间的线程库来完成。操作系统内核无法感知上层线程的切换。操作系统像不存在多线程一样去作进程调度。内核级线程存在于内核空间中,由操作系统内核创建和管理。用户程序创建的内核线程通过system call创建内核级线程.

用户级线程可以在不支持内核线程的系统上实现多线程编程。现代操作系统绝大数都支持内核线程,所以实现方式集在用户级线程和内核级线程的混用方式。更多优缺点,请参考<现代操作系统>原文。

在操作系统概念到提到用户线线程与内核级线程存在三种对应关系:

1. 多对一

多个用户线程对应一个内核线程。这其实就是纯用户级多线程的实现方式。如果一个线程执行阻塞的系统调用,会导致当前进程被内核调度出去,其他线程也无法执行。任意时刻只能有一个线程访问内核,且多个线程无法调度在多个CPU上,因为他们在内核中的调度单元是进程。腾讯libco框架单个线程上实现多个协程的并发运行。https://blog.csdn.net/chdhust/article/details/53271478

2. 一对一

一个用户线程对应一个内核线程。线程的调度由内核线程的调度来完成。如果一个线程执行阻塞的系统调用,另一个线程会被切换执行,且多个线程可以运行在多个CPU上。比如Java在Linux、windows上的实现,一个java线程通过LWP与一个系统内核线程绑定。缺点,内核线程的数量限制限制了用户线程的数量。

3. 多对多

多个用户线程对应多个内核线程,一般用户线程数大于内核线程数.这种模式不但有一对一的并发性能,而且解决了用户线程数量的限制问题。这种模型又称为二级模型,HP-UX等支持。Solaris9之后采有一对一模型.

参考:
https://www.cnblogs.com/zengkefu/p/5589876.html