目录
1.4 生产者-消费者问题(producer-consumer)
一、背景
在O/S中引入进程后,一方面可以使系统中的多道程序并发执行,这不仅能有效地改善资源利用率,还可以显著地提高系统资源的吞吐量,但另一方面却使系统变得更加复杂。如果不能采取有效措施,对多个进程的运行进行妥善的处理,必然会因为这些进程对系统资源的无序争夺给系统造成混乱。致使每次处理的结果存在不确定性,即显现出不可再现性。
单处理机系统中的同步机制——硬件同步机制、信号量机制、管程机制。
1.1 进程同步
对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。
间接相互制约关系:CPU、I/O设备、打印机、磁带机等,系统实施统一分配,即应先提出申请,而不允许用户进程直接使用。类似于计划经济把。
直接相互制约关系:全局变量或者缓冲区等。为了杜绝这种错误,必须对进程的执行次序进行协调,保证诸进程能按序执行。
空闲让进、忙则等待、有限等待、让权等待
1.2 临界区和临界资源
每个进程中访问临界资源的那段代码叫做临界区(critical section)。 可把一个访问临界资源的循环进程描述如下:
1.3 探究进入区entry section
硬件同步机制:对一个字中的内容进行检测和修正或者是对两个字的内容进行交换等。“锁”模型。
1)关中断
保证测试和关锁操作是连续的。
2)TS指令
bool TS(bool *lock)
{
bool old;
old = *lock;
*lock = true;
return old;
}
执行过程不可分割,作为一条原语而存在。
do{
...
while TS(&lock); //进入区
critical section; //临界区
lock = false; //退出区
remainder section; //剩余区
}while(true);
3)Swap指令
又称对换指令,用于交换两个字的内容。
void swap(bool *a, bool *b)
{
bool temp;
temp = *a;
*a = *b;
*b = temp;
}
设置一个全局的布尔变量lock用于标记临界资源。
do
{
key = true;
do{
swap(&lock, &key);
}while(key != false);
critical section; //临界区
lock = false; //退出区
remainder section; //剩余区
}while(true);
1.4 生产者-消费者问题(producer-consumer)
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到一个空的缓冲区去取产品也不允许生产者进程向一个已装满产品尚未被取走的缓冲区投放产品。