Multithreading 多处理器系统上的POSIX线程

Multithreading 多处理器系统上的POSIX线程,multithreading,process,pthreads,Multithreading,Process,Pthreads,我已经编写了利用POSIX线程的软件,这样我就可以在进程中利用共享内存。我的问题是,如果我有一台运行Ubuntu的机器,它有4个处理器,每个处理器有16个内核。运行4个进程(每个进程有16个线程)或1个进程(每个进程有64个线程)效率更高吗?每个处理器都有一个专用的32gb ram 我主要担心的是,在seen with 1进程的背后会有很多memcopy 总之: 在4(16核)进程机器上 1个处理64个线程?4个处理16个线程? 如果进程需要超过32 gb的RAM(专用于一个进程的数量),答案是

我已经编写了利用POSIX线程的软件,这样我就可以在进程中利用共享内存。我的问题是,如果我有一台运行Ubuntu的机器,它有4个处理器,每个处理器有16个内核。运行4个进程(每个进程有16个线程)或1个进程(每个进程有64个线程)效率更高吗?每个处理器都有一个专用的32gb ram

我主要担心的是,在seen with 1进程的背后会有很多memcopy

总之:
在4(16核)进程机器上
1个处理64个线程?
4个处理16个线程?
如果进程需要超过32 gb的RAM(专用于一个进程的数量),答案是否不同


感谢您的帮助

取决于应用程序的功能

单线程进程中的线程比多线程进程中的线程运行得更快,因为后者需要在库函数(如
malloc()
fprintf()
)中的线程之间进行同步。。此外,多线程进程中的线程越多,可能会导致更多的锁争用,从而相互减慢。如果线程不需要通信也不需要共享数据,那么它们就不需要处于同一进程中


在您的情况下,使用4个进程和16个线程可能会获得更好的并行性,而不是使用1个进程和64个线程。

这些线程不通信,但它们确实共享数据。初始加载大量文件并创建共享结构,这些结构在运行的其余部分保持不变。这可能会占用大量ram,这就是为什么运行多个线程比运行多个进程更可取的原因。加载完成后,线程将被创建并独立运行,因此不会出现同步或锁定问题,因为共享内存没有任何更改。这会改变你的观点吗?一种选择可能是将数据和fork加载到多个进程中,而不是生成线程。子进程仍将共享所有数据。这样就不必使用线程支持来编译它。但是,这并没有什么明显的区别。我的印象是fork()复制父进程中的内存,而不是共享对它的访问?来自man fork:“在Linux下,fork()是使用写页复制实现的,因此它带来的唯一损失是复制父级的页表以及为子级创建唯一任务结构所需的时间和内存。“谢谢,我在备注部分没有看到这一点。”