并发相关术语:
- 原子操作:一个或多个指令的序列,对外是不可分的;即没有其他进程可以看到其中间状态或者中断次操作。
- 临界区:是一段代码,在这段代码中进程将访问共享资源,当另外一个进程已经在这段代码中运行时,这个进程就不能在这段代码中执行。
- 死锁:两个或两个以上的进程因其中的每个进程都在等待其他进程做完某件事情而不能执行,这样的情形叫做死锁。
- 活锁:两个或两个以上的进程为了响应其他进程的变化持续改变自己的状态但不做有用的工作,这样的情形叫做活锁。
- 互斥:当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源,这样的情形叫做互斥。
- 竞争条件:多个线程或进程在读写一个共享数据时,结果依赖于它们执行的相对时间,这种情形叫做竞争。
- 饥饿:是指一个可运行进程尽管能继续执行,但被调度器无限期的忽略, 而不能被调度执行的情况。
以下将对这些概念详细解释。
原子操作:
死锁:考虑两个进程P1和P2,以及两个资源R1和R2。假设每个进程为执行部分功能都需要访问这两个资源,那么就有可能出现下列情况:操作系统把R1分配给P1,把R2分配给P2,每个进程都在等待另外一个资源,且在获得其他资源并完成功能前,谁都不会释放自己已经拥有的资源。这两个进程发生死锁。
饥饿:假设三个进程P1、P2、P3,每个进程都周期性的访问资源R。考虑这种情况:P1拥有资源,P2和P3都被延迟,等待这个资源。当P1退出它的临界区时,P2和P3都被允许访问R,假设操作系统把访问权授予P3,并且在P3临界区完成之前P1又需要访问该临界区。如果P3结束后,操作系统又把访问权限交给P1,接下来又把R轮流交给P1,P3,此时没有死锁,P2也无法获得资源,此时P2为饥饿。
竞争条件:假设两个进程P1、P2共享全局变量a,在某一执行时刻,P1更新a为1,在执行另外一个时刻,P2更新a为2。因此两个任务竞争更新变量a。竞争的“失败者”(也就是最后更新全局变量a的进程)决定了变量a的最终值。
TODO。。。