互斥实现办法(硬件)
中断屏蔽法:禁止一切中断发生
TSL指令:原子操作,执行时不允许被中断,读出指定标志后该标志设为真。
Swap指令;原子操作,交换两个变量的值
信号量机制(Semaphore):操作系统提供的一对原语,从而很方便的实现进程互斥,进程同步。
PV操作
双标志先检查法:检查和上锁无法一气呵成,导致两个进程可能同时进入临界区
所有的解决方案都无法实现让权等待
原语:特殊的程序段,其执行不能中断。由关中断/开中断实现。
一对原语:wait(s)原语和signal(s),s是函数调用时传入的一个参数。简称PV操作。
信号量可以来表示系统中资源的数量。
整型信号量:用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。
如:某系统中有一台打印机。。。
int S=1;
void wait(int S){
while(S<=0);
S=S-1;}
void signal(int S){
S=S+1;}
检查和上锁一气呵成,避免并发,不满足让权等待,不满足时一直执行那个while,如果资源不够,就一直循环等待。
记录型信号量:整型信号量的缺点是忙等,记录型数据结构表示的信号量
信号量机制实现进程互斥
1.分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问应该放在临界区)
2.设置互斥信号量mutex,初值为1.
3.临界区之前执行P(mutex)
4.临界区之后执行V(mutex)
信号量机制实现进程同步
进程同步:要让各进程有序的推进
P1,P2并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。
1.分析什么地方需要实现“同步关系”,即必须保证:一前一后
2.同步信号量S,初始为0
3.前操作之后执行V
4.后操作之前执行P
信号量机制实现前驱关系
代码要求如前驱图的顺序来执行
1.每一对前驱关系都要设置一个同步变量
2.前操作之后对相应的同步变量执行V操作
3.后操作之前相应的同步变量执行P操作
生产者和消费者问题
生产者进程每次生产一个产品放入缓冲区,消费者每次从缓冲区中取出一个产品并使用,缓冲区可以理解成一个一个的小格子。生产者消费者共享一个初始为空,大小为n的缓冲区。
缓冲区没满,生产者才能生产,缓冲区满时,生产者必须等待。只有缓冲区空时,消费者必须等待。缓冲区是一种临界资源,必须互斥访问。如果同时访问,有可能出现数据覆盖等问题。
互斥信号量,初始值一般为1,消费者资源消费之前需要消耗产品
semaphore mutex=1 互斥信号量,对缓冲区的互斥访问
semaphore empty=n同步信号量为n