第十六讲 进程同步与信号量
多进程的合作:多进程之间应该具有合适的约束,来共同推进任务的前进;多个进程的相互合作表现为每个进程有自己的一套执行方案,有自己的一套执行的程序,但并不是说程序可以任意执行,有时候需要停下来进行等待,而另外的一些进程在执行的过程中会给其发出一些信号,根据这些信号判断是否还需要接着等待,进而完成合作,同步:
生产者消费者模型:在这里,生产者和消费者函数的外层while循环都是一个死循环,而内循环的while循环是要能够起到生产者在生产的东西已经达到最大的内存时,就进入死循环,不再生产,直到切换到消费者进行消费,在消费完内存中的东西后,消费者同样进入到消费者的内层的while死循环,使消费者不能够接着消费,直到进程切到生产者,此时生产者的while判断提条件已经改变 ,就可以接着进行生产,由此在生产者和消费者之间不同的切换执行;
进程的“停”和“走”是进程合作的关键,由此才能实现进程之间合理有序的向前推进,完成任务:
信号变现的信息是有和没有的区别,应该进一步的使用信号量,来表达更丰富的信息:在下面的程序中counter只能判断有生产者在counterBUFFER_SIZE时,处于睡眠状态,但并不清楚睡眠了几个生产者,这里的counter作为信号,在counterBUFFER_SIZE-1时,只能够唤醒一个线程,这就造成了另外的处于睡眠中的进程一直处在睡眠状态,故这里要有另一个参数能够判断信号的发送,既需要另外一个信号量
从信号到信号量
为什么不是直接一次唤醒所有的睡眠进程?这里把sem作为空闲缓冲区或者所欠的缓冲区的数量,故有正有负;sem(semaphore,信号)(sleep memory),信号量,表达更多的信息,根据信号量的值进行对应的动作,既是“等”还是“走”;
这里使用了三个信号量,mutex信号量初始值置为1,作为互斥锁存在,保证共享区域内同时只能有一个进程操作;empty信号量的初始值置为BUFFER_SIZE,full信号量的初始值置为0,