线程内存布局

2024-03-19

我了解进程内存布局的样子(代码、数据、堆、堆栈)。

但是,我不明白具有多个线程的程序的内存布局究竟是什么样的。

毕竟,该进程有一个堆栈,所以我假设所有线程都以某种方式共享相同的堆栈。 但这似乎不对,因为每个线程都有自己的堆栈,并且不能保证线程按照调用的顺序执行,因此将它们一一放入进程堆栈对我来说没有多大意义。

我在网上看到了这张图:

线程内存布局 https://i.stack.imgur.com/Ytv2X.gif

这里看来每个线程都有自己的堆栈,这是有道理的,而且还有自己的内核堆栈。

这是否意味着我(使用图片)有 3 个“进程”? (假设一个进程地址空间是 4GB,那么 3 个线程就是 12GB?我认为不是..)

我想了解每个线程的堆栈位于内存中的位置。

我知道所有线程共享数据和代码段,因此我假设堆将包含线程的堆栈,或者它们将位于内核空间中。

我真的很想知道会发生什么..

许多赞赏。


首先,让我们清楚地区分这两个定义。进程实际上是一个隔离容器,可以容纳系统资源(如套接字、互斥体等),并且线程可以在该环境中执行。该进程没有堆栈,并且不接收CPU时间(不可调度)。相反,线程是操作系统内核执行调度的单位。线程定期接收一定量的 CPU 时间来取得进展,并有一个堆栈来存储临时数据(局部变量和返回地址)。

第一个说明:虚拟地址空间是进程抽象的核心部分。每个进程都有自己的虚拟地址空间,每个虚拟地址空间只属于一个进程。 第二个注意点:进程中运行的所有线程共享进程的所有资源。因此,同一进程的所有线程共享相同的地址空间。每个线程都能够访问另一个线程可以访问的每个内存字节。一个线程甚至可以访问另一线程堆栈上的局部变量。

在旧的 UNIX 中,只有一个抽象——进程。但从现代的角度来看,我们可以说 UNIX 一直坚持一对一的模型(每个进程只有一个线程)。由于这种一对一的模型,UNIX 能够修复内存中的堆栈位置。目前采用的 1 对 N 模型(每个进程多个线程)假设不存在这样的固定堆栈位​​置。相反,操作系统内核负责在请求创建线程时为堆栈定位空间,并在线程终止时释放该空间。此外,如果在查找进程虚拟地址空间的空闲块时失败,内核甚至可以拒绝线程创建请求。

保持线程执行不可中断的假象。内核跟踪每个线程的指令和堆栈指针。当内核将线程加载到 CPU 上(为线程提供 CPU 时间来执行)时,它会加载特殊的 CPU 寄存器,其中包含内核为该特定线程维护的指令和堆栈指针。当内核从 CPU 卸载线程时,它将这些指针存储在内核内存中。通过这种方式,内核会产生一种错觉,即每个线程都有自己单独的堆栈,因为线程本身不需要处理此堆栈指针操作。事实上,我们可以说每个线程都有自己的逻辑上分配给他的部分地址空间,但物理上可供进程中的每个人访问,但每个线程都有自己的私有堆栈指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程内存布局 的相关文章

  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 线程池,C++

    我正在使用 C 开发一个网络程序 我想实现一个 pthread 池 每当我从接收套接字接收到一个事件时 我都会将数据放入线程池中的队列中 我正在考虑创建 5 个独立的线程 并将持续检查队列以查看是否有任何传入数据需要完成 这是一个非常简单的
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 为什么在读取字典时要锁定

    我对我正在阅读的一本关于线程的书 C 3 in a Nutshell 中的代码列表感到困惑 在 应用程序服务器中的线程安全 主题中 给出了以下代码作为 UserCache 的示例 static class UserCache static
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • sizeof(某个指针)总是等于四吗?

    例如 sizeof char 返回 4 也是如此int long long 我尝试过的一切 这有什么例外吗 您得到的保证是sizeof char 1 没有其他保证 包括不保证sizeof int sizeof double 实际上 在 16
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • Chrome 内存/垃圾收集问题

    我在使用 Chrome 时遇到内存 垃圾收集问题 我正在开发一个照片上传网站 该网站允许我的客户使用 HTML5 和文件 API 拖放照片进行上传 因此这在 IE 中不起作用 它仅适用于 Chrome 和 FF 我还没有在 Safari O
  • python中的内存错误

    Traceback most recent call last File run 1341144766 1067082874 solution py line 27 in main File run 1341144766 106708287
  • Android 布局不需要的填充

    所以我有这个布局文件 如下 正如您所看到的 没有填充或边距 dimen xml 文件也没有任何填充 边距 最后 我根本不以编程方式更改布局
  • 如何停止提交给 ExecutorService 的 Callable?

    我正在尝试实现一个示例应用程序来测试Callable and ExecutorService接口 在我的应用程序中我已经声明 ExecutorService exSvc Executors newSingleThreadExecutor T
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 如何计算选择查询的最佳获取大小

    在 JDBC 中 默认获取大小为 10 但我想当我有一百万行时 这不是最佳获取大小 据我所知 获取大小太低会降低性能 但如果获取大小太高也会降低性能 我怎样才能找到最佳尺寸 这对数据库端有影响吗 它会占用大量内存吗 如果您的行很大 请记住
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • android:layout_alignParentBottom 在没有显式布局高度作为 ListView 中的行的情况下使用时会被忽略

    当我使用RelativeLayout与任一fill parent or wrap content作为高度和一个指定的元素 android layout alignParentBottom true 它被忽略并在顶部对齐 设置高度Relati

随机推荐

  • 初始化 log4j 文件时出现异常

    当尝试从配置文件初始化 hibernate 时 我得到 NullPointerException 根本原因如图所示 Caused by org apache commons logging LogConfigurationException
  • 为什么Tomcat需要安装JDK? [复制]

    这个问题在这里已经有答案了 据我所知 JRE是运行时 JDK是用于Java代码的开发 但在生产中的 Tomcat 服务器上 将无法开发 Java 应用程序 所以 我的问题是为什么我们不能只安装 JRE 来运行 Tomcat 为什么运行 To
  • Ruby on Rails 3 中的类方法 — 我完全迷失了!

    背景here http www railway at 2010 03 09 named scopes are dead 在上面的链接中 给出了以下示例 class lt lt self def by author author where
  • 为什么 OpenJDK 将私有方法放入 vtable 中?

    看起来开放JDK 8 http hg openjdk java net jdk8 jdk8 hotspot file 87ee5ee27509 src share vm oops klassVtable cpp l575放置非私有方法fin
  • 如何在 Delphi 7 中的文件中保存 UTF-16(Little Endian)和字符串值?

    我想将编辑框中的值和 UTF 16 Little Endian 值保存在文件中 我将举一个简单的例子来更好地理解我的问题 Edit Box Value gt Good Hex value FFFEFF15410042004300 which
  • 如何将环境变量添加到 Azure Devops 管道中

    我正在为 Node 应用程序设置 Azure 管道 并使用 Jest 来测试 API 和集成 源代码位于 Azure DevOps 上 代码部署在 Azure 门户中 当我运行测试时 它在管道中失败 因为 env 从未在远程存储库中检查 环
  • 在 C++ 中将 HTTP 响应正文与标头分离

    我目前正在为某个项目编写自己的 C HTTP 类 我正在尝试找到一种方法将响应正文与标头分开 因为这是我需要返回的唯一部分 如果您不熟悉 这里是原始 http 标头的示例 HTTP 1 1 200 OK Server nginx 0 7 6
  • 如何对不同形状使用同一组修改器

    作为我学习 SwiftUI 项目的一部分 我做了一些形状旋转 下面有代码 我想知道如何避免每个形状使用相同的三行修饰符 func getShape shape Int i Int gt AnyView switch shape case 0
  • 为什么当我“使用”BinaryReader 对象时我的 FileStream 对象被释放?

    考虑以下函数 private int GetSomethingFromFile FileStream fs using BinaryReader br new BinaryReader fs fs Seek 0 SeekOrigin Beg
  • 线程和多处理模块之间有什么区别?

    我正在学习如何使用threading和multiprocessingPython 中的模块可并行运行某些操作并加速我的代码 我发现这很难 也许是因为我没有任何理论背景 来理解threading Thread 对象和一个multiproces
  • 如何检查可见 DOM 中是否存在元素?

    如何在不使用getElementById method 我已经设置了一个现场演示 http jsbin com apawi5 3以供参考 我还将在这里打印代码
  • 如何在 python 中实现“#ifdef”?

    编程于C我曾经有代码部分仅用于调试目的 记录命令等 通过使用这些语句可以完全禁用生产 ifdef预处理器指令 如下所示 ifdef MACRO controlled text endif MACRO 做类似事情的最好方法是什么python
  • 神经网络立即过拟合

    我有一个带有 2 个隐藏层的 FFNN 用于几乎立即过拟合的回归任务 epoch 2 5 取决于 个隐藏单元 ReLU Adam MSE 每层相同的隐藏单元数 tf keras 32 个神经元 128 个神经元 我将调整隐藏单元的数量 但为
  • Q_PROPERTY:成员与读/写

    我正在阅读 Qt 5 5 关于 Q PROPERTY 宏的文档 但我不能很好地理解它 据我所知 您可以在此宏中使用关键字 MEMBER 或访问器 READ WRITE 来代替 如果您使用关键字 MEMBER 则不必编写访问器 因为您可以使用
  • 如何重新编译Google Drive API sdk?

    这是我们的问题 如何在dotnet中重新编译Google Drive api sdk gt 我们没有找到源代码 gt 在二进制包中 有一个源文件未随项目一起提供 我们不知道如何处理它 提问原因 在 dotnet 中 我们无法使用从 Goog
  • mysqlnd_ms 错误 - getaddrinfo 失败,mysqlnd_global_stats 未知

    我正在尝试设置 mysqlnd ms 以便它达到在从属数据库上读取和在主数据库上写入的目的 但是 当 httpd 重新启动时 我收到此错误 PHP Warning PHP Startup Unable to load dynamic lib
  • ASP.NET Core 中的 IHttpActionResult 和辅助方法

    我正在尝试将我的 web api 2 项目移动到 ASP NET 5 但我有很多不再存在的元素 例如IHttpActionResult or Ok NotFound 方法 或者RoutePrefix 我应该改变每一个IHttpActionR
  • VS2005中如何将静态库项目转换为dll项目

    当我在vs2005中创建一个项目时 我还可以创建 Win32 gt Win32Project 我可以选择 控制台应用程序 或 dll 或 静态库 如果我创建了一个静态库项目 我怎样才能将它转换为dll项目 我在创建的项目的设置面板中找到了
  • MySQL系统数据库表可以转换为InnoDB吗?

    我最近安装了MySQL 5 5 我在用着InnoDB作为我所有数据库的引擎 我注意到mysql数据库默认值及其所有表 用户 数据库等 都是MyISAM 有什么理由他们不能 不应该InnoDB 有谁知道 MySQL 是否需要mysql数据库是
  • 线程内存布局

    我了解进程内存布局的样子 代码 数据 堆 堆栈 但是 我不明白具有多个线程的程序的内存布局究竟是什么样的 毕竟 该进程有一个堆栈 所以我假设所有线程都以某种方式共享相同的堆栈 但这似乎不对 因为每个线程都有自己的堆栈 并且不能保证线程按照调