进程同步:
进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好的互相合作,从而使程序的执行具有可再现性。
临界资源:
是在一段时间内只允许一个进程访问的资源。系统中的大多数的物理设备,以及栈、变量、表格,都属于临界资源,这些进程间应采用互斥方式,实现对这些资源的共享。
临界区:
每个进程中访问临界资源的代码称为临界区。
若能保证进程互斥的进入自己的临界区,便可实现进程对临界资源的互斥访问。如果某一时间临界资源未被访问,进程便可进入临界区对该资源进行检查,看是否被访问;如果某一时间该临界资源被访问,该进程不能进入临界区。
while(TRUE)
{
进入区
临界区
退出区
剩余区
}
同步机制应遵循的规则:
1.空闲让进:
无进程处于临界区时,表名临界资源处于空闲状态,允许一个请求进入临界资源区的进程立即进入自己的临界区。
2.忙则等待:
当有进程进入临界区时,表明资源正在被访问,其他想进入该临界区的资源必须等待,以保证对临界资源的互斥访问。
3.有限等待:
对要求访问资源的进程,应保证在有限的时间内能进入自己的临界区,以避免陷入“死等”状态。
4.让权等待:
当进程不能进入自己的临界区时,应立即释放处理机,以避免进程进入“忙等”状态。
实际上,在对临界区资源进行管理的时候,可以将标志看做一个“锁”,“锁开”进入,“锁关”等待, 起初锁是打开的。每个要进入临界资源的进程必须先对锁进程测试,当锁未开时,则必须等待,直至锁被打开。反之,当锁是打开的,则应立即把锁锁上,以阻止其他进程进入临界区。显然,测试和关锁必须是连续的,不允许分开执行。
解决临界区的问题:
1.关中断是最简单实现互斥的方法。在进入锁测试之前关闭中断,直到完成锁测试并上锁后才能打开中断。
因此,进程在临界区执行期间,计算机系统不断相应中断,从而不会引发调度,也就不会发生进程或线程切换。保证了对锁测试的和关锁测试的完整性和连续性。
缺点:
滥用关中断权利可能导致严重后果;
关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力;
不适用于多处理器系统,因为在一个处理器上关中断并不能防止进程在其他处理器上执行相同的代码。
经典进程同步问题
1.生产者-消费者问题
问题描述:有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,为生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。
尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
我们可以利用一个数组buffer来表示上述具有n个缓冲区的缓冲池。每投入一个产品时,缓冲池buffer中暂存产品的数组指针in加1.由于这里由buffer