Process和Thread不会共享的数据是什么?
感谢所有提供时间的人
答案 0 :(得分:3)
单独的进程不会彼此共享任何数据。
如果线程在同一进程中运行,则它们可以共享任何堆分配或静态数据。
答案 1 :(得分:2)
这取决于具体情况。在大多数情况下,完全独立的进程不共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在Unix中使用fork时。在旧版本的Windows(95,98,ME)中,共享内存区域在所有进程之间共享,但主要是它只是系统DLL的空间而不是数据。
通常线程共享堆数据,但是您需要小心释放在另一个线程中分配的一个线程中的内存,因为某些内存管理器依赖于堆栈。
答案 2 :(得分:1)
默认情况下,不会在进程之间共享数据,而是使用进程间通信技术,如Socket,Pipes,RPC等。您可以共享数据。
答案 3 :(得分:1)
在操作系统理论中(AFAIK适用于Windows,Linux,* BSD等操作系统),进程被定义为具有自己的页表的线程,即拥有虚拟内存空间。
其他任何操作依赖于操作系统(文件描述符,套接字等)。根据我的经验,这些线程属性通常通过复制进程的标准系统调用进行复制。考虑一下,它更容易实现,也更有资源(更少的管家和保持非虚拟内存而不触及它)。
答案 4 :(得分:0)
在UNIX上,如果文件描述符未设置为在exec(FD_CLOEXEC
)上关闭,则进程可以与其子进程共享文件描述符。同样,Windows支持在调用lpSecurityAttributes->bInheritHandle
时将TRUE
设置为CreateFile()
,然后在调用bInheritHandles
时将TRUE
设置为CreateProcess
,从而支持与子进程共享句柄。更不用说Microsoft C运行时_open()
函数接受_O_NOINHERIT
标志。
在Linux上,clone()
系统调用可以让您对子进程与其父进程共享的内容进行大量控制:从地址空间(CLONE_VM
)到文件描述符表({{1父进程ID(CLONE_FILES
)可以共享也可以不共享。当然,添加了此功能以支持内核线程。
Thread-local storage (TLS)的索引方式不同,但实际内存在线程之间共享。