1信号量的值有什么含义?
信号量的值为-1,这表示等待进入临界区的进程数是1。信号量是一个特殊的整型变量,只有初始化和PV操作才能改变其值。通常,信号量分为互斥量和资源量,互斥量的初值一般为1,表示临界区只允许一个进程进入,从而实现互斥。当互斥量等于0时,表示临界区已有一个进程进入,临界区外尚无进程等待;当互斥量小于0时,表示临界区有1个进程,互斥量的绝对值表示在临界区外等待进入的进程数。资源信号量也是这么个情况。
2临界区是什么东西?临界区是访问临界资源中的一步。
临界资源是一次仅允许一个进程使用的资源,比如很多物理设备,如打印机。
进入区:为了进入临界区使用临界资源,在进入区要检查是否可进入临界区,若能进入临界区,则应设置正在访问临界区的标志,以阻止其他进程同时进入临界区。
临界区:进程中访问临界资源的那部分代码,又称临界段。
退出区:将正在访问临界区的标志清除。
剩余区:代码中的其他部分。
3 临界资源与共享资源
临界资源与共享资源的区别在于,在一段时间内能否允许被多个进程访问(并发使用),显然磁盘属于共享设备。共用队列可供多个进程使用,但一次只可供一个进程使用,试想若多个进程同时使用共用队列,势必造成队列中的数据混乱而无法使用。可重入的代码程序一次可供多个进程使用。# 4进程A和进程B共享缓冲区协作完成数据处理,进程A负责生产数据并放入缓冲区,进程B从缓冲区读数据并输出。进程A与B的关系是互斥和同步关系。其实这道题很坑啊!进程A要先放入数据,B才能取出来,这是很明显的同步机制。然后共享的缓冲区一定是互斥访问的,所以它们也有互斥关系。
5为什么P操作可能导致进程阻塞,但不可能导致进程就绪呢?
这是因为执行P操作时的进程处于运行态,如果说时间片消耗完了倒是可以从运行态转到就绪态,但是没取到资源就只能进入阻塞态,取到资源了进程还是运行态。
6什么是管程?
当共享资源用共享数据结构表示时,资源管理程序可用对该数据结构进行操作的一组过程来表示,如资源的请求和释放过程request和release。把这样一组相关的数据结构和过程一并归为管程。
管程由3部分组成:
(1)局部于管程的共享变量说明。
(2)该数据结构进行操作的一组过程
(3)对局部于管程的数据设置初始值得语句;此外,还需为该管程赋予一个名字。
管程的引入是为了解决临界区分散所带来的管理和控制问题。在没有管程之前,对临界区的访问分散在各个进程之中,不易发现和纠正分散在用户程序中的不正确使用P,V操作等问题。管程将这些分散在各进程中的临界区集中起来,并加以控制和管理,管程一次只允许一个进程进入管程内,从而既便于系统管理共享资源,又能保证互斥。
7一个进程因在互斥信号量mutex上执行V(mutex)操作而导致唤醒另一个进程时,执行V操作后mutex的值为?
因为系统中原来存在等待进入临界区的进程,mutx<=-1,因此在执行V(mutex)操作后,mutex<=0。
8管程的signal操作和信号量中的V操作相同吗?
x.wait:当x对应的条件不满足时,可以调用管程的进程调用x。wait将自己插入x条件的等待队列,并释放管程。此时其他进程可以使用管程。
x.signal:x对应的条件发生了变化,则调用x.signal,唤醒一个因x条件阻塞的进程。
信号量机制中的V操作一定会改变信号量的值S=S+1.而管程中的操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则signal不会产生任何影响。
9为什么私用数据不是临界区呢?
因为私用数据仅供一个进程使用,不存在临界区问题。
10 Peterson算法
进程P0和进程P1的共享变量定义及其初值为:
boolean flag[2];
int turn =0;
flag[0]=false;flag[1]=false;
void P0()
{
while(true)
{
flag[0]=true;turn=1;
while(flag[1]&&(turn==1));
临界区;
flag[0]=false;
}
}boolean flag[2];
int turn =0;
flag[0]=false;flag[1]=false;
void P0()
{
while(true)
{
flag[0]=true;turn=1;
while(flag[1]&&(turn==1));
临界区;
flag[0]=false;
}
}
void P1()
{
while(true)
{
flag[1]=true;turn=1;
while(flag[0]&&(turn==1));
临界区;
flag[1]=false;
}
}
看着这段代码,我们想象一种情况,进程P0和进程P1同时站在临界区外。这时flag[0]和flag[1]都被设为true,也就说下面那个while循环判定条件的前半部分是都满足的,但turn的值要么为0要么为1,只能满足一个。
当turn的值为1时,P1进入死循环,P0开始执行。
P0执行完以后,flag[0]==false,P1while循环的条件不满足,跳出死循环,进入临界区。
因此peterson算法是可以保证进程互斥进入临界区的。
11TSL(Test and Set Lock)指令
do{
…………
while(TSL(&lock));
critical section;
lock=FALSE;
……………
}while(TRUE);
当上锁的时候,就进入忙等的状态。
TSL没有实现让权等待的原则,因为它在不知道什么时候进入缓冲区的情况下,一直不释放处理机。
12什么是让权等待?
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。(受惠的是其他进程)。让权等待是进程同步机制应遵循的原则之一。
13实现进程互斥需要遵循的准则
忙则等待,空闲让进,优先等待。
让权等待可以不实现,比如在peterson算法中,进程P1和P0都不会放弃,直到对方使用完CPU。
8853



被折叠的 条评论
为什么被折叠?



