【题目1】试从调度性,并发性,拥有资源及系统开销方面对进程和线程进行比较。
(1)调度性:在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进程,在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位;
(2)并发性:在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使OS具有更好的并发性;
(3)拥有资源:无论是传统的操作系统,还是引入了线程的操作系统,进程始终是拥有资源的一个基本单位,而线程除了拥有一点在运行时必不可少的资源外,本身基本不拥有系统资源,但它可以访问其隶属进程的资源;
(4)系统开销:由于创建或撤销进程时,系统都要为之分配和回收资源,如内存空间等,进程切换时所要保存和设置的现场信息也要明显地多于线程,因此,操作系统在创建、撤消和切换进程时所付出的开销将显著地大于线程。
【题目2】什么是AND信号量?试利用AND信号量写出生产者一消费者问题的解法。
为解决并行带来的死锁问题,在wait 操作中引入AND条件,其基本思想是将进程在整个运行过程中所需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放。生产者-消费者问题解法如下:
int i=0,out=0;
item buffer[n];
semaphore mutex =1,empty=n,full=0;
void producer()
{
do
{
producer an item nextp;
......
Swait(empty,mutex);
buffer[in]=nextp;
in=(in+1)%n;
Ssignal(mutex,full);
}while(TRUE);
}
void consumer()
{
do
{
Swait(full,mutex);
nextc=buffer[out];
out=(out+1)%n;
Ssignal(mutex,empty);
consumer the item in nextc;
......
}while(TRUE);
}
【题目3】在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法。
(1)var mutex,empty,full:semaphore:=1,1,0;
gather:
begin
repeat
...
gather data in nextp;
wait(empty);
wait(mutex);
buffer:=nextp;
signal(mutex);
signal(full);
until false;
end
compute:
begin
repeat
......
wait(full);
wait(mutex);
nextc:=buffer;
signal(mutex);
signal(empty);
compute data in nextc;
until false;
end
(2)Var empty, full: semaphore:=1,0;
gather:
begin
repeat
......
gather data in nextp;
wait(empty);
buffer:=nextp;
signal(full);
until false;
end
compute:
begin
repeat
......
wait(full);
nextc:=buffer;
signal(empty);
compute data in nextc;
until false;
end
【题目4】何谓用户级线程和内核支持线程?
(1)用户级线程:仅存在于用户空间中的线程,无须内核支持。这种线程的创建、撤销、线程间的同步与通信等功能, 都无需利用系统调用实现。用户级线程的切换通常发生在一个应用进程的诸多线程之间,同样无需内核支持。
(2)内核支持线程:在内核支持下运行的线程。无论是用户进程中的线程,还是系统线程中的线程,其创建、撤销和切换等都是依靠内核,在内核空间中实现的。在内核空间里还 为每个内核支持线程设置了线程控制块,内核根据该控制块感知某线程的存在并实施控制。
【题目5】在生产消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置,或者将signal(mutex)与signal(full)互换位置,结果如何?
在生产者—消费者问题中,如果将两个wait操作,即wait(full)和 wait(mutex)互换位置后,可能引起死锁。mutex在这里是全局变量,执行完wait(mutex),则mutex赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex为0而进行等待,使full始终为0,这样就形成了死锁。同样signal(mutex)与signal(full)互换位置后,从逻辑上来说应该也是一样的。