进程同步、互斥的基本概念
系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
进入区和退出区是负责实现互斥的代码段。
临界区是进程中访问临界资源的代码段。
进程互斥的原则:
1. 空闲让进:
临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
2. 忙则等待:
当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
3. 有限等待:
对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
4. 让权等待:
当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
进程互斥的软件实现方法
单标志法
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 算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则。
增加一个标志位 int turn=0来表示谦让,turn等于几,就表示优先让那个进程进入临界区。
P0进程解读:先表达P0想要进入临界区的意愿,然后再谦让一下,让P1先进,然后检查,如果P1想进并且此时turn=1,那么让P1进入临界区,P0一直等待。如果不满足(flag[1]==1&&turn=1),那么P0进入临界区。
分析一下,如果是①②③⑥⑦⑧…
如果是①②③⑥⑦⑧…
P0先说自己想进,然后谦让让P1先进,但此时P1不想进,所以P0进入临界区,若此时⑥执行,那就是P1说他想进了,然后P1谦让让P0先进,P1循环检查时发现此时的条件是(P0想进,并且此时turn=0)所以P0继续访问,P1等待,直到P0访问完改成P0不想访问了,P1才能继续访问。(所以说Peterson算法实现了互斥访问即“忙则等待”)
turn有一个最新值,turn等于最后一次赋值。
如果是①⑥②③...
P0说P0想进,然后P1说P1想进,然后P0说P1先进,然后P1说P0先进,最后turn=0,等到P0检查时条件为(P1想进,但turn=0,不等于1)所以P0先访问临界区。P1一直等,P0访问完后,改成P0不想进,然后P1进去临界区。(体现了“忙则等待”、有限等待)
但是没有实现“让权等待”,当P0不能进入临界区时,P1只能忙等。
回顾一下四个原则:
1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
4. 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
🌏Peterson 算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则。