《操作系统导论》第10章读书笔记:多处理器调度(高级)
—— 杭州 2024-03-26 夜
文章目录
- 《操作系统导论》第10章读书笔记:多处理器调度(高级)
- 1.背景:多处理器架构
- 2.别忘了同步
- 3.最后一个问题:缓存亲和度
- 4.单队列调度和多队列调度
- 5.Linux多处理器调度和小结
- 6.补充笔记:多线程和多进程在单核CPU和多核CPU上的并行和并发情况况(GPT第一次回答)
- 单核CPU上的多线程和多进程
- 多核CPU上的多线程和多进程
- 总结
- 7.补充笔记:多线程和多进程在单核CPU和多核CPU上的并行和并发情况(GPT第二次回答)
- 单核CPU
- 多核CPU
1.背景:多处理器架构
2.别忘了同步
3.最后一个问题:缓存亲和度
4.单队列调度和多队列调度
5.Linux多处理器调度和小结
6.补充笔记:多线程和多进程在单核CPU和多核CPU上的并行和并发情况况(GPT第一次回答)
在讨论多线程和多进程在单核和多核CPU上的并行和并发情况时,重要的是要理解“并行”和“并发”的区别:
-
并行(Parallelism):是指两个或更多任务同时执行。在多核CPU中,可以实现真正的并行,因为不同的核可以同时执行多个任务。
-
并发(Concurrency):是指管理多个同时处于开启状态的任务的能力。在单核CPU中,任务被快速地切换执行,给人一种多任务同时进行的错觉。
单核CPU上的多线程和多进程
在单核CPU上,无论采用多进程还是多线程,都只能实现并发,而不是真正的并行。
-
多线程:在单核CPU上,多线程是通过时间片轮转或其他调度技术实现的。这意味着线程会被操作系统快速切换执行,每个线程运行一小段时间后让出CPU给其他线程。尽管看起来像是同时在执行,但实际上在任何给定的时间点,CPU只执行一个线程的任务。
-
多进程:与多线程类似,多进程在单核CPU上也只是并发执行。操作系统会在不同的进程间进行上下文切换,以允许每个进程交替地使用CPU资源。同样,进程切换会给系统带来一定的开销。
多核CPU上的多线程和多进程
在多核CPU上,可以实现真正的并行处理。
-
多线程:如果一个应用程序创建了多个线程,现代操作系统可以将这些线程分配给不同的CPU核心,从而实现并行执行。这样,线程之间可以同时运行,加速任务的完成。但并行也引入了新的挑战,例如线程同步和数据一致性问题。
-
多进程:多核CPU同样可以让多个进程并行运行,每个核心上运行一个独立的进程。这提高了应用程序的性能和响应能力,特别是对于计算密集型的任务。由于每个进程拥有独立的地址空间,这也减少了进程间的干扰和潜在的错误传播。
总结
- 在单核CPU上,无论是多线程还是多进程,我们都只能实现并发,因为任务实际上是交替执行的。
- 在多核CPU上,我们可以实现并行,因为可以有多个任务(线程或进程)在同一时间内在不同的核上运行。
并行和并发都可以提高程序的性能,但必须通过适当的同步机制来管理,以避免竞态条件、死锁等多任务处理中常见的问题。
7.补充笔记:多线程和多进程在单核CPU和多核CPU上的并行和并发情况(GPT第二次回答)
在解释多线程和多进程在单核和多核CPU上的并行和并发情况之前,让我们先定义并行和并发的含义:
- 并发(Concurrency): 是指系统能够处理多个任务的能力;在单个核心的CPU上,它通过任务间快速切换(上下文切换)来实现,给用户一种同时执行多个任务的感觉。
- 并行(Parallelism): 是指系统同时进行多个任务的能力;在多个核心的CPU上,不同的核心可以同时执行不同的任务。
下面是一个表格,概述了多线程和多进程在单核和多核CPU上的并行和并发性:
CPU类型 | 多线程 | 多进程 |
---|---|---|
单核CPU | 并发执行(通过线程间的快速切换) | 并发执行(通过进程间的快速切换) |
多核CPU | 并行执行(如果有足够的核心,线程可以同时运行) | 并行执行(如果有足够的核心,进程可以同时运行) |
单核CPU
-
多线程:
- 并发: 是的。单核CPU可以在不同的线程间进行快速切换,从而实现并发。
- 并行: 否。由于只有一个核心,不能真正同时执行多个线程。
-
多进程:
- 并发: 是的。同样,单核CPU可以在不同的进程间进行快速切换,提供并发执行能力。
- 并行: 否。单核中的进程无法真正并行执行。
多核CPU
-
多线程:
- 并发: 是的。多线程非常适合多核CPU,因为可以在不同的核心上同时运行多个线程。
- 并行: 是的。当有多个核心时,可以真正同时运行多个线程,实现并行。
-
多进程:
- 并发: 是的。多进程也可以实现并发,操作系统可以在多个核心之间分配进程。
- 并行: 是的。与多线程相同,多个进程可以在多核CPU的不同核心上并行运行。
在选择多线程或多进程时,应考虑其他因素,如共享数据的需求、上下文切换的开销、内存使用、开发复杂性等。多线程共享同一进程的内存空间,这使得线程间的数据共享更简单,但也可能带来同步复杂性。而多进程则拥有各自独立的内存空间,这提供了更好的隔离性,但数据共享更为复杂,通常需要使用进程间通信(IPC)机制。