📄 chapter2.txt
字号:
2.19 ~ 2.21
~~信号量在这里扮演着两种角色
角色一:用于保证进程间对共享资源的互斥访问(在书中当信号量用于此种情况时,作者将其表示为一把钥匙)
如果将信号量用于此种情况,那么在创建时,需要将信号量的初始值赋为该共享资源最多允许同时访问的进程个数。对于任何进程若需要访问该资源,首先要使用pend函数进行查询;在访问结束时,也需要使用post函数对资源进行释放。多个进程对打印机或显示器的互斥访问就是将信号量用于此种情况的一个典型的例子。
角色二:用于对进程间的同步(在书中当信号量用于此种情况时,作者将其表示为一面旗子)
如果将信号量用于此种情况,那么在创建时,需要将信号量的初始值赋为0。下面结合具体例子说明在此种情况下其具体的使用方法。
假设有两个进程,它们分别用于对全局变量int a和int b进行如下的操作:
void taskA( void )
{
a = 1;
}
void taskB( void )
{
b = a * 2;
}
可以看出,在这里a和b之间存在着限制关系,b的值必须在a值确定之后才可以确定。因此,taskB必须在taskA执行之后才可以执行。为了保证两个进程间满足此种顺序关系,就需要引入信号量来满足此种目的。
首先,当然是创建一个信号量并将其值初始化为0;
然后,两项任务的代码按照如下伪代码书写:
void taskA( void )
{
a = 1;
post semaphore;
}
void taskB( void )
{
pend semaphore;
b = 2 * a;
}
这样,由于信号量的初始值为0,故在taskA执行完a = 1;之前taskB不可能执行,从而达到了同步taskA和taskB两进程的目的。
从某种角度上来说,信号量的这两种角色之间貌似没有太大的差别(在第二种角色中我们也可以将全局变量a看作一种临界资源 ),那么两者之间到底有没有区别呢?答案是肯定的。信号量两种角色间的不同本质上是信号量所约束的两种资源的不同。在角色一中,打印机资源可以看作一种抢占型的资源,这种资源对各进程访问其的顺序没有要求而只关心其剩余量;在角色二中,全局变量a则可以看作一种顺序型的资源,对于这种资源即使taskB在taskA之前有机会访问它也无法进行,因为taskB和taskA之间在访问全局变量a时,有顺序上的制约,它必须在taskA访问过该资源之后,才允许执行访问操作。正是由于两种资源间的上述不同,决定了信号量的两种角色间操作上的差异。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -