刚刚做过这个实验,还是热乎的呢,很难调试。汗!
实验四 同步机构
一、设计内容
模拟实现用同步机构避免并发进程执行时可能出现的与时间有关的错误。
二、设计目的
进程是程序在一个数据集合上运用的过程,进程是并发执行的。也即系统中的多个进程轮流的占用处理器运行。
我们把若干进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发的执行,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问,一般说,同步机构是由若干条原语—–同步原语—–所组成,本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用
实验四 同步机构
一、设计内容
模拟实现用同步机构避免并发进程执行时可能出现的与时间有关的错误。
二、设计目的
进程是程序在一个数据集合上运用的过程,进程是并发执行的。也即系统中的多个进程轮流的占用处理器运行。
我们把若干进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发的执行,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问,一般说,同步机构是由若干条原语—–同步原语—–所组成,本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用
三、实验题目
(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:
P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。
V操作原语V (s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。
这两条原语是如下的两个过程:
procedure p (var s: semaphore);
begin s: = s-1;
if s<0 then W (s)
end {p}
procedure v (var s: semaphore);
egin s: = s+1;
if s£0 then R (s)
end {v}
其中W(s)表示将调用过程的进程置为等待信号量s的状态;R(s)表示释放一个等待信号量s的进程。
在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实习中可把上述的semaphore直接改成integer。
(2) 生产者——消费者问题。
假定有一个生产者和一个消费者,生产者每次生产一件产品,并把生产的产品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内以产品。假定缓冲器内可同时存放10件产品。那么,用PV操作来实现生产者和消费者之间的同步,生产者和消费者两个进程的程序如下:
B: array [0..9] of products;
s1, s2; semaphore;
s1: =10, s2: =0;
IN, out: integer;
IN: =0; out: =0;
cobegin
procedure producer;
c: products;
begin
L1:
Produce (c);
P (s1);
B[IN]: =C;
IN: =(IN+1)mod 10;
V (s2);
goto L1
end;
procedure consumer;
x: products;
begin
L2: p (s2);
x: =B[out];
out: =(out+1) mod10;
v (s1);
consume (x);
goto L2
end;
coend.
其中的semaphore和products是预先定义的两个类型,在模拟实现中semaphore用integer代替,products可用integer或char等代替。
四、源程序
#include<iostream>
using namespace std;
#define n 4 //就绪队列最大容量
int Pop(int s); //P操作
int Vop(int s); //V操作
void Produce(); //生产产品
void Consume(); //消费产品
void Put(); //存放产品
void Get(); //取得产品
void Goto(); //重复
struct PCB //进程控制块
(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:
P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。
V操作原语V (s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。
这两条原语是如下的两个过程:
procedure p (var s: semaphore);
begin s: = s-1;
if s<0 then W (s)
end {p}
procedure v (var s: semaphore);
egin s: = s+1;
if s£0 then R (s)
end {v}
其中W(s)表示将调用过程的进程置为等待信号量s的状态;R(s)表示释放一个等待信号量s的进程。
在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实习中可把上述的semaphore直接改成integer。
(2) 生产者——消费者问题。
假定有一个生产者和一个消费者,生产者每次生产一件产品,并把生产的产品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内以产品。假定缓冲器内可同时存放10件产品。那么,用PV操作来实现生产者和消费者之间的同步,生产者和消费者两个进程的程序如下:
B: array [0..9] of products;
s1, s2; semaphore;
s1: =10, s2: =0;
IN, out: integer;
IN: =0; out: =0;
cobegin
procedure producer;
c: products;
begin
L1:
Produce (c);
P (s1);
B[IN]: =C;
IN: =(IN+1)mod 10;
V (s2);
goto L1
end;
procedure consumer;
x: products;
begin
L2: p (s2);
x: =B[out];
out: =(out+1) mod10;
v (s1);
consume (x);
goto L2
end;
coend.
其中的semaphore和products是预先定义的两个类型,在模拟实现中semaphore用integer代替,products可用integer或char等代替。
四、源程序
#include<iostream>
using namespace std;
#define n 4 //就绪队列最大容量
int Pop(int s); //P操作
int Vop(int s); //V操作
void Produce(); //生产产品
void Consume(); //消费产品
void Put(); //存放产品
void Get(); //取得产品
void Goto(); //重复
struct PCB //进程控制块
{
char State; //状态 E:运行 R:就绪 W:等待 F:完成
char Reason; //等待原因(e–空,f–满)
int Bp; //下地址 现行指令的下一条指令的入口地址
char flag; //现行进程标志(大写) P:生产者 C:消费者
};
char State; //状态 E:运行 R:就绪 W:等待 F:完成
char Reason; //等待原因(e–空,f–满)
int Bp; //下地址 现行指令的下一条指令的入口地址
char flag; //现行进程标志(大写) P:生产者 C:消费者
};
PCB *p,process[n]; //进程数组
int PA[]={0,1,2,3,4}; //生产者指令序号

怎么源码只有一半?
@愿晾 是这样的,我传到CSDN下载了已经 你去搜下就好了!