操作系统进程互斥算法

1.Dekker

BOOLEAN flag[2] = { false };
int turn = 0;
void Lock(int id)
{
	//dekker
	flag[id] = 1;
	while (flag[(id + 1) % 2])
	{
		if (turn == (id + 1) % 2)
		{
			flag[id] = 0;
			while (turn == ((id + 1) % 2));
			flag[id] = 1;
		}
	}
}
void unLock(int id)
{
	/*实现方法二,Dekker或Peterson互斥算法*/
	turn = (id+1)%2;
	flag[id] = 0;
}

2.Peterson算法

BOOLEAN flag[2] = { false };
int turn = 0;
void Lock(int id)
{
	//peterson
	flag[id] = true;
	turn = (id + 1) % 2;
	while (flag[(id + 1) % 2] && turn == (id + 1) % 2);
}
void unLock(int id)
{
	flag[id] = false;
}

3.Lamport算法

BOOLEAN choosing[g_totalThreads] = { false };
int num[g_totalThreads] = { 0 };
void Lock(int id)
{
		choosing[id] = 1;
		int m = 0;
		for (int i = 0; i < g_totalThreads; i++)
			if (num[i] > m)
				m = num[i];
		num[id] = m + 1;
		choosing[id] = false;
		for (int j = 0; j < g_totalThreads; j++)
		{
			while (choosing[j]);
			while (num[j] != 0&&(num[j]<num[id]||(num[id]==num[j]&&(j<id))));
		}
	
}
void unLock(int id)
{

	num[id] = 0;
}

4.EM

enum k{idle,want_in,in_cs};
k flag[g_totalThreads] = { idle };
int turn = 0;
int j = 0;
void Lock(int id)
{
	do
	{
		flag[id] = want_in;
		 j = turn;
		while (j != id)
			if (flag[j] != idle)
				j = turn;
			else
				j = (j + 1) % g_totalThreads;
		flag[id] = in_cs;
		j = 0;
		while ((j < g_totalThreads) && (j == id || flag[j] != in_cs))
			j++;
	} while (j != g_totalThreads);
	turn = id;
	
	
}
void unLock(int id)
{
	j = (turn + 1) % g_totalThreads;
	while (flag[j] == idle)
		j = (j + 1) % g_totalThreads;
	turn = j;
	flag[id] = idle;
}
操作系统进程互斥算法设计是确保多个并发执行的进程在访问共享资源时避免冲突的关键技术。主要目标是保证一次只有一个进程能使用该资源,从而维护数据的一致性和完整性。常见的互斥算法有以下几种: 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
发出的红包

打赏作者

不停---

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值