进程和线程

Process and Thread

本文关键字:线程 进程      更新时间:2023-10-16

Process和Thread不会共享哪些数据?

提前感谢所有提供时间

的人

单独的进程之间不共享任何数据。

如果线程在同一进程中运行,那么它们可以共享任何堆分配的或静态的数据。

这取决于上下文。在大多数情况下,完全独立的进程不共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在Unix中使用fork时。在旧版本的Windows(95,98,ME)中,有一个在所有进程之间共享的共享内存区域,但主要是用于系统DLL而非数据的空间。

通常线程共享堆数据,但您需要小心地释放一个线程中分配给另一个线程的内存,因为一些内存管理器依赖于堆栈。

BY默认进程之间不共享数据,但使用进程间通信技术,如Socket、Pipes、RPC等。您可以共享数据。

在操作系统理论中(AFAIK这适用于Windows、Linux、*BSD等操作系统),进程被定义为具有自己的页表的线程,即其自己的虚拟内存空间。

其他任何东西都依赖于操作系统(文件描述符、套接字等)。根据我的经验,这样的线程属性通常是用复制进程的标准系统调用复制的。想想看,它更容易实现,也更足智多谋(更少的家务劳动,保留非虚拟内存而不接触它)。

在UNIX上,如果文件描述符未设置为在exec(FD_CLOEXEC)上关闭,则进程可以与其子进程共享文件描述符。同样,Windows支持与子进程共享句柄,方法是在调用CreateFile()时将lpSecurityAttributes->bInheritHandle设置为TRUE,然后在调用CreateProcess时将bInheritHandles设置为TRUE。更不用说Microsoft C运行时_open()函数接受_O_NOINHERIT标志。

在Linux上,clone()系统调用使您能够控制子进程与其父进程共享的内容:从地址空间(CLONE_VM)到文件描述符表(CLONE_FILES)再到父进程ID(CLONE_PARENT),所有内容都可以共享或不共享。当然,添加此功能是为了支持内核线程。

进程中每个线程的线程本地存储(TLS)索引不同,但实际内存在线程之间共享。