跳转至

HW6

进程同步

概念

同步与互斥可以从 资源冲突和时序冲突来理解

image-20260414144153691

这里 关于变量x AB进程都有读写改变 则关于x产生了资源冲突 可以发现 只用满足 A B 不同时写x即可 这既是关于资源的互斥

image-20260414144324697

这里 free需要唤醒处于等待状态的进程 但是free的调用在设置等待进程前 由此 free永远无法等到处于等待的进程 也即是 永远等待 时序发生错乱

这里明确的 必须先alloc设置一个等待进程 再调用free 唤醒等待进程 即 关于时序问题 需要存在一个时序的同步


上述被共同使用的资源被称为临界资源 对应代码称为临界代码

image-20260414144646891

几个基本原则

实现

实现互斥的算法

软件方法

image-20260414145040304

Dekker Algorithm

image-20260414151410469

Peterson Algorithm

image-20260414151419608

用flag变量代表临界态进入意愿 turn表示当前优先级 Dekker算法和Peterson算法都是优先谦让的思路

硬件方法

把锁/解锁设置为硬件态的原子行为

从自旋锁 -> 互斥锁解决了忙等的问题


作业

1

image-20260414152131456

P1的循环中 只给flag写了值 没有写turn 所以P1永远处于while循环 P0永远等待while循环

2.

image-20260414152323458

P0 P1同时进入循环 但由于turn为0 flag[1]先被写为false 从而P0先退出while循环 然后由于flag[0]为true flag[1]被写为true 此时P0运行临界代码 再给turn写为1 此时flag[0]写为flase P1退出循环 随后trun写为0 flag[1]写为false 重置状态

但是如果P0在P1执行临界前 写了flag[0]=true 覆盖原本的flag[0]=false就会让P1卡死在循环当中

3.

image-20260414152828503

turn初始写为0 那么优先进行P1中的循环 此时flag[1]写为false 再写回true 死循环了?