导读
本文介绍多线程的概念。
围绕 CPU、操作系统、进程、并发这些概念,引入线程的概念。
本文内容可参考《计算机组成原理》和《操作系统概述》这两本书籍,笔者在此做一总结。
CPU
**CPU(Central Processing Unit,中央处理器)**是计算机的核心部件,负责执行指令、进行计算和控制系统的运行。
计算机的大脑,决定计算机的性能。
这里仅以抽象的视角谈一下 CPU,不涉及门电路、物理原理、晶体管集成电路等。
CPU 的组成
典型 CPU 由三个主要部分组成:ALU、CU、Register。
- ALU(算术逻辑单元,Algorithm Logic Unit):执行算术运算( + , − , × , ÷ +,-,\times ,\div +,−,×,÷)和逻辑运算(与、或、非、异或)。
- CU(控制单元,Control Unit):解析指令,控制 ALU 以及 CPU 内部其他部件的工作。
- Register(寄存器):可视作 CPU 内部的"内存",是一种高速缓存存储器,用于临时存储数据和指令。
- 指令寄存器:存储当前执行的指令。
- 程序寄存器:存储下一条指令的地址。
- 数据寄存器:存储临时操作的数据。
CPU 工作原理
CPU 的核心任务是执行指令。指令即 CPU 工作的命令,是一串二进制码(机器码)。
指令:告诉 CPU 如何操作以及操作的数据。
程序 = 指令 + 指令操作的数据。
以 C 语言程序为例:
-
程序存储
- C 语言编写的程序是一个文本文件,存储在外存(硬盘)中。
-
程序转换(高级语言 -> 汇编 -> 机器码)
- 计算机无法直接执行文本文件,为了运行 C 程序,首先要生成它对应的二进制文件。
- 预编译 -> 编译 -> 汇编 -> 链接,最终生成 CPU 可执行的机器码。
- 这些步骤由编译器(GCC、Clang)和汇编器完成。
-
程序加载(硬盘 -> 内存 -> CPU)
- 生成的二进制文件仍存储在硬盘中,运行程序时必须加载到内存。
- CPU 通过总线与内存交互,执行一条条指令。
- 这一步由**操作系统(OS)**执行。
总结
- CPU 无法直接与硬盘交互。
- CPU 通过总线与内存通信。
- 计算结果保存在寄存器、内存、缓存中。
操作系统
如果说 CPU 是真正干活的人,那么操作系统就是协调的管理员。
操作系统(OS)是管理系统硬件与软件资源的系统软件。
操作系统协调 CPU、存储器(外存与内存)、输入输出设备等资源,确保多个程序高效运行。
操作系统的类型
操作系统 | 用途 |
---|---|
Windows | 办公、娱乐 |
Linux | 服务器、云计算 |
macOS | Apple 专用 |
Android | 移动端、嵌入式 |
iOS | Apple 移动端设备(iPhone、iPad) |
Unix | 高性能 |
进程
进程的概念
程序是静态的,存储在硬盘上的二进制代码。CPU 运行时,它才会变成动态实例。
进程(Process)是程序执行的实体,包含指令、数据、分配的硬件资源。它是操作系统分配资源(CPU 时间、内存等)的基本单元。
每个进程都有独立的地址空间,并包含以下关键部分:
- 程序代码(Code Segment):存放可执行代码。
- 数据段(Data Segment):存储全局变量和静态变量。
- 堆(Heap):用于动态分配的内存。
- 栈(Stack):存放函数调用、局部变量、返回地址等。
- 进程控制块(PCB, Process Control Block):存储进程的状态、调度信息、打开的文件等。
进程 vs 线程
特性 | 进程(Process) | 线程(Thread) |
---|---|---|
定义 | 资源分配的基本单位 | 调度执行的基本单位 |
资源 | 独立的地址空间、文件、内存 | 共享进程的资源 |
通信 | 进程间通信复杂(IPC) | 线程间通信简单(共享内存) |
创建开销 | 高(需要分配独立资源) | 低(共享进程资源) |
上下文切换 | 开销大 | 开销小 |
适用场景 | 适用于独立的任务(如系统服务) | 适用于并行计算(如多线程下载) |
线程的引入
多进程编程可以实现并发。
但随着计算机多核处理器的发展,传统的进程模型面临如下问题:
- 进程开销大:进程的创建和销毁需要分配独立的资源,开销较大。
- 进程间通信(IPC)复杂:进程需要使用共享内存、管道、消息队列等机制进行通信,效率低下。
- 上下文切换成本高:进程切换需要保存和恢复大量状态信息(如寄存器、页表等)。
为了解决这些问题,引入了**线程(Thread)**的概念。
线程的概念
线程是进程的最小执行单位,同一进程中的线程共享进程的资源(代码段、数据段、堆),每个线程有独立的栈和寄存器。
线程的优势
- 更轻量:线程创建和销毁的开销比进程小。
- 资源共享:同一进程内的多个线程可以共享数据,通信效率高。
- 并发性更强:多个线程可以同时执行,提高多核 CPU 的利用率。
总结
- 进程是资源分配的单位,线程是 CPU 调度的单位。
- 线程比进程更轻量级,适用于高并发任务。
- 多进程适合任务隔离,多线程适合并行计算。