背景
多个进程需要合作完成一个任务,在进程合作过程中,除了并行执行之外,还经常存在两个进程需要共享信息相互等待的协作过程。为了满足上述要求,因此进程之间需要同步。如生产者消费者问题就是一个典型的需要同步的问题。
互斥与临界区问题
竞争条件:多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关。
如何尝试避免竞争条件?资源加锁。
临界资源:把一次仅允许一个进程使用的资源称为临界资源。如只能独享的物理设备(打印机)、共享变量等等。
临界区:在每个进程中,访问临界资源的那段程序称为临界区。
如何进入临界区:互斥进入(这是临界区进入的基本原则和正确性保证),还需要考虑有空闲时进入,以及从请求进入到被允许进不能无限等待
临界区问题的解决
即如何进入和退出临界区以达到进程互斥和同步的目的
一般软件法
轮换法
满足互斥但是不满足空闲进入,即A进程离开临界区后即使B没有到达临界区也不能再次进入临界区。必须轮流进入
标记法
进入临界区就做一个标记,后者根据标记决定是否进入临界区。但是由于时间片的切换,有可能导致两者同时标记了进入临界区但是没能成功进入,这就会导致无限等待。
Peterson算法
结合了标记和轮转两种方法,每个进程包含一个flag标记,此外还含有轮转标记。
- 满足互斥进入
以2个进程为例:如果不互斥,需要满足flag[0] =&