导航菜单
路很长,又很短
博主信息
昵   称:Cocodroid ->关于我
Q     Q:2531075716
博文数:356
阅读量:1648446
访问量:205676
至今:
×
云标签 标签球>>
云标签 - Su的技术博客
博文->>首页 博主的更多博文>>
【干货】Java线程与操作系统线程的关系
Tags : 线程,操作系统,java发表时间: 2017-11-30 00:41:13
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
比如: 转自:Su的技术博客  原文地址:
针对于Java线程和OS线程之间的关系,下面我以下面的问题来分析:
1、操作系统的线程
①操作系统线程的实现有三种:
用户级线程ULT(UserLevelThreads)、内核支持线程KST(KernelSupportedThreads)、前两者的组合。
用户级线程:在用户空间实现的
内核级线程:在OS内核空间实现的。
设置用户级线程的系统,调度是以进程为单位的。设置了内核级进程的而是以线程为单位进行调度的。
②内核线程的优缺点:
优点
               a.内核可以在多处理器系统中调度同一进程中的多个线程并行执行。 
               b.如果某一个进程中的线程阻塞了,可以跨进程调度其他线程进行执行
               c.线程的切换速度快,开销小。并且内核本身支持多线程技术可以提高系统的执行速度和效率。
缺点
当用户将线程交付下来时要将线程由用户态切换为核心态再进行调度等操作,因此也会造成模式切换的开销较大。
③用户级线程的优缺点:
优点
a.线程的切换不需要转换到内核空间,所以节省了模式切换的开销
b.用户级线程的实现和OS平台无关
缺点
a.一个进程被分配一个CPU,同一时刻只能有一个线程运行。
b.若进程中的正在运行的线程阻塞,则当前进程的其他线程全被阻塞。

2、操作系统中用户线程和内核线程之间的关系(多线程模型)
①一对一模型
能并发、并行运行在多处理器。缺点:创建一个用户线程也要创建一个内核线程,开销大。线程数量有限。
②多对一模型
多个用户线程映射到一个内核线程。任一时刻只能一个线程能访问内核,某个线程阻塞会影响整个进程阻塞,多线程不能并行运行在多处理器上。
③多对多模型
多路复用许多线程到同样数量或更小数量的内核线程上。

3、Java线程和OS线程
①Java线程
Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。
JVM通常采用宿主系统上的线程库来实现。
②三种线程库:
Win32 API:适用于Windows操作系统的内核级线程库
Pthread:POSIX标准的扩展,提供用户级或内核级库
Java线程库:根据宿主操作系统上的线程库来实现,也就是在Windows上采用Win32 API实现,UNIX和Linux采用Pthread。
③操作系统线程和Java线程
Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一相应的关系
Java线程在Windows及Linux平台上的实现方式是内核线程的实现方式。这样的方式实现的线程,是直接由操作系统内核支持的——由内核完毕线程切换,内核通过操纵调度器(Thread Scheduler)实现线程调度,并将线程任务反映到各个处理器上。内核线程是内核的一个分身。程序一般不直接使用该内核线程,而是使用其高级接口,即轻量级进程(LWP)。也即线程。
说明:KLT即内核线程Kernel Thread,是“内核分身”。每个KLT相应到进程P中的某一个轻量级进程LWP(也即线程)。期间要经过用户态、内核态的切换,并在Thread Scheduler 下反应到处理器CPU上。

        这样的线程实现的方式也有它的缺陷:在程序面上使用内核线程,必定在操作系统上多次来回切换用户态及内核态;另外,由于是一对一的线程模型,LWP的支持数是有限的。

4、引出题外话:关于线程数量
对于一个大型程序。我们能够开辟的线程数量至少等于执行机器的cpu内核数量。
java程序里我们能够通过以下的一行代码得到这个数量:
Runtime.getRuntime().availableProcessors();
所以最小线程数量即时cpu内核数量。
假设全部的任务都是计算密集型的,这个最小线程数量就是我们须要的线程数。开辟很多其它的线程仅仅会影响程序的性能,由于线程之间的切换工作。会消耗额外的资源。
假设任务是IO密集型的任务。我们能够开辟很多其它的线程运行任务。当一个任务运行IO操作的时候。线程将会被堵塞,处理器立马会切换到另外一个合适的线程去运行。
假设我们仅仅拥有与内核数量一样多的线程。即使我们有任务要运行,他们也不能运行。由于处理器没有能够用来调度的线程。
        假设线程有50%的时间被堵塞,线程的数量就应该是内核数量的2倍。假设更少的比例被堵塞。那么它们就是计算密集型的。则须要开辟较少的线程。
假设有很多其它的时间被堵塞。那么就是IO密集型的程序,则能够开辟很多其它的线程。
于是我们能够得到以下的线程数量计算公式:
线程数量=内核数量 / (1 - 堵塞率)

参考:
http://www.cnblogs.com/llguanli/p/7095457.html
http://annan211.iteye.com/blog/2119623

http://blog.csdn.net/yangmx_5/article/details/68065299



打赏
打赏
关注公众号
公众号
类别:Java| 阅读(6114)| 赞 (3)
上一篇 : javax.naming.NamingException
下一篇: Tomcat日志json格式
评论
暂无评论!
发表评论
昵  称:

验证码:

内  容:

    同时赞一个 赞

推荐文章