进程的互斥与同步及信号量的PV操作
Posted 梦里藍天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程的互斥与同步及信号量的PV操作相关的知识,希望对你有一定的参考价值。
定义
步进程互斥定义:一组并发进程中一个或多个程序段,因共享某一共有资源而导致必须以一个不允许交叉执行的单位执行。也就是说互斥是要保证临界资源在某一时刻只被一个进程访问。
进程同步定义:把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程同步。
也就是说进程之间是异步执行的,同步即是使各进程按一定的制约顺序和速度执行。
互斥是资源的竞争关系,而同步是进程间的协作关系。
哪些资源需要互斥访问
系统中有些资源可以供多个进程同时使用,有些资源则一次仅允许一个进程使用,将一次仅允许一个进程使用的资源称为临界资源
进程在并发执行中可以共享系统中的资源。但是临界资源的访问则必须互斥进行,即各进程对临界资源进行操作的那段程序(把一个进程访问临界资源的那段程序代码称为临界区)的执行也必须是互斥的,只有这样才能保证对临界资源的互斥访问
进程间的互斥就可以描述为:禁止两个或两个以上的进程同时进入访问同一临界资源的临界区。
系统是如何协调临界区的
(1)空闲让进。无进程处于临界区时,若有进程要求进入临界区则立即允许其进入;
(2)忙则等待。当已有进程进入其临界区时,其他试图进入各自临界区的进程必须等待,以保证诸进程互斥地进入临界区;
(3)有限等待。有若干进程要求进入临界区时,应在有限时间内使一进程进入临界区,即它们不应相互等待而谁也不进入临界区;
(4)让权等待。对于等待进入临界区的进程必须释放其占有的 CPU。
信号量的PV操作
信号量可以有效地实现进程的同步和互斥。在操作系统中,信号量是一个整数。当信号量大于等于 0 时,代表可供并发进程使用的资源实体数,当信号量小于零时则表示正在等待使用临界区的进程数。建立一个信号量必须说明所建信号量代表的意义和设置初值,以及建立相应的数据结构,以便指向那些等待使用该临界区的进程。
P 操作和 V 操作都是不可分割的原子操作,因此,P 原语和 V 原语执行期间不允许中断发生。
P(sem)操作的过程是将信号量 sem 值减 1,若 sem 的值成负数,则调用 P 操作的进程暂停执行,直到另一个进程对同一信号量做 V 操作。V(sem)操作的过程是将信号量sem 值加 1,若 sem 的值小于等于 0,从相应队列(与 sem 有关的队列)中选一个进程,唤醒它。
互斥的信号量,初值为 1,同步信号量是所有同步进程的数量
实验四
实验四 用信号量解决进程互斥与同步问题
生产者与消费者问题模拟
一、实验目的
- 掌握临界区的概念及临界区的设计原则;
- 掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
- 分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容
分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟。
三、实验步骤
生产者--消费者问题表述:
有一环形缓冲池,包含n个缓冲区(0~n-1)。
有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。
所有进程必须对缓冲区进行互斥的访问。
生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。
计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。
- 定义生产者消费者问题中的各数据结构,并初始化。
信号量,初值。
2.编写PV操作。
3.编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
4.模拟显示生产者与消费者同步与互斥的效果。
5.选做:模拟显示读者写者问题的效果。
四:程序代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define N 100
typedef struct process
{
int num;
}P;
P a[N];
int wordtime=0;
void main(){
int i=0,j,run=1,n,p=0,v=0,num;
printf("输入存放量的大小\\n");
scanf("%d",&n);
while(run==1)
{
srand(time(NULL));
j=rand()%2+1;
if(1==j)
{
if(i<5&&p==0&&v==0)
{
p++;
v++;
i++;
printf("生产\\n");
p--;
v--;
}
else{
printf("仓库已满无法生产\\n");
}
}
else
{
if(i>0&&p==0&&v==0)
{
p++;
v++;
i--;
printf("消费\\n");
p--;
v--;
}
else{
printf("无货物无法消费\\n");
}
}
printf("是否继续||1.是 2.否\\n");
scanf("%d",&run);
}
}
五:程序结果
以上是关于进程的互斥与同步及信号量的PV操作的主要内容,如果未能解决你的问题,请参考以下文章