1.同步和互斥:
同步(直接制约关系):指的是完成同一任务的伙伴进程间,因需要协调它们的工作而等待、传递信息等。(z(进程1)和m(进程2)需要完成买东西的任务,z把钱给了m,m才能去买东西。)
互斥(间接制约关系):指的是两个进程因需要同一个互斥资源(资源只能给一个进程使用)而产生的制约关系。(z(进程1)和m(进程2)都需要使用打印机,只能z用完才能给m。)
2.信号量机制
信号量机制包括信号量和P、V操作。
(1)信号量S是一个整型变量(信号量可以看做是资源)。
(2) P操作就是当S的值大于等于1时,让信号量S的值减1(S=S-1);当信号量的值小于0时,需要等待其它进程操作,使得S的值大于等于1。(可以理解为,没有资源就不可以执行程序)。
(3) V 操作就是讲S的值加1;(S=S+1)(可以理解为使用完释放资源)。
3.使用信号量实现进程(线程)互斥
假设有信号量mutex,我们设置它的初始值是1;(mutex = 1表示刚开始资源的数量为1)
假设有两个线程:线程1和线程2,使用以下方法实现互斥:
线程1:
P(mutex);//初始时mutex的值为1,因此这条操作会执行mutex = mutex-1;现在mutex = 0;
f1();
V(mutex);//在执行这个之前mutex=0。这条操作执行mutex = mutex+1;现在mutex = 1;
线程2:
P(mutex);//当在执行f1()的时候,mutex的值为0,因此处于等待资源状态,等到f1()执行完,mutex=1,可执行f2();
f2();
V(mutex);
上面的方法,使得每次只有一个进程(线程)可以执行。
4.使用信号量实现进程(线程)同步:
假设有信号量synch,我们设置它的初始值是0;(synch = 0表示刚开始资源的数量为0)
假设有两个线程:线程1和线程2,使用以下方法实现同步:
线程1:
f1();
V(synch);//在这之前synch的值为0,执行这个操作后synch=1;
线程2:
P(synch);//在不执行f1()之前,synch=0,等待资源。执行完线程1,synch=1可以执行f2();
f2();
上边的操作可以实现进程(线程)之间的同步,使得f2()在f1()之后进行。