【问题标题】:multi-threading: does stack may overlap on physical memory多线程:堆栈是否可能在物理内存上重叠
【发布时间】:2020-03-23 15:12:56
【问题描述】:

有人告诉我,同一进程中的线程共享相同的物理内存空间和相同的虚拟内存地址,并且每个线程都有自己的函数堆栈。

所以说我有两个线程t1t2。如果我是对的,t1 堆栈的虚拟内存地址可能是从0x00000x0011,而t2 堆栈的虚拟内存地址可能是从0x01000x0111。总之,它们的虚拟内存地址不重叠。

所以我有一个问题:它们如何共享相同的物理内存? t1t2 是否可能位于同一块物理内存中?如果可能,是否意味着操作系统必须在内容切换到t2 时存储t1 的堆栈?

【问题讨论】:

  • 这是通过分页机制完成的,分页机制通常是操作系统的一部分。当应用程序请求其虚拟范围中的地址时,物理内存中的虚拟内存页面(4096字节大小的块)不可用,触发页面交换,这意味着将页面从文件加载到可用的物理内存插槽中。如果在一段时间内不使用页面,则卸载页面与使用特殊文件的方式相同。

标签: multithreading memory memory-management


【解决方案1】:
  1. 当我们说the same process share the same physical memory space and the same virtual memory addresses时,实际上是指同一个进程共享相同的物理内存空间和相同的虚拟内存地址,不同的进程有不同的物理内存空间,也就是说进程A不能修改/访问进程B的物理内存空间,共享内存除外。每个进程的这种受保护的单独内存部分是由内存管理单元 (MMU) 实现的。

  2. 当我们说threads share the same physical memory。这意味着所有线程具有相同的地址空间,这意味着它们也共享相同的全局变量。并且每个线程都可以访问进程地址空间内的每个内存地址,线程 A 可以读取、写入甚至完全清除线程 B 的堆栈。

  3. 回到问题:How do threads share the same physical memory?对于LinuxThreads,它使用(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)参数调用clone()创建“线程”,即共享内存,共享文件系统访问计数,共享文件描述符表,以及共享信号处理。 http://man7.org/linux/man-pages/man2/clone.2.html 线程之间的区别在于程序计数器(跟踪接下来要执行的指令)、寄存器(保存其当前工作变量)、线程堆栈(包含执行历史记录)。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2013-04-22
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2018-01-22
    • 2013-12-02
    相关资源
    最近更新 更多