Java 线程和核心数

2024-02-09

我只是有一个关于处理器和线程如何工作的快速问题。根据我目前的理解,一个核心一次只能执行1个进程。但是我们能够生成一个数量大于我们拥有的核心数量(假设为 4)的线程池(假设为 30),并让它们同时运行。如果我们只有 4 个核心,这怎么可能?我还可以在本地计算机上运行 30 线程程序,并继续在计算机上执行其他活动,例如看电影或浏览互联网。

我在某处读到过,线程调度发生了,这给人一种错觉,即这 30 个线程正在由 4 个核心同时运行。这是真的吗?如果是的话,有人可以解释它是如何工作的,并推荐一些关于这方面的好读物吗?

预先感谢您的帮助。


进程与线程

在过去,每个进程都有一个精确的thread执行,因此进程直接调度到核心上(在过去,几乎只有一个核心可以调度到)。然而,在支持线程的操作系统(几乎所有现代操作系统)中,它是threads,而不是计划的进程。因此,在本次讨论的其余部分中,我们将专门讨论线程,您应该了解每个正在运行的进程都有一个或多个执行线程。

并行与并发

当两个线程同时运行时parallel,他们都在跑步同时。例如,如果我们有两个线程 A 和 B,那么它们的并行执行将如下所示:

CPU 1:A ------------------------->

CPU 2:B -------------------------->

当两个线程同时运行时同时,他们的执行overlaps。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:

CPU 1:A ----------> B ----------> A -----------> B -------- -->

So, 为了我们的目的,并行性可以被认为是并发性的一个特例*

调度

但是我们能够生成一个数量大于我们拥有的核心数量(假设为 4)的线程池(假设为 30),并让它们同时运行。如果我们只有 4 个核心,这怎么可能?

在这种情况下,它们可以同时运行,因为 CPU 调度程序为这 30 个线程中的每一个分配了一定的 CPU 时间份额。一些话题will并行运行(如果有 4 个核心,则任意时刻有 4 个线程并行运行),但所有 30 个线程将同时运行。然后你可以去玩游戏或浏览网页的原因是这些新线程被添加到线程池/队列中,并获得一定的 CPU 时间。

逻辑核心与物理核心

根据我目前的理解,一个核心一次只能执行1个进程

这不是quite真的。由于非常巧妙的硬件设计和流水线,在这里讨论的时间太长(加上我不明白),一个物理核心实际上可能正在执行两个完全不同的线程同时执行。如果需要的话,请稍微咀嚼一下这句话——它仍然让我震惊。

这一惊人的壮举被称为同步多线程(或流行的超线程,尽管这是此类技术的特定实例的专有名称)。因此,我们有物理核心,它们是实际的硬件 CPU 内核,以及逻辑核心,这是操作系统告知软件可供使用的核心数量。逻辑核心本质上是一种抽象。在典型的现代 Intel CPU 中,每个物理核心充当两个逻辑核心。

有人可以解释一下这是如何工作的,并推荐一些关于这方面的好读物吗?

我会推荐操作系统概念如果您确实想了解进程、线程和调度如何协同工作。

  • 术语的准确含义parallel and 同时都引起了激烈的争论,甚至在我们自己的堆栈溢出中 https://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference。这些术语的含义在很大程度上取决于应用领域。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 线程和核心数 的相关文章

  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • Twilio IBM Watson Speech To Text Addon 回调功能未触发

    我的目标是使用 Twilio 平台上提供的 IBM Watson Speech to Text Addon Twilio 附加功能 进行转录 呼叫者的输入 IVR 对话 IBM Watson 语音转文本插件已安装 Problem 回调 UR
  • 在Java中,如何更有效地追加字符串? [复制]

    这个问题在这里已经有答案了 我写了一个Java程序 我需要在其中附加一个字符串 u13a2 到现有的 u1234 u12de u1386 u15a3 渐渐地 绳子变得越来越长 我发现每次追加所花费的时间也变得越来越长 有什么办法可以在一定程
  • Pylint 函数名称无效

    我正在使用 Python 3 6 2 运行 Pylint 1 7 2 Pylint 显示以下错误 Invalid function name create maximization option dataframe invalid name
  • jQuery 悬停在表格上的效果

    我是 jQuery 新手 我想在我的桌子上制作悬停效果 但我不知道如何做 我只想将文本设为红色 然后在焦点丢失时如何再次删除红色 这是我到目前为止所拥有的 table border 1 tr th ID th th name th tr t
  • 使用四元数的设备方向

    我编写了一个 JS SDK 来监听移动设备旋转 提供 3 个输入 角度范围为 0 到 360 度 180 到 180 度之间的角度 90 到 90 度之间的角度 设备轮换的文档 https www sitepoint com using d
  • 拖放数据时清除输入字段

    我编写了一个函数 当用户将注意力集中在输入字段上时 该函数会自动清除输入字段的预设值 如果用户没有输入任何值 则将其恢复为模糊状态 所以的价值
  • 触摸浏览器中的元素(如指针事件:无)

    问题 我搜索了又搜索 但找不到有关如何通过覆盖元素触发触摸事件的信息 我通过使用以下方法解决了鼠标单击事件的问题 pointer events none 这很简单 但它不适用于触摸事件 我知道有一些移动原生的东西可以解决这个问题 但这纯粹是
  • 如何使用 Entity Framework 4.1 将连接字符串传递给数据库优先 DBContext 的构造函数?

    由于各种原因我想not将我的实体框架数据库模型的连接字符串存储在各种 config 文件之一中 我将最新最好的 DBContext API 与新的实体框架版本 4 1 NET 4 和 Visual Studio 2010 C 结合使用 但是
  • 为什么重写的函数首先被调用?

    我执行了以下程序 我对得到的输出感到好奇 其中函数输出首先被打印 即使它是我尝试首先打印的变量 class Baap public int h 4 public int getH System out println Baap h retu
  • 生产环境中无法解释的 SQL 错误 - 可能与网络相关

    我正在做一些相当密集的数据库工作 最终将很多很多记录插入到数据库中 为了尽量减少上下文膨胀 我一次执行 100 个插入 处理上下文 然后重新创建上下文 我收到一些我不明白的奇怪错误 这些错误仅发生在我们的生产服务器上 但在开发服务器上一切正
  • iOS 9 CollectionView 速度变慢

    我一直在为 iOS8 开发我的应用程序 并且在滚动速度方面还没有遇到任何问题 当我升级到 iOS9 时 collectionView 变得非常不稳定和令人震惊 我无法指出任何具体原因 在我的集合视图中 我的项目包含使用第 3 方库 SDWe
  • 如何检测 WiFi 网络共享状态

    我想知道如何检测 WiFi 网络共享的状态 我看过一篇文章 Android 2 3 wifi热点API https stackoverflow com questions 7048922 android 2 3 wifi hotspot a
  • 检查字符串是否在 python 中的 2 GB 字符串列表中

    我有一个大文件 A txt 2 GB 包含字符串列表 Question Q1 Q2 Q3 Ans1 Format links 现在我有另一个更大的文件 1TB 其中第二个位置包含上述字符串 Output a Question b The q
  • Java 8 流 - 对象的总和

    假设我有一个实现以下接口的对象列表 public interface Summable
  • Pytorch 张量索引:如何通过包含索引的张量收集行

    我有张量 ids 形状 7000 1 包含索引 例如 1 0 2 x 形状 7000 3 255 ids张量编码粗体标记维度的索引x应该选择哪个 我想将选定的切片收集到结果向量中 result 形状 7000 255 背景 我对这 3 个元
  • 关于 Arm 处理器上的 conda 发行版/通道的混乱

    我已经使用 Anaconda 几年了 但自从我开始使用带有 M1 处理器的 Mac 以来 我不得不处理一些软件包安装的一系列问题 这让我对一些基本概念有点困惑 例如 我试图安装 Tensorflow 结果发现正确的方法是安装 minifor
  • 使用 psycopg 准备的语句

    我是 python 的初学者 我们使用此代码来执行 SQL 命令 cur execute INSERT INTO test num data VALUES s s 100 abcdef 我想知道这是准备好的声明还是只是客户端引用 不 不是
  • 为什么使用隐式解包或强制解包让应用程序在某个阶段崩溃没有好处?

    我的观点是 在某些地方 我们知道该变量根本不会为零 但由于某种原因 我们无法在类的 init 函数中实例化它 因此我们必须将其设为可选 我也知道我们可以使用可选的绑定或防护技术来轻松摆脱它 但在我看来 由于隐式解包 强制解包而让应用程序因一
  • 在 asp.net 中使用对象标签

    我有这个 html 代码 用于在 aspx 页面中嵌入视频
  • Java 线程和核心数

    我只是有一个关于处理器和线程如何工作的快速问题 根据我目前的理解 一个核心一次只能执行1个进程 但是我们能够生成一个数量大于我们拥有的核心数量 假设为 4 的线程池 假设为 30 并让它们同时运行 如果我们只有 4 个核心 这怎么可能 我还