multithreading - 多处理器和多核处理器的用途
问题描述
我确实想澄清我脑海中的事情并为具体知识建模。双核一处理器系统,每个内核只能同时执行一个进程内的两个线程。具有两个处理器系统的单核,每个 CPU 可以执行两个不同的进程。所以我们可以说,每个处理器都可以同时执行进程。多核处理器同时在进程中执行线程?
解决方案
我认为您对什么是进程和线程以及它们与硬件本身的关系存在根本性的误解。
CPU 内核每个时钟周期只能执行 1 条机器级指令(因此本质上,只有 1 条汇编指令)。CPU 通常是通过它们在一秒钟内经历的时钟周期数来衡量的。因此,一个 2.5 GHz 的内核每秒可以执行 25 亿条指令。
操作系统(操作系统,如 Windows、Linux、macOS、Android、iOS 等)负责启动程序并允许它们访问硬件资源。每个程序都可以被认为是一个“进程”。
每个进程可以启动多个线程。
为了确保多个进程可以共享相同的硬件资源,40 多年前出现了抢先计算的想法。
简而言之,抢先计算或时间片是操作系统的一项功能。它基本上为每个正在运行的线程提供几毫秒的时间,无论该线程属于哪个进程,并保留每个线程的“上下文”,以便在该线程时可以适当地处理每个线程的状态跑步; 这也称为上下文切换。
双核、四核甚至 128 核 CPU 不会改变这一点,系统中 CPU 的数量也不会改变(例如,4 个 CPU,每个 CPU 有 128 个核)。每个内核每个时钟周期只能执行 1 条指令。
改变的是可以真正并行运行多少条指令。如果我的 CPU 有 16 个内核,那么这意味着它每个时钟周期可以执行 16 条指令,因此运行 16 个单独的执行线程而无需任何上下文切换(尽管它仍然会发生,但这是一个不同的问题)。
这不包括超线程,其中 1 个内核每个周期可以执行 2 条指令,实质上是 CPU 数量的两倍,并且不包括缓存未命中的想法或其他可能花费额外周期的低级想法在线程上,但它涵盖了 CPU 调度的一般概念。
推荐阅读
- rust - 使用兄弟姐妹时如何理解 lib.rs 中的 mod xxx
- python - 为什么我的 tkinter 文本条目突然消失了?
- javascript - SwaggerTools 总是导致 Express 将 JSON 对象获取为未定义
- react-native - 运行 onChangeText 不能正确更新 TextInput 值
- c++ - 使用 C++20 多态 Lambda 函数时出错
- c++11 - 在 C++ 中重新散列单独的链接,对链表的向量
- python - 如何进行网页抓取
里面的标签
使用 Python 具有来自 HTML 的类/ID 的标签 - python - 时间序列根据每天的价值自动标记
- matlab - Matlab 自定义富文本编辑器
- ruby-on-rails - 管理与类名关系的 gem 弃用