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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YoursLC 有源 低代码 项目介绍

YoursLC 是我们独立研发的一款低代码产品,YoursLC-yours你们的、LC是低代码low-code的缩写,中文名称:有源低代码, 是一套双输出的低代码产品:既能完整输出功能又能100%输出源码。满足用户高效率、低成本和个性化的需求…

stm32电机控制定时器1_STM32通过PWM控制电机速度

做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理PWM(Pulse Width Modulation),也就是脉冲宽度调制。PWM中有一个比较重要的概念,占空比&#xf…

走向无后端的系统开发实践:CRUD自动化与强约定的REST接口

2019独角兽企业重金招聘Python工程师标准>>> ttp://mp.weixin.qq.com/s?__bizMzAwMDU1MTE1OQ&idx1&mid2653548079&sn2377b625db58b2ea93c3ef2d87e4c395 转载于:https://my.oschina.net/yunjie/blog/806130

mysql char varchar 性能_Mysql小细节:varchar与char在性能上的特点

varchar与char的一个主要区别是存储方式的不同varchar 是变长存储占用的存储空间 存储内容实际大小 长度记录位char 是定长存储占用的存储空间 字段声明的宽度存储方式对性能是有影响的例如分别使用 varchar(10) 与 varchar(255) 定义一个字段,实际存储的字符串为…

Dubbo源码解析之Zookeeper连接

2019独角兽企业重金招聘Python工程师标准>>> 注:Dubbo的版本是2.5.7。 图1 RegistryProtocol的export时序图 注册中心有Zookeeper、Redis、Dubbo,分别对应ZookeeperRegistry、RedisRegistry、MulticastRegistry。 连接Dubbo的客户端有俩种&am…

SHELL 脚本小技巧

脚本很简单,直接上功能介绍及脚本,可以做模板使用: 记录日志,记录脚本开始执行时间、结束时间usage 函数,脚本需接参数执行,避免误执行,告诉用户,这个脚本的使用方法加锁,创建锁文件…

WinForm(十)项目框架结构

看到下面的项目结构,是否曾经相识?不要笑,这也是一种项目结构,极简主义。项目结构没有对错,合适就好,但也要有几个要求,至少要做到结构明确,清晰,当然上图的结构清晰&…

mysql索引有哪些了解_Mysql索引(简单了解)

Mysql的存储引擎,可以针对不同的表使用不同的存储引擎MyISAM:插入,查血速度快,但是不支持事物,所以适用于数据仓库,Web等InnoDB:支持事物,所以适合于事物型数据库Memory:…

使用Spring发送带附件的电子邮件(站内和站外传送)

1.使用Spring发送带附件的电子邮件 <?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.spr…

vmware 克隆后Linux没有eth网卡只有lo

想试着在虚拟机上搭下主从&#xff0c;&#xff0c;&#xff0c;结果&#xff0c;克隆出来的虚拟机没有网卡。。。只有lo 于是跟着别人的来添加一个网卡 第一步&#xff1a;打开克隆的虚拟机 第二步&#xff1a; 第三步 第四步&#xff1a; 最后&#xff1a; 之后执行reboot重启…

聊一聊 C++ 中的 namespace

一&#xff1a;背景 相信大家在分析 dump 时&#xff0c;经常会看到 WKS 和 SRV 这样的字眼&#xff0c;如下代码所示&#xff1a;00007ffa778a07b8 coreclr!WKS::gc_heap::segment_standby_list 0x0000000000000000 00007ffa778a3870 coreclr!WKS::qpf 0x989680 00007ffa778…

会议会展活动从业技能之会销流程的16个环节

会议营销是透过相对大型活动来实现销售。会议营销是细节营销&#xff0c;一般操作流程有会前、会中、会后三个阶段共计16个环节&#xff0c;每个环节都做到位了&#xff0c;衔接好了&#xff0c;会议营销的最终效果就会得到保证。一般而言&#xff0c;会议营销分为会前营销、会…

haproxy详细介绍

Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能:路由HTTP请求到后端服务器,基于cookie作会话绑定.能够将多个请求反代至后端主机完成负载均衡的效果.主服务器失败时能自动切换到备服务器上.接受特殊的端口连接完成服务监控拒绝新连接时不会关闭已经连接的请求…

《ASP.NET Core 6框架揭秘》实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient

在一个采用依赖注入框架的应用中&#xff0c;我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用&#xff0c;使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题&#xff0c;以及后者带来的好处&#xff0c;将通过如下这几个演示程序…

Hadoop部署方式-高可用集群部署(High Availability)

Hadoop部署方式-高可用集群部署(High Availability) 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 本篇博客的高可用集群是建立在完全分布式基础之上的&#xff0c;详情请参考&#xff1a;https://www.cnblogs.c…

sybase 连接mysql_如何连接到Sybase SQL Anywhere数据库

Sybase SQL Anywhere数据库具有许多非常有用的功能&#xff0c;与竞争对手相比&#xff0c;它具有很高的竞争力。首先&#xff0c;它允许您处理大量数据。其次&#xff0c;它具有很高的生产率&#xff0c;也就是说&#xff0c;可以快速提供大量数据。第三&#xff0c;它需要最少…

【汇编语言】DEBUG的使用

在masm for windows中&#xff0c;需要先生存exe文件&#xff0c;然后再点调试按钮。 常用的命令有&#xff1a; R命令&#xff1a;查看、改变CPU寄存器的内容&#xff1b;如果要修改某个寄存器的内容&#xff0c;可以在r的后面接上空格和寄存器名。如&#xff1a;-r ax&#x…

Leetcode 动态规划 Trapping Rain Water

本文为senlie原创。转载请保留此地址&#xff1a;http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Total Submissions: 50810My SubmissionsGiven n non-negative integers representing an elevation map where the width of each bar is 1, co…

白盒测试用例设计方法

一、白盒测试 根据软件产品的内部工作过程&#xff0c;在计算机上进行测试&#xff0c;以证实每种内部操作是否符合设计规格要求&#xff0c;所有内部成分是否已经过检查。这种测试方法就是白盒测试。白盒测试把测试对象看做一个打开的盒子&#xff0c;允许测试人员利用程序内部…

k8s 读书笔记 - 详解 Pod 调度(Ⅰ卷)

上一篇 《深入掌握 Pod》 文章我们介绍了 Pod 的知识点&#xff0c;接下来我们来继续学习 Pod 在 k8s 中的调度原理。在 k8s 平台上&#xff0c;通常情况下很少直接创建一个 Pod&#xff0c;大多情况下都是通过 Pod 的资源管理对象 来创建&#xff0c;例如&#xff1a;RC/RS、…