http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html

Linux从内核2.6開始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。

Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。

Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一相应的关系。线程的调度全然交给了操作系统内核。当然jvm还保留一些策略足以影响到其内部的线程调度。举个样例。在linux下,仅仅要一个Thread.run就会调用一个fork产生一个线程。

Java线程在Windows及Linux平台上的实现方式,如今看来,是内核线程的实现方式。这样的方式实现的线程,是直接由操作系统内核支持的——由内核完毕线程切换,内核通过操纵调度器(Thread Scheduler)实现线程调度,并将线程任务反映到各个处理器上。内核线程是内核的一个分身。程序一般不直接使用该内核线程,而是使用其高级接口,即轻量级进程(LWP)。也即线程。

这看起来可能非常拗口。看图:

(说明:KLT即内核线程Kernel Thread,是“内核分身”。

每个KLT相应到进程P中的某一个轻量级进程LWP(也即线程)。期间要经过用户态、内核态的切换,并在Thread Scheduler 下反应到处理器CPU上。)

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

对于一个大型程序。我们能够开辟的线程数量至少等于执行机器的cpu内核数量

java程序里我们能够通过以下的一行代码得到这个数量:

Runtime.getRuntime().availableProcessors();
所以最小线程数量即时cpu内核数量。假设全部的任务都是计算密集型的,这个最小线程数量就是我们须要的线程数。开辟很多其它的线程仅仅会影响程序的性能,由于线程之间的切换工作。会消耗额外的资源。假设任务是IO密集型的任务。我们能够开辟很多其它的线程运行任务。当一个任务运行IO操作的时候。线程将会被堵塞,处理器立马会切换到另外一个合适的线程去运行。

假设我们仅仅拥有与内核数量一样多的线程。即使我们有任务要运行,他们也不能运行。由于处理器没有能够用来调度的线程。

  假设线程有50%的时间被堵塞,线程的数量就应该是内核数量的2倍。假设更少的比例被堵塞。那么它们就是计算密集型的。则须要开辟较少的线程。

假设有很多其它的时间被堵塞。那么就是IO密集型的程序,则能够开辟很多其它的线程。

于是我们能够得到以下的线程数量计算公式:

线程数量=内核数量 / (1 - 堵塞率)

转载于:https://www.cnblogs.com/llguanli/p/7095457.html

Java线程与Linux内核线程的映射关系相关推荐

  1. java线程和linux线程,Java线程与Linux内核线程的映射关系

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上仍是轻量级进程(LWP). Java里的线程是由JVM来管理的,它如何对应到操做 ...

  2. java线程和linux线程,【转】Java线程与Linux内核线程的映射关系

    [暴力,STL,水]UVa 1523 - Helicopter Since ancient time, people have been dreaming of flying in the sky. ...

  3. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  4. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  5. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  6. Linux内核信号杀死内核线程,linux内核线程对信号的处理过程.

    linux中的线程分为用户线程和内核线程,用户线程是规范的线程,全面的自主性,全面的抢占性:然而内核线程就不那么好了,某种含义上未曾用户线程那么安逸,这个怎么会意呢?用户线程的编写者只必需告终利用逻辑 ...

  7. linux内核 thread,Linux内核线程kernel thread详解

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  8. 【Linux内核】内存映射原理

    [Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...

  9. linux内核线程创建销毁机制

    这个话题乍一听貌似比较大,其实线程创建本身就是一件很平常的事情. 下面将要介绍的是,新版linux中创建内核线程的机制做了一些变化(其实本质没变,最终还是调用do_fork()来实现),和控制线程的时 ...

最新文章

  1. 金智教育CTO:大数据人才培养要先行一步
  2. 【BZOJ】3542: DZY Loves March
  3. (组合)Binomial Showdown
  4. python3 获取 当前作用域 全部参数的内置方法 locals()
  5. go float64 转int_深挖Go函数之深度解析(下):可变参数
  6. 理论计算机科学研究生,清华大学理论计算机科学中心姚期智组招收保送研究生,请帮忙发到虎...
  7. javafx树视图加选框_JavaFX缺少的功能调查:表视图
  8. Electron是个啥?
  9. python(11)-if语句,断言assert
  10. matlab中 s 函数简记
  11. 需求管理与分析——需求池
  12. 根据TTL值判断目标主机的类型
  13. Devexpress ASP.NET最新版开发.NET环境配置Visual Studo和SQL Server对应版本
  14. 传输层 可靠传输 连续ARQ协议和滑动窗口协议
  15. 进入加密的QQ空间方法
  16. 【一年总结】我的大三
  17. pytorch中dim的含义及相关做法
  18. 懒惰删除JAVA,Redis的新特性懒惰删除Lazy Free详解
  19. 众昂矿业:萤石需求异军突起
  20. 菜鸟教程Python教程100例(三)(持续更新)

热门文章

  1. docker ps 和docker ps -a
  2. 解决redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused
  3. 湖北大学 计算机考研,湖北大学考研难吗?一般要什么水平才可以进入?
  4. 好分数阅卷3.0_自考通过率低?一位资深阅卷老师的自述
  5. 后端开发应该掌握的 Redis 基础
  6. 16个烧光你脑细胞的悖论
  7. 以下十种性格的人不适合做程序员,你​赞同吗? ​
  8. c#form+mysql储存读取图片_C#从SQL server数据库中读取l图片和存入图片
  9. 好奇心机制_好奇心问题
  10. 前端人员如何在linux服务器上搭建npm私有库