我知道进程的线程共享除堆栈之外的地址空间(所有段)。每个线程都有自己的堆栈。我还读到,在相同的地址空间中,线程可以访问属于其他线程(here和here的堆栈的内存位置。
如果上面的陈述是正确的,那我就提出这个问题:当OS从一个线程看到这样的地址时会发生什么?如果线程在其他堆栈中写入并破坏它们会怎么样?为什么操作系统不会产生某种权限被拒绝错误?
如果这个问题的答案取决于操作系统,请考虑使用Linux。
答案 0 :(得分:0)
正如您所述,线程共享相同的地址空间。因此,每个线程对地址空间的访问权限与任何其他线程相同。
操作系统从线程中看到这样的地址?
我无法告诉你在这里问的是什么。
如果线程在其他堆栈中写入并损坏它们会怎么样?
这是完全可能的,结果是不可预测的。这就像一场竞争条件。
为什么操作系统不会产生某种权限被拒绝错误?
内存访问由处理器模式(例如,用户,内核以及某些系统的其他模式)控制。通常,模式级保护旨在防止用户访问逻辑地址空间的共享系统范围。通过具有不同的用户地址空间范围来保护进程相互保护。
通常,您希望线程能够在同一地址空间内进行读写。否则,您也可以使用单独的流程。
堆栈只是一个读/写成员块。堆栈没有什么神圣的东西。任何内存块都可以是堆栈,只需将其用作堆栈即可。