JAN*_*JAN 12 multithreading operating-system process shared-memory
在考虑了共享内存的整个概念之后,出现了一个问题:
两个进程可以共享同一个共享内存段吗?两个线程可以共享相同的共享内存吗?
在更清楚地考虑之后,我几乎肯定两个进程可以共享相同的共享内存段,其中第一个是父亲,第二个是子,它是用a创建的fork(),但两个线程呢?
谢谢
Gra*_*ray 24
两个进程可以共享同一个共享内存段吗?
是的,不是.通常使用现代操作系统,当另一个进程从第一个进程分叉时,它们在所有页面上使用写时复制集共享相同的内存空间.对任何读写内存页面进行的任何更新都会导致对页面进行复制,因此将有两个副本,并且将不再在父进程和子进程之间共享内存页面.这意味着只会共享只读页面或未写入的页面.
如果一个进程没有从另一个分叉那么他们通常不共享任何内存.一个例外是如果您运行同一程序的两个实例,那么它们可能共享代码甚至可能是静态数据段,但不会共享其他页面.
还有特定的内存映射调用来共享相同的内存段.该调用指定映射是只读还是读写.如何做到这一点非常依赖操作系统.
两个线程可以共享相同的共享内存吗?
当然.通常,多线程进程内的所有内存都由所有线程"共享".这通常是线程的定义,因为它们都在同一个内存空间中运行.
线程还具有增加的复杂性,即在与处理器/核心相关的高速存储器中具有高速缓存的存储器段.不共享此高速缓存的内存,并且根据同步操作将对内存页的更新刷新到中央存储中.
通常,进程的主要目的是防止内存共享!在最常见的OS上当然可以通过共享内存段进行进程间通信,但是默认情况下不存在该机制。如果幸运的话,如果无法正确设置和管理共享区域,则很可能会导致segFault / AV,否则可能会导致UB。
但是,属于同一进程的线程不具有这样的硬件内存管理保护,它们几乎可以共享它们想要的任何东西,显而易见的缺点是,它们可以破坏几乎任何他们想要的东西。实际上,我从来没有发现这是一个大问题。使用现代的OO语言,这些语言倾向于将指针“构造”为对象实例(Java,C#,Delphi)。
| 归档时间: |
|
| 查看次数: |
18084 次 |
| 最近记录: |