1.基本概念
同步:指定线程的执行顺序,比如有两个线程A,B都要访问资源的时候,B执行了途中需要A的结果,所以B先让出资源,等A执行结束后再执行B
互斥:多个线程访问系统资源的时候,同时只能有一个线程对资源进行访问
2.线程间的同步和互斥是通过操作系统中信号量和PV原语来实现的
PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;
②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
3.举个栗子(经典的生产者和消费者模式)
条件1:生产者在生产前需要看实体店是否缺货(定义为判断是否为空的同步信号量),如果缺货则开始生产,而消费者判断是否有货(判断是否为满的同步信号量),有货才可以购买。(引入同步信号量)
条件2:因为实体店有限,多个生产者在生产产品时候需要指明往哪个实体店放,这样其他生产者此时就不能再生产往该实体店放的产品了,否则两个生产者同时生产一个实体店需要的产品,都生产完只能放一个生产者的产品,另一个生产者的产品就没地方放了。(引入互斥信号量)
下面看操作:
1).定义两个同步信号和一个互斥信号量
empty=1(判断是否为空的同步信号量)
full=0(判断是否为满的同步信号量)
mutex=1(互斥信号量一般定义为1)
2).生产者操作
while(true)
{
P(empty)//查看是否能生产
p(mutex)//锁定实体店,别的生产商不可向该实体店生产产品
临界区(定义了对临界资源的访问代码,这里临界资源指实体店)
V(mutex)//解除锁定实体店
V(full)//通知消费者可以购买
}
3).消费者操作
while(true)
{
P(empty)//查看是否能购买
p(mutex)//锁定实体店,别的消费商不可向该实体店购买产品
临界区(定义了对临界资源的访问代码,这里临界资源指实体店)
V(mutex)//解除锁定实体店
V(full)//通知生产者可以生产
}
4.例题
有三个进程PA、PB、PC协作解决文件打印问题:PA每次将一条文件记录从磁盘读入输入缓冲区,PB将输入缓冲区的内容复制到输出缓冲区中,PC则将输出缓冲区中的内容打印出来,PC每执行一次,打印一条文件记录。输入缓冲区的容量与输出缓冲区完全相同,请用信号量机制保证文件的正确打印
思路:
[1] PA和PB因共享输入缓冲区Cache-I而相互制约,所以设置互斥信号量CI;同理,设置互斥信号量CO
控制进程PB和PC对输出缓冲区Cache-O的访问。
[2] 因三个进程的直接制约关系而设置的同步信号量如下:
ab:PA的执行依赖PB释放缓冲区为空的信息; ba:PB的执行要检测PA的数据是否放入缓冲区;
bc:PB的执行要检测有PC释放的输出缓冲区为空的信息; cb:PC执行需要检测PB的数据是否放入缓冲区。
[3]一个缓冲区定义2同1互(信号量)
答案:
P(ab) P(CI) 放入缓冲区Cache-I V(CI) V(ba)
P(ba) P(CI) 取缓冲区Cache-I的数据 V(CI) V(ab)
P(bc) P(co) 放入缓冲区Cache-O V(co) V(cb)
P(cb) P(co) 取缓冲区Cache-O的数据 V(co) V(bc)