01、并发与竞争场景
一、基本概念
① 什么是执行单元?
操作系统中能运行的代码主要有两种:
- 内核态线程(内核级任务)
- 中断处理函数(处理硬件信号的代码) 这些执行代码统称为系统的"可执行单元"。
② 什么是共享资源 任何可以被多个执行单元同时访问的资源,都叫共享资源。 比如:一块内存区域、一个文件、打印机等。
③ 什么是临界资源 临界资源是特殊的共享资源,它有个重要特点: 同一时间只能被一个执行单元使用 比如:正在被编辑的文件、正在打印的打印机。
④ 什么是临界区 当执行单元要操作临界资源时, 访问该资源的那段代码就叫做临界区。 就像排队时,你拿到打印机使用权到打印完成之间的这段操作
⑤ 什么是 SMP(对称多处理) SMP是一种多CPU工作模式,特点如下:
- 多个CPU像"兄弟"一样平等工作
- 共享同一内存和硬件设备
- 通过共同的系统总线通信
- 就像多个同学共用同一台电脑和打印机)
二、什么是并发与竞态
并发就是多个任务同时运行。比如多个程序或程序内的不同部分看起来像同时执行,实际可能是在处理器快速切换中交替运行。
并发容易引发竞争问题。当多个任务同时访问共享资源(如全局变量或硬件设备)时,可能会出现数据混乱。竞争问题的三个必要条件:
- 多个任务存在:比如程序里的不同线程、后台进程或中断请求
- 共享资源存在:所有任务都能访问的公共数据或硬件设备
- 同时访问:多个任务在不同时刻读写同一个资源
简单来说,就像两个人同时修改同一张纸上的数字,如果没有协调机制,结果就会出错。
三、并发产生的场景
3.1、多CPU之间的并发
当两个程序分别在CPU_A和CPU_B上运行时,如果它们同时尝试访问同一个共享资源,就会引发资源争夺问题。
3.2、单CPU之间进程间的并发
现在的操作系统能同时运行多个程序(进程)。这些程序不会一直霸占CPU直到自己结束,而是像轮流坐庄一样:每个程序会被分配一定的时间段(时间片),当时间用完后,操作系统就会切换到另一个程序运行。
当两个程序(比如A和B)需要同时访问同一个共享资源(比如一个文件或数据)时,就会出现竞争问题(竞态)。因为操作系统随时可能切换程序的执行顺序,可能导致两个程序同时修改共享资源而引发混乱,比如数据错误或冲突。
3.3、单CPU上进程和中断之间的并发
当一个程序正在运行时,如果硬件设备发出中断信号,操作系统会立刻暂停该程序,转去处理中断事件。
如果此时程序和中断处理程序同时需要操作同一个共享资源(比如数据或设备),就会产生资源访问冲突。
3.4、单CPU上中断之间的并发
在Linux系统中:
- 上半部处理中断时,系统会暂时关闭其他中断;
- 下半部处理任务时,系统允许其他中断正常发生。
问题就可能出现在下半部运行时: 当下半部正在操作某个关键数据(比如读写共享内存)时,如果有新的硬件中断发生:
- 这个新中断会被立即响应并打断当前下半部的执行
- 如果这个新中断恰好也在操作同一个关键数据 就会造成两个代码段同时争夺资源,出现竞争条件(比如数据错乱或程序崩溃)。
就像两个人同时修改同一份文档,如果没有任何保护机制,就可能改乱内容。
3.5、多CPU中断与中断之间
CPU A产生了中断执行的中断处理函数与CPU_B产生了中断执行的中断处理函数,访问的临界资源是同一个临界资源,这样就产生了竞态。