MIT_6.031之并发
MIT_6.031之并发
目标
- 理解并发的消息传递和共享内存模型。
- 区分并发进程和线程,以及时间分片(Time Slicing)的概念。
- 识别条件竞争(Race Conditions)的危险性。
并发的概念
- 并发意味着同时进行多个计算,现代编程中处处可见并发现象,例如:
- 网络中的多台计算机:多个用户同时访问服务器。
- 一台计算机上运行的多个应用程序:同时运行多个应用程序,互不干扰。
- 多核处理器:现代计算机通常在单个芯片上集成多个处理器核心,能够同时处理多个任务。
- 并发在现代编程中至关重要,主要体现在以下方面:
- 网站需要同时处理多个用户请求。
- 移动应用程序需在服务器上并行处理数据。
- 图形用户界面(GUI)需要在不打断用户体验的情况下执行后台任务。
并发编程模型
并发编程主要有两种模型:共享内存和消息传递。
共享内存(Shared Memory)
定义:并发模块通过在内存中读写共享对象进行交互。
特点:
- 同一台计算机:多个处理器(如 A 和 B)可以共享相同的物理内存。
- 运行在同一程序:在同一 Java 程序中,多个线程可以共享同一对象。
优点:
- 访问速度快,因为数据在内存中共享。
缺点:
- 需要额外的同步机制以避免数据不一致(如互斥锁、信号量)。
消息传递(Message Passing)
定义:并发模块通过使用通信通道相互发送消息来进行交互。
特点:
- 不同计算机:如网络中的 A 和 B 通过网络进行通信。
- 客户端与服务器:Web 浏览器向 Web 服务器发送请求,服务器返回数据。
优点:
- 简化了并发编程,因为每个模块只关心自己的消息。
缺点:
- 相较于共享内存,消息传递的开销可能更大。
进程和线程
并发模块本身分为两种:进程(Process)和线程(Thread)。
进程(Process)
定义:进程是正在运行的程序实例,与其他进程隔离,拥有自己的内存空间。
特征:
- 进程具有独立的地址空间,每个进程都有自己的虚拟内存,确保了进程之间的隔离。
- 进程间不直接共享内存,通信通常通过消息传递或文件系统实现。
创建与管理:
- 每当启动一个程序时,操作系统会为该程序创建一个新的进程,赋予其必要的资源。
- 进程的创建、调度和终止都由操作系统负责。
优点:
- 进程之间相对隔离,提高了安全性和稳定性。
缺点:
- 进程间通信开销大,尤其是在涉及到上下文切换时。
线程(Thread)
定义:线程是进程中的执行单位,多个线程共享同一进程的资源,包括内存和文件句柄。
特征:
- 线程之间可以直接共享内存和数据,因为它们属于同一进程。
- 创建和销毁线程的开销通常小于进程。
创建与管理:
- 线程可以被看作是轻量级的进程,操作系统调度线程以进行并发执行。
- 在 Java 中,可以通过实现
Runnable
接口或继承Thread
类来创建线程。
优点:
- 由于共享内存,线程间通信非常高效。
- 适合于需要大量并发的任务,如图形用户界面和网络服务器。
缺点:
- 由于共享内存,线程间可能会产生数据竞争(Race Condition),需要额外的同步机制以防止此类问题。
时间分片(Time Slicing)
定义:时间分片是一种多任务调度策略,操作系统将 CPU 时间划分成小片段(称为时间片),每个进程或线程在其分配的时间片内执行。
特征:
- 时间片的长度通常很短,确保系统能够快速响应用户输入。
- 在时间片用完后,操作系统会暂停当前线程,并将 CPU 分配给其他线程或进程。
优点:
- 提高了系统的响应速度,用户感觉系统在同时处理多个任务。
缺点:
- 频繁的上下文切换可能导致系统开销增大,影响性能。
条件竞争(Race Conditions)
定义:条件竞争是指两个或多个线程或进程同时访问共享数据并试图改变其状态,导致不可预测的结果。
危险性:
- 条件竞争可能导致数据损坏或错误的计算结果,因为没有适当的同步机制来保护对共享资源的访问。
避免条件竞争:
- 使用同步机制(如互斥锁、信号量)来确保在任何时刻只有一个线程可以访问共享资源。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论