0引言
操作系统作为计算机专业学生的必修课程,是非常重要的一门核心课程。 笔者在操作系统教学过程中发现在所有的章节中,进程的互斥与同步是学生最难掌握的部分。本文详细分析了学生在进程互斥与同步学习过程中遇到的常见问题,并提出解决方法。
1进程互斥与同步概念
现代操作系统的三个主要特征是并发性、资源共享和异步性。 所谓并发性是指两个或多个活动在同一时间间隔内发生,在多道程序环境下是指在一段时间内可有多道程序同时运行。正是由于并发机制才导致了程序的执行不可预测,并发性又是系统能够实现资源共享的必要条件。系统中的多个并发进程之间因为共享资源而形成两种相互制约关系:间接制约关系———互斥,直接制约关系———同步。
1.1 进程互斥
是进程间的一种间接制约关系, 他们并不知道其他进程的存在。例如,在批处理系统中,系统分别为各个作业建立了进程;在分时系统中,系统分别为每个用户建立了一个进程。 这些进程同处于一个系统中,必然存在资源共享的关系。 由于某些资源的属性要求一次只能有一个进程访问,我们称这样的资源为临界资源。
由于系统不能允许多个进程同时访问临界资源,所以进程间必然产生对资源的竞争。因此,互斥直观理解就是一种竞争关系。例如一个学生宿舍房间内的洗漱间使用问题;显然,洗漱间在没有人使用时(可以看成初始状态),对于任何一个同学都是可用的,其洗漱间的信号量初值应当为 1(表达一种状态,也可以看成资源的数目,不过作为一种状态更恰当),见图 1。
1.2 进程同步
多个进程知道彼此的存在,更多的表现出一种合作关系。 此时要保证相互合作的多个进程在执行次序上的协调,不能出现与时间有关的错我。 系统中多个进程间发生的时间存在某种时序关系,需要相互合作,共同完成一项任务。进程间的这种关系称为进程同步。例如学校运动会中接力竞赛问题;见图 2.,显然,任何一组由 4 人组成的参赛队只有在发令员发令(看成初始状态)之后,第 1 个人才能跑,其他 3 人是顺序接力的, 不可能是 4 个人都可以同时跑,4 个人之间是同步关系,即在初始状态(各就位)只有第 1 个人可以跑,其他人是不可以的,要等待(“通知”)。
2信号量的概念和含义
信号量是一个记录型的数据结构,它有两个数据项。
Struc semaphore
{
int value;
pointer_PCB queue;
}S;
信号量的物理含义:在进程互斥的情况下,信号量可以看成是一把锁;在进程同步的情况下,信号量可以代表一种资源的使用权,信号量的值大于 0 时表示系统中某类可用的资源的数目, 当其值小于 0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。 除了初始化外,对信号量只能有两个操作:P(S)操作和 V(S)操作。 这两操作定义为:
其中 P 操作物理含义为申请资源的操作, 每执行一次 P 操作,信号量的值就会减一, 表明可用的资源少了一个;V 操作的物理含义为释放资源的操作,每执行一次 V 操作,信号量的值就会加一,表明可用的资源数增加了一个。
3学生在运用信号量解决问题时常见问题
3.1 分不清楚进程之间的关系
进程之间的关系是要解决的根本问题,如果前期进程之间的关系分析不清楚,后续解题过程一定的错误的。
例题 1:某条河上只有一座独木桥,以便行人过桥。 现在河的两边都有人要过桥,过桥规则:同一方向的可以连续过桥;一方有人过桥另一方的人要等待。 该问题是非常明显的读者写着问题的同类例题。 桥两边的人是一种竞争关系,竞争的是桥这个临界资源。同理,同一方向的人之间也是竞争关系,竞争修改“人数”这个变量。 在此要让学生明白多个竞争的进程之间是没有固定的先后顺序的,可能一面的人先过桥,也可能另一面的人先过桥。
例题 2:有一仓库可以存放 A,B 两种物品,每次只能存入一物品(A 或 B)存储空间无限大, 只是要求-n <count(A)- count(B) <m 其中n,m 是正整数,试用存入 A,存入 B,和 P,V 操作 描述物品 A 和物 品 B的入库过程。该问题大部分同学的分析成互斥,因为看到了“每次只能存入一物品”,确实他们在放物品的时候是互斥的,但是这两个进程的主要关系是合作。体现在一旦 A 放入了一个物品,B 也可以放入一个;一旦 B 放入一个物品,A 也可以放入一个。 所以这是非典型的生产者和消费者问题。
3.2 对信号量的概念及意义不清楚
在信号量概念学习过程中首先要让学生清楚信号量和整型变量的根本区别。整型变量在内存中占有 4 个字节,仅能存放数值;而信号量类型不仅能表示资源数量,更重要在于为申请资源而得不到满足的进程提供阻塞链接队头指针 。 其次要不断强化信号量类型数据仅仅能够进行 P,V 操作,不可以进行除了 P,V 之外的任何操作。 例如上面例题 2:有同学写出如下代码:
Semophere counta=countb=0,mutex=1;
存入 A:
{
A 生产产品;
P(mutex);
If(counta-countb<m && counta-countb>-n)
存入 A;
V(mutex);
}
在这段代码中,第一个问题是没有搞清楚信号量的基本操作只能是 P,V,不能有其他的加减及判断;第二个问题是没有搞清楚信号量的含义,当申请存入 A 而得不到满足的时候,进程是要阻塞的。 按照上述程序,如果不符合判断条件,则产品抛弃,继续下一个进程。 这明显是错误的。 本题目正确的做法是:
Semophere counta=m-1,//当 B 产品一个都不放,A 最多可以放
m-1 个产品;
countb=n-1,//当 A 产品一个都不放,B 最多可以放 N-1 个产品;
mutex=1;
存入 A: 存入 B:
{ {
A 生产产品; B 生 产
产品;
P(counta) ;
p(countb);
P(mutex); p
(mutex);
存入 A;
存入 B;
V(countb);
V(counta);
} }
3.3 信号量命名不清楚,不明确
这个问题是从教科书上生产者消费者问题延续而来。在生产者消费者问题中设置的 full,empty 信号量其实含义不是特别清楚明了。 如果改成 buffer 和 product 则明了很多, 无论从资源的角度看还是从前驱关系的角度看都特别清楚明了。学生们在计算机基础中学过变量的命名规则,作者认为变量的命名规则同样适用信号量的命名规则。
4结束语
操作系统设计的目标之一就是资源的充分利用, 进程的并发是实现这一目标的重要方法,而并发又离不开进程的同步和互斥。 信号量是实现进程间的互斥与同步既方便又高效的工具。 在操作系统课程的教学中, 利用信号量实现进程同步与互斥的问题还将继续研究下去。
【参考文献】
[1][美]William Stallings.操作系统-精髓与设计原理[M].5 版.陈 渝 ,等 ,译.北 京 :电子工业出版社,2006.
[2]汤子瀛,哲风屏,汤小丹,编.计算机操作系统(修订版)[M].西安:西安电子科技大学出版社,2002.
[3]范策,许宪成,黄红桃,李畅.计算机操作系统教程 :核心与设计原理[M].北京:清华大学出版社.
[4]李芳,夏宇.简析操作系统中进程间的相互制约关系[J].湖北 :黄 石理工学院2007-8.
[5]李畅,范策.进程互斥与同步解析[J].广州:现代计算机,2010,12.