进程与线程(2)
1.What is race condition(竞争条件)?
答:在一些操作系统中,协作的进程可能共享一些彼此都能读写的公用存储区,这个公用存储区可能在内存中(可能是在内存数据结构中),也可能是一个共享文件。两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。
2.What is mutual exclusion(互斥)?
答:以某种手段确保当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。
3.What is critical region(临界区)?
答:对共享内存进行访问的程序片段称作临界区域。
4.What are four conditions to hold to have a good solution for race condition/mutual exclusion(竞争条件与互斥的解决方案 )?
答:①任何两个进程不能同时处于临界区。
②不应对CPU的速度和数量做任何假设。
③临界区外运行的进程不得阻塞其他进程。
④不得使进程无限期等待进入临界区。
5.Explain the asm code of Fig 2-25 in section 2.3.3 to show that the code can provide mutual exclusion.
答:enter_region:
TSL REGISTER,LOCK //复制锁到寄存器并将锁设为1
CMP REGISTER,#0 //锁是0吗?
JNE enter_region //若不是0,说明锁已被设置,所以循环
RET
leave_region
MOVE LOCK,#0 //在锁中存入0
RET //返回调用者
Explain: 第一条指令将lock原来的值复制到寄存器中并将lock设置为1,随后这个原来的值与0相比较。如果它非0,则说明以前已被加锁,则程序将回到开始并再次测试。经过或长或短一段时间后,该值将变为0(当前处于临界区中的进程退出临界区时),于是返回过程,此时已加锁。要清除这个锁非常简单,程序只需将0存入lock即可,不需要特殊的同步指令。
6.Explain the code of Fig 2-28 in section 2.3.5 to show that the code can provide mutual exclusion.
答:#define N 100 //缓冲区中槽的数目
typedef int semaphore; //信号量是一种特殊的整型数据
semaphore mutex = 1 ; //控制对临界区的访问
semaphore empty = N; //计数缓冲区的空槽数目
semaphore full = 0; //计数缓冲区的满槽数目
void producer(void) {
{
int item;
while (TRUE) { //TRUE是常量1
item = produce_item( ); //产生放在缓冲区的一些数据
down( &empty); //将空槽数目减1
down( &mutex); //进入临界区
inserUtem(item); //将新数据放到缓冲区中
up(&mutex); //离开临界区
up(&full); //将满槽的数目加1
}
}
void consumer(void) {
{
int item;
while (TRUE) { //无限循环
down(&full); //将满槽的数目减1
down( &mutex); //进入临界区
item = remove_ item( ); //从缓冲区取出数据
up(&mutex); //离开临界区
up(&empty); //将空槽数目加1
consume_item(item); //处理数据项
}
}
explain: 设置了三个信号量,mutex控制对关键区的访问,用于互斥,为0时表示进入关键区;empty表示缓冲区的空槽数目;full表示缓冲区的满槽数目。当缓冲区不满,即生产者工作时,产生新数据,空槽数目减1,将mutex设为0,即访问关键区,这时如果有消费者想访问关键区就只能等待,将数据项放入缓冲区后up(&mutex),再将满槽的数目加1;而当缓冲区不空,即消费者工作时,满槽数目减1,进入关键区,去除数据项后,离开关键区并将空槽数目加1。
7.What is monitor(管程) and please show the connections between the code in Fig 2-34 and monitor.
答:管程是一个由过程,变量及数据结构等组成的一个特殊的模块或软件包。在任一时刻管程中只能有一个活跃进程。
对于图2-34,引入 条件变量以及相关的两个操作:wait和signal。对于生产者消费者问题,信号量mutex用于实现互斥,用管程实现时,当生产者发现它无法运行(例如,生产者发现缓冲区满),它会在某个条件变量上(如full)上执行wait操作,该操作导致调用的进程自身阻塞,而将另一个在管程外等待的进程调入管程;对于消费者,当它发现缓冲区为空时,将执行signal操作,立即退出进程或唤醒新的进程。
8.What is the difference between a semaphore(信号量) and a mutex(互斥量)?
答:①互斥量用于线程的互斥,信号量用于线程的同步:互斥量实现对关键区的控制,某时刻只能有一个线程访问关键区,信号量用来保证某种事情的顺序发生或者不发生。
②互斥量值只能为0/1。信号量值可以为非负整数。也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。
③互斥量的加锁和解锁必须由同一线程分别对应使用,而信号量可以由一个线程释放,另外一个线程得到。例如在生产者消费者问题中,互斥量mutex用于实现两者在关键区访问时的互斥,即当生产者生产时,mutex置为0,此时消费者不能进入关键区,即无法改变mutex,而只能由生产者再次释放锁。而另外的两个信号量empty与full则用来计数,生产者与消费者都可以访问。
9.Please explain the code in Fig 2-32 to show how conditional variables work. If we do not use conditional variable, only use mutex lock& unlock, what’s the difference?
答: 条件变量condc和condp分别用来控制消费者和生产者。以生产者为例,当生产者工作时,首先将互斥使用缓冲区,如果缓冲区为空,则将数据放入缓冲区,此时调用pthread_cond_signal唤醒消费者,并释放缓冲区;如果缓冲区有数据,那么生产者无法写入数据,此时调用pthread_cond_wait使该进程阻塞并释放缓冲区。消费者调用机制类似。如果只用互斥量来加锁释放锁,那么当缓冲区满槽,生产者此时调用的线程就会堵塞,只能等消费者运行产生空槽位,但是消费者是否运行,对于生产者来说是未知的,除非有相应的线程调用。条件变量的作用就是实现两个线程间的交互,提高CPU效率。
10.What is barrier(屏障)?
答:在有些应用中划分了若干阶段,并且规定,除非所有的进程都就需准备着手下一个阶段,否则任何进程都不能进入下一阶段。可以在每个阶段的结尾设置屏障来实现这种行为,当一个进程到达屏障时,它就被屏障阻拦,直到所有的进程都到达该屏障为止。
11.What is message passing?
答:消息传递是以消息为单位进行进程之间一种通信的手段,消息是由一组消息组成的集合,包括了消息头和消息尾,消息的传递实现需要两个原语分别是Send()和Seceive(),Send()负责发送消息,Receive()是负责接受消息的,当没有接受到消息的时候,接受进程进入等待的状态,直到有消息到达为止。这样的话不仅起到交换信息的功能,还能使进程同步。
12.What is the difference of these IPCs?
答:信号量用于实现线程间的信息同步。
互斥量实现不同线程间的互斥。
条件变量经常依附互斥量存在,用于线程间的信息传递。
管程用于多个线程互斥访问某一资源。
消息传递用于不同进程间的信息传递。
屏障用于不同进程在某一阶段实现同步。