1. 什么是死锁?
如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的。
2. 死锁产生的条件是什么?
产生死锁必须同时具备以下4个必要条件:
(1)互斥条件。进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。
(2)请求和保持条件。进程已经占有了至少一个资源,但又提出了新的资源请求,而该被请求的资源已被其他进程占有,此时请求进程被阻塞,同时其对自己已占有的资源保持不放。
(3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由其自己释放。
(4)循环等待条件。该条件指在发生死锁时,必然存在一个“进程一资源”循环链,即进程集合{P₀,P₁,P₂,…,Pₙ}中的P₀正在等待已被P₁占用的资源,P₁正在等待已被P₂占用的资源,……,Pₙ正在等待已被P₀占用的资源。
3. 什么是临界资源?
各进程采取互斥的方式,实现共享的资源称作临界资源。
4. 什么是临界区?
每个进程中访问临界资源的那段代码称为临界区。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
5. 临界资源的互斥条件是什么?
(1)空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许1个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
(2)忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
(3)有限等待。对于要求访问临界资源的进程,应保证其在有限时间内能进入自己的临界区,以免陷入“死等”状态。
(4)让权等待(原则上应遵循,但非必须)。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
6. 信号量的物理含义和取值范围是什么?
(1)若信号量s为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数, 亦即等于s所代表的实际使用的物理资源个数。
(2)若信号量s为负值,则其绝对值等于登记排列在该信号量s队列之中等待进程的个数, 亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数。
(3)通常P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作。
7. 假设3个进程P1、P2、P3互斥地使用一个包含N(大于0)个单元的缓冲区。P1每次使用produceodd()生成一个奇数,P2用produceeven()产生一个偶数,并用put()将产生的数送入缓冲区的某一个空单元中;P3每次用get()从该缓冲区取出一个数,并统计寄数和偶数的个数。请用信号量机制实现这3个进程的同步与互斥活动,并用伪代码描述。
semaphore mutex = 1;
semaphore full = 0;
semaphore empty = N;
process P1
{
while (true)
{
int odd = produceodd();
down(empty);
down(mutex);
put(odd);
up(mutex);
up(full);
}
}
process P2
{
while (true)
{
int even = produceeven();
down(empty);
down(mutex);
put(even);
up(mutex);
up(full);
}
}
process P3
{
int odd_count = 0;
int even_count = 0;
while (true)
{
down(full);
down(mutex);
int data = get();
up(mutex);
up(empty);
if (data % 2 == 0)
{
even_count++;
}
else
{
odd_count++;
}
}
}