有人告诉我,同一进程中的线程共享相同的物理内存空间和相同的虚拟内存地址,并且每个线程都有自己的功能堆栈。
所以我有两个线程t1
和t2
。如果我是对的,则t1
堆栈的虚拟内存地址可能从0x0000
到0x0011
,而t2
堆栈的虚拟内存地址可能是从0x0100
到0x0111
。总之,它们的虚拟内存地址不重叠。
所以我有一个问题:它们如何共享相同的物理内存? t1
和t2
是否可能位于同一块物理内存中?如果可能的话,是否表示在内容切换到t1
时操作系统必须存储t2
的堆栈?
当我们说the same process share the same physical memory space and the same virtual memory addresses
时,实际上意味着同一进程共享相同的物理内存空间和相同的虚拟内存地址,不同的进程具有不同的物理内存空间,表示进程A无法修改/访问该进程。 B的物理内存空间(共享内存除外)。通过内存管理单元(MMU)来实现每个进程受保护的独立内存部分。
当我们说threads share the same physical memory
时。这意味着所有线程都具有相同的地址空间,这意味着它们也共享相同的全局变量。每个线程都可以访问进程地址空间内的每个内存地址,线程A可以读取,写入甚至完全擦除线程B的堆栈。
返回问题: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线程之间的区别是程序计数器(跟踪下一条要执行的指令),寄存器(保留其当前工作变量),线程堆栈(包含执行历史记录)。