操作系统-PV操作
- 格式:ppt
- 大小:3.58 MB
- 文档页数:21


semaphore s_empty=n , s_item=0;/*消息信号量*/
semaphore s=1;/*互斥信号量*/
int w=0,r=0;
item buf[n];
void pi()/* i=1,2,…,m*/ (生产者进程)
{ L1: 生产一个产品x;
wait(s_empty);
wait(s);
buf[w]=x;
w=(w+1) % n ;
signal(s_item) ;
signal(s);
goto L1 ; }
void pj() /* j=1,2,…,k*/ (消费者进程)
{ L2 : wait(s_item);
wait(s) ;
d=buf[r];
r=(r+1) % n ;
signal(s_empty) ;
signal(s);
消费产品d ;
goto L2 ; }
1.读写操作
1、、设有一台计算机,有两条I/O通道,分别接一台卡片输入机和一台打印机。卡片机把一叠卡片逐一输入到缓冲区B1中,加工处理后在搬到缓冲区B2中,并在打印机上印出,问:
①系统要设几个进程来完成这个任务?各自的工作是什么?
②这些进程间有什么样的相互制约关系?
③用P、V操作写出这些进程的同步算法。
①系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。
②R进程受C进程影响,B1放满信息后R进程要等待——等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进行打印。
③信号量含义及初值:
B1full—— 缓冲区B1满,初值为0;
B1empty——缓冲区B1空,初值为0;
B2full—— 缓冲区B2满,初值为0;
B2empty——缓冲区B2空,初值为0;
R进程 C进程 P进程
输入信息写入缓冲区B1 P(B1full) P(B2full)
V(B1full) 从B1中取出信息 从B2中取出信息进行打印
P(B1empty) 加工信息 V(B2empty)
操作系统实验——PV操作实现⽣产者消费者模型
操作系统PV操作之——⽣产者消费者模型
参考资料:
在操作系统的多进程、多线程操作中经常会有因为同步、互斥等等问题引发出的⼀系列问题,我们的前辈为了解决这些问题,发明出了“信
号量(Semaphore)”这么⼀个令⼈称奇的变量,就⽬前来看,很巧妙的解决了这些问题。信号量是个整形变量
信号量S只允许两个标准操作wait()和signal(),或者他的发明者称呼的P操作和V操作
wait()和signal()是原⼦操作,不可分割的原语
对PV操作的定义
对PV操作的定义不是单⼀的,这⾥举个⽐较简单的例⼦
/*P操作*/
wait(S){
value--;
if(value < 0){
/*value的⼤⼩表⽰了允许同时进⼊临界区进⾏操作的
进程数量*/
/*add this process to waiting queue*/
block();
}
}
/*V操作*/
signal(S){
value++;
if(value <= 0){
/*因为P操作是当value<0时休眠⼀个线程,说明如果有休眠
的线程,则value⼀定⼩于0,所以此时当value+1后,如果
还有休眠的线程,value必定⼩于或等于0 */
/*remove a process P from the waiting queue*/
wakeup(P);
}
}
信号量的应⽤
1. 临界区(互斥)问题,信号量初值需要置为1,表⽰只能有⼀个进程进⼊临界区,从⽽保护临界区内的数据同时只能被⼀个进程访问,
避免出现多个进程同时操作同⼀个数据。
Semaphore S; //初始值为1
do{
wait(S);
Critical Section; //临界区
signal(S);
remainder section //剩余部分
}while(1);
2. 两个进程的同步问题。假如有两个进程 Pi和Pj,Pi有个A语句(输⼊x的值),Pj有个B语句(输出x+1的值),希望在B语句执⾏之前
一、用P、V操作描述前趋关系。P1、P2、P3、P4、P5、P6为一组合作进程,其前趋图如图2.3所示,试用P、V操作描述这6个进程的同步。p23
图2.3说明任务启动后P1先执行,当它结束后P2、P3可以开始执行,P2完成后P4、P5可以开始执行,仅当P3、P4、P5都执行完后,P6才能开始执行。为了确保这一执行顺序,设置5个同步信号量n、摄、f3、f4、g分别表示进程P1、P2、P3、P4、P5是否执行完成,其初值均为0。这6个进程的同步描述如下:
图2.3 描述进程执行先后次序的前趋图
int f1=0; /*表示进程P1是否执行完成*/
int f2=0; /*表示进程P2是否执行完成*/ int f3=0; /*表示进程P3是否执行完成*/
int f4=0; /*表示进程P4是否执行完成*/
int f5=0; /*表示进程P5是否执行完成*/
main()
{
cobegin
P1( );
P2( );
P3( );
P4( );
P5( );
P6( );
coend
}
P1 ( )
{
┇
v(f1);
v(f1):
}
P2 ( )
{
p(f1);
┇
v(f2);
v(f2);
)
P3 ( )
{
p(f1);
┇
v(f3);
}
P4( )
{
p(f2); ┇
v(f4);
}
P5 ( )
{
p(f2);
┇
v(f5);