linux并发同步之基础概念(竞态,并发,临界区)
2015-09-08 21:05
351 查看
竞态(race condition)
软件层面上,竞态是指多个线程或进程读写一个共享资源(或共享设备)时的输出结果依赖于线程或进程的先后执行顺序或者时间;(更权威的介绍可以看wiki--https://en.wikipedia.org/wiki/Race_condition).至于为什么会发生竞态呢?很简单,因为并发,并发使多线程,多进程环境变成可能。
竞态具体场景:假如我们有2个进程会对一个全局变量进行++操作,理想时,程序会这样执行:
Thread 1 | Thread 2 | | Integer value |
| | | 0 |
read value | | ← | 0 |
increase value | | | 0 |
write back | | → | 1 |
| read value | ← | 1 |
| increase value | | 1 |
| write back | → | 2 |
Thread 1 | Thread 2 | | Integer value |
| | | 0 |
read value | | ← | 0 |
| read value | ← | 0 |
increase value | | | 0 |
| increase value | | 0 |
write back | | → | 1 |
| write back | → | 1 |
并发(concurrency)
并发(concurrency)指的是多个执行单元同时、并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局、静态变量)的访问则容易导致竞态(race conditions),可能导致并发(即竞态?)的情况有:1)SMP(Symmetric Multi-Processing),对称多处理结构。SMP是一种紧耦合、共享存储的系统模型,它的特点是多个CPU使用共同的系统总线,因此可访问共同的外设和存储器。
2)中断.中断可以打断正在执行的进程(哪怕是在中断上下文),若中断处理程序对共享资源进程访问,则竞态也会发生.
3)内核抢占.2.6以后内核提供了内核可抢占特性,虽然是作为一个配置选项,但我们写程序时还是要考虑周全,故内核抢占也是作为伪并发的表现,也可能发生竞态;
临界区(critical section)
多个线程进程对共享资源进行访问在软件表现为一个程序片段,如何避免竞态的发生呢?一个执行路径在对共享资源进行访问时禁止其他执行路径进行访问,当有一个执行路径(A)对共享资源进行访问时,如有其他执行路径想访问共享资源,须睡眠等待A执行路径退出。那么这时这个程序片段就是临界区。那么具体如何来实现临界区呢?linux内核提供了多种同步互斥机制.(如信号量,互斥量,自旋锁,RCU,原子操作等).相关文章推荐
- Linux socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- 使用 Syncthing 在多个设备间同步文件
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量