本节算法非常巧妙,现在依然有很多框架底层有借鉴这种算法的思想!
单标志法
算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程 进入临界区的权限只能被另一个进程赋予
turn 的初值为 0,即刚开始只允许 0 号进程进入临界区。 若 P1 先上处理机运行,则会一直卡在 ⑤。直到 P1 的时间片用完,发生调度,切换 P0 上处理机运行。 代码 ① 不会卡住 P0,P0 可以正常访问临界区,在 P0 访问临界区期间即时切换回 P1,P1依然会卡在 ⑤。 只有 P0 在退出区将 turn 改为 1 后,P1才能进入临界区。
因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”
只能按 P0 ->P1 -> P0 -> P1 ->……这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进 入临界区的进程是 P0,而 P0 一直不访问临界区,那么虽然此时临界区空闲,但是并不允许 P1 访问。
因此,单标志法存在的主要问题是:违背“空闲让进”原则。
双标志先检查法
算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又 无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查” 的方法,来避免上述问题。
若按照 ①⑤②⑥③⑦….的顺序执行,P0 和 P1 将会同时访问临界区。
因此,双标志先检查法的主要问题是:违反“忙则等待”原则。
原因在于,进入区的“检查”和“上锁” 两个处理不是一气呵成的。“检查”后,“上锁”前可能发 生进程切换。
双标志后检查法
算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又 无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查” 的方法,来避免上述问题。
若按照 ①⑤②⑥….的顺序执行,P0 和 P1 将都无法进入临界区
因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待” 原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。
两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区 。
Peterson算法
算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔 融让梨”(谦让)。做一个有礼貌的进程。
Peterson 算法用软件方法解决了进 程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则。
Peterson 算法相较于之前三种软件 解决方案来说,是最好的,但依然不够好。