请你谈一谈对线程模型的理解?

在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“用户线程”,而对应到操作系统,还有另外一种线程叫作“内核线程”。

用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。

最终,用户线程和内核线程之间必然存在某种关系:多对一模型、一对一模型和多对多模型。

1 多对一模型

在这里插入图片描述
多个用户级线程映射到一个内核线程,线程管理是由用户空间的线程库来完成的,因此效率更高。不过,如果一个线程执行阻塞系统调用,那么整个进程将会阻塞。再者,因为任一时间只有一个线程可以访问内核,所以多个线程不能并行运行在多处理核系统上。

2一对一模型

在这里插入图片描述
一对一模型,又叫作内核级线程模型,即一个用户线程对应一个内核线程,内核负责每个线程的调度,可以调度到其他处理器上面。该模型在一个线程执行阻塞系统调用时,能够允许另一个线程继续执行,所以它提供了比多对一模型更好的并发功能;它也允许多个线程并行运行在多处理器系统上。但是:1 对用户线程的大部分操作都会映射到内核线程上,引起用户态和内核态的频繁切换;2 内核为每个线程都映射调度实体,如果系统出现大量线程,会对系统性能有影响;3 Java使用的就是一对一线程模型,所以在Java中启一个线程要谨慎。

3多对多模型

在这里插入图片描述
多对多模型,又叫作两级线程模型。在此模型下,用户线程与内核线程是多对多(m : n,通常m>=n)的映射模型。首先,区别于多对一模型,多对多模型中的一个进程可以与多个内核线程关联。其次,又区别于一对一模型,它的进程里的所有用户线程并不与内核线程一一绑定,而是可以动态绑定内核线程, 当某个内核线程因为其绑定的用户线程的阻塞操作被内核调度让出CPU时,其关联的进程中其余用户线程可以重新与其他内核线程绑定运行。

所以,多对多模型既不是多对一模型那种完全靠自己调度的也不是一对一模型完全靠操作系统调度的,而是中间态(自身调度与系统调度协同工作),因为这种模型的高度复杂性,操作系统内核开发者一般不会使用,所以更多时候是作为第三方库的形式出现。

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/119902731
今日推荐