文章目录
- 一、临界与同步
- 1、临界资源与临界区
- 2、进程同步
- 3、信号量实现进程同步
- 二、进程互斥
- 1、进程互斥的软件实现方法
- 2、进程互斥的硬件实现方法
- 3、信号量实现互斥
- 4、信号量进程互斥
- 三、经典同步问题(4个)
一、临界与同步
1、临界资源与临界区
在计算机中,有些资源允许多个进程同时使用,如磁盘;而另一些资源只能允许一个进程使用,如打印机、共享变量。如果多个进程同时使用这类资源,就会引起激烈的竞争。操作系统必须保护这些资源,以防止两个或者两个以上的进程同时访问它们。
那些在某段时间内只允许一个进程使用的资源就称为临界资源。
而每个进程中访问临界资源的那段程序就称为临界区。
2、进程同步
进程同步是指多个进程中发生的事件存在着某种时序关系,必须协同动作,相互配合,以共同完成一个任务。进程同步的主要任务是使并发执行的诸各个进程有效地共享资源和相互合作,从而使程序的执行具有可再现性。
进程同步一种直接制约关系。这种用法比进程之间的互斥知道对方的程度要高,因为进程之间需要合作。
3、信号量实现进程同步
semaphore S = 0;
P1()
{
一些操作代码...;
x;
V(S)
}
P2
{
P(S);
Y;
}
二、进程互斥
1、进程互斥的软件实现方法
2、进程互斥的硬件实现方法
(1)中断屏蔽方法
关中断;
临界区;
开中断;
中断屏蔽的特点:
- 限制了CPU交替执行能力
- 用户能力变大,甚至可以控制中断
(2)硬件指令方法
boolean TestAndSet(boolean *lock)
{
boolean old;
old = *lock;
*lock = true;
return old;
}
while (TestAndSet(&lock));
{
临界区代码段;
lock = false;
进程其他代码;
}
-
TestAndSet特点:
-
Swap指令
Swap(boolean *a, boolean *b)
{
boolean temp;
temp = *a;
*a = *b;
*b = temp;
}
Main
{
key = true;
while(key!=false)
Swap(&lock, &key);
进程临界区代码段;
lock = false;
进程的其他代码段
}
- Swap指令特点:
3、信号量实现互斥
wait(S)
{
while(S<=0);
S--;
}
signal(S)
{
S++;
}
typedef struct
{
int value;
struct process *L;
}semaphore;
void wait(semaphore S)
{
S.value --;
if(S.value < 0)
{
add this process to S.l;
block(S.L);
}
}
void signal (semaphore S)
{
S.value++;
if(S.value > 0)
{
remove a process P from S.L;
wakeup(P);
}
}
4、信号量进程互斥
semaphore S = 1;
P1()
{
...;
P(S);
进程P1的临界区;
V(S);
}
P2()
{
P(S);
进程P2的临界区;
V(S);
}
三、经典同步问题(4个)
小tip:统一把P理解为消耗,V理解为释放。
主要有以下4个经典进程同步问题:
关于这四个问题的具体分析,在下一篇文章中:
操作系统知识点大总结【4大经典同步问题:生产者消费者问题、读者写者问题、哲学家进餐问题、睡眠的理发师问题】
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)