进程互斥算法

进程互斥需要遵循的四个原则:

空闲让进,忙则等待,有限等待,让权等待

单标志法

设置一个标志表示当前允许进入临界区的进程号:

int turn =0;

p0进程:

while(turn!=0);//判断进程号是否是0,如果不是的话就卡在while循环这里。

critical section//进入临界区

turn=1;

remainder section//离开临界区

p0进程:

while(turn!=1);//判断进程号是否是0,如果不是的话就卡在while循环这里。

critical section//进入临界区

turn=0;

remainder section//离开临界区

缺点:如果turn 的初值是0,但是P1先上处理机,就会一直卡在循环的地方。可以实现“同一时刻只允许一个进程访问临界区”,但是无法满足空闲让进的原则。

双标志先检查法

先检查是否有访问临界区的意愿,有的话再上锁。

p0:

while(flag[1]);//如果p1进程想进入临界区,那么p0进程就必须等在这里(1)

flag[0]=ture;(2)

critical section;(3)

flag[0]=false;(4)

remainder section;

p1:

while(flag[0]);//如果p0进程想进入临界区,那么p1进程就必须等在这里(5)

flag[1]=ture;(6)

critical section;(7)

flag[1]=false;(8)

remainder section;

但是如果程序执行的顺序是:(1)(5)(2)(6)(3)(7),那么两个进程会同时进入临界区,无法满足忙则等待的原则。

双标志后检查法

上面是先检查对方的意愿,再表达自己的意愿,后检查法则是先表达自己的意愿,再检查对方的意愿。

p0:

flag[0]=ture;(1)

while(flag[1]);(2)

critical section;(3)

flag[0]=false;(4)

remainder section;

p1:

flag[1]=ture;(5)

while(flag[0]);(6)

critical section;(7)

flag[1]=false;(8)

remainder section;

但是如果程序执行的顺序是(1)(5)(2)(6),那么两个进程就会互相谦让,谁都无法执行,不满足空闲让进和有限等待的原则,会产生“饥饿”现象。

peterson算法

结合单标志法、双标志法,主打一个孔融让梨的思想。

bool flag[2];

int turn =0;

p0:

flag[0]=ture;

turn=1;//如果p0进程想进临界区,那么它会先允许p1进入临界区

while(flag[1]&&turn==1);//如果p1也想进入临界区,那么p0就必须等待,否则可以进入临界区

critical section;

flag[0]=false;

remainder;

p1:

flag[1]=ture;

turn=0;//如果p1进程想进临界区,那么它会先允许p0进入临界区

while(flag[0]&&turn==0);//如果p0也想进入临界区,那么p1就必须等待,否则可以进入临界区

critical section;

flag[0]=false;

remainder;

peterson算法符合空闲让进、忙则等待、有限等待的原则,但是仍未满足让权等待(无法访问临界区则下处理机)的原则,并且在乱序执行的CPU上不一定正确。

操作系统进程互斥算法设计是确保多个并发执行的进程在访问共享资源时避免冲突的关键技术。主要目标是保证一次只有一个进程能使用该资源,从而维护数据的一致性和完整性。常见的互斥算法有以下几种: 1. **PV操作(P-V操作)**:这是最基础的互斥算法,包括P操作(请求进入临界区)和V操作(释放已获得的锁)。当进程请求进入临界区时,会尝试获取锁(P操作),如果锁被其他进程持有,则进程阻塞,直到锁被释放。当进程离开临界区时,它会释放锁(V操作),让其他等待的进程有机会进入。 2. **忙等(Busy Waiting)**:是最简单的策略,但效率低下,因为CPU在等待期间无法执行其他任务。这种做法在现代操作系统中很少使用,因为它是低效的且浪费了系统资源。 3. **信号量(Semaphore)**:一种更高级的同步机制,使用一个计数器来控制对资源的访问。当资源可用(计数器大于0)时,P操作会递减计数器;V操作则增加计数器。当计数器为0时,进程会被阻塞。 4. **自旋锁(Spin Lock)**:这是一种特殊的信号量,当资源被占用时,等待的进程不停循环检查锁是否变为可用,直到获取为止。这种方式在锁竞争不频繁时可以节省上下文切换时间,但当竞争激烈时,会导致CPU利用率降低。 5. **读写锁(Reader-Writer Lock)**:针对读操作多于写操作的情况,允许多个读进程同时进入临界区,而写进程需要独占资源。这样提高了并发性能,尤其是在大量读取较少写入的场景。 6. **互斥量(Mutex)**:这是最常见的互斥算法,用作保护单个资源。当一个进程获得了互斥量,其他所有尝试获取该锁的进程都会被阻塞,直到第一个进程释放。 相关问题: 1. PV操作是如何避免死锁的? 2. 自旋锁适合什么样的应用场景? 3. 读写锁在哪些情况下比互斥锁更有效?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值