并发线程、进程和多核

Posted

技术标签:

【中文标题】并发线程、进程和多核【英文标题】:Concurrent threads, processes and multiple cores 【发布时间】:2020-08-26 13:49:04 【问题描述】:

我正在尝试了解 CPU 内核在并发线程和进程方面的使用情况。请看以下问题:

    假设我有 2 个 CPU 内核。当有 2 个进程在运行时,每个进程只有 1 个线程。这两个进程是否使用 2 个内核? 假设我有 2 个 CPU 内核。当有 1 个进程在运行时,它有 2 个线程。两个线程是否使用 2 个内核? 假设我有 2 个 CPU 内核。当有 2 个进程在运行时,每个进程有 2 个线程。这些进程和内核如何使用这两个内核? 如何计算给定 CPU 内核的最大实际并发执行?我还应该考虑哪些其他因素?

【问题讨论】:

【参考方案1】:

1,2:很有可能,但不一定。系统软件的一部分决定了在哪里运行。当一个进程或线程处于空闲状态时,不太可能选择让一个进程或线程等待 cpu 关注,这不是绝对的。

大多数处理都涉及到设备、网络等的某种传输。通常,这需要一段时间的不活动等待传输完成。在此不活动期间,另一个进程/线程可以在该 cpu 上运行。因此,如果一个给定的进程是 30% 的 cpu 时间和 70% 的 I/O 时间,那么我可以在单个 cpu 上同时运行大约 3 个而不降低性能。

3,4:就像上面的段落所暗示的那样,根据工作负载,它们可以是 CPU 中线程的任何分布。如果线程都是计算受限的(100% cpu),大多数操作系统在它们之间切换的粒度足够小,所有线程都保持活跃,并且足够大,切换对它们的影响最小。

调度可能会考虑其他概念,例如数据亲和性。当线程放弃它时,最近接触的数据位可能会保留在 cpu 缓存中。下次要调度线程时,最好将其放在该 cpu 上,以保留为其预热缓存所需的工作量。它也可能认为一个进程(地址空间)的两个线程更有可能共享数据,因此应该更喜欢同一个cpu。

4:根据您的系统,可能有许多性能分析工具可用。顶部,在受 UNIX 启发的系统上是一个简单的工具,它提供系统范围的利用率信息,并且简单的工具 time 将显示一个进程在 cpu 上花费的时间与实际时间的对比。如果您按顺序运行每个任务,注意它们占用的 cpu 时间,然后为它们同时运行计时,这些 cpu 时间之间的比率表示您的并发应用程序的缩放因子。请注意,由于 io 重叠,实际时间可能会产生误导。

【讨论】:

以上是关于并发线程、进程和多核的主要内容,如果未能解决你的问题,请参考以下文章

什么是并发和并行?什么是进程和线程?进程和线程的区别

多核CPU 和多个 CPU 区别 并行和并发 操作系统内存管理模块 进程和线程

Java 多线程与并发:前置知识

进程切换 多线程并发

并发线程/进程的通信

java并发工具学习 01 进程与线程基础