资源分配算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#include
#define BUF 10 //缓存的大小
#define MAX 20 //最大可以输入的字符
//数据结构的定义和全局变量
typedef struct Pcb{
char name[10]; //进程名
char state[10]; //运行状态
char reason[10]; //若阻塞,其原因
int breakp; //断点保护
struct Pcb *next; //阻塞时的顺序
}Pcb,*link;
int s1,s2; //信号量
link p1;//生产者进程
link c1;//消费者进程
char str[MAX]; //输入的字符串
char buffer[BUF]; //缓冲池
int len; //输入长度
int sp=0; //string的指针
int in=0; //生产者指针
int out=0; //消费者指针
char temp; //供打印的临时产品
char rec_p[MAX];//生产记录
int rp1=0;//生产记录指针
char rec_c[MAX];//消费记录
int rp2=0;//消费记录指针
link ready; //就绪队列
link b_s1; //s1阻塞队列
link b_s2; //s2阻塞队列
int pc; //程序计数器
int count; //字符计数器
int con_cnt; //消费计数器
void init(); //初始化
void p(int s); //P操作
void v(int s); //V操作
void block(int s);//阻塞函数
void wakeup(int s);//唤醒函数
void control(); //处理机调度
void processor();//处理机执行
void print(); //打印函数
void init(){ //初始化
s1=BUF;
s2=0;
p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者
strcpy(p1->name,"Producer");
strcpy(p1->state,"Ready");
strcpy(p1->reason,"Null");
p1->breakp=0;
p1->next=NULL;
c1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为消费者
strcpy(c1->name,"Consumer");
strcpy(c1->state,"Ready");
strcpy(c1->reason,"Null");
c1->breakp=0;
c1->next=NULL;
ready=p1;
ready->next=c1;//初始化为生产进程在前,消费进程在后
c1->next=NULL;
b_s1=NULL;
b_s2=NULL;//阻塞进程为NULL
pc=0;
con_cnt=0; //消费计数器
}
void p(int s){
if(s==1){ //p(s1)
s1--;
if(s1<0)
block(1); //阻塞当前生产进程
else{
cout<<"\t* s1信号申请成功!"<
}
}
else{ //p(s2)
s2--;
if(s2<0)
block(2);//阻塞当前消费进程
else{
cout<<"\t* s2信号申请成功!"<
}
}
}
void v(int s){
if(s==1){ //v(s1)
s1++;
if(s1<=0)
wakeup(1); //唤醒生产进程
ready->breakp=pc; //保存断点
}
else{ //v(s2)
s2++;
if(s2<=0)
wakeup(2);//唤醒消费进程
ready->breakp=pc; //保存断点
}
}
void block(int s){//阻塞函数的定义
link p;
int num1=0;
int num2=0;
if(s==1){//生产进程
strcpy(p1->
state,"Block");//改变状态
strcpy(p1->reason,"S1");//说明原因
p=b_s1;
while(p){
num1++;
p=p->next;//p的值为NULL,表示队尾
}
if(!b_s1)
b_s1=p1;
else
p=p1;
p1->next=NULL;
cout<<"p1生产进程阻塞了!"<
ready=ready->next;//在就绪队列中去掉,指向下一个
num1++;
}
else{//消费进程
strcpy(c1->state,"Block");
strcpy(c1->reason,"S2");
p=b_s2;
while(p){
num2++;
p=p->next;//p的值为NULL,表示队尾
}
if(!b_s2)
b_s2=c1;
else
p=c1;
ready->breakp=pc; //保存断点
ready=ready->next;//在就绪队列中去掉,指向下一个
c1->next=NULL;
cout<<"\t* c1消费进程阻塞了!"<
}
cout<<"\t* 阻塞的生产进程个数为:"<
void wakeup(int s){//唤醒函数的定义
link p;
link q=ready;
if(s==1){ //唤醒b_s1队首进程,生产进程队列
p=b_s1;
b_s1=b_s1->next;//阻塞指针指向下一个阻塞进程
strcpy(p->state,"Ready");
strcpy(p->reason,"Null");
while(q)//插入就绪队列
q=q->next;
q=p;
p->next=NULL;
cout<<"\t* p1生产进程阻塞了!"<
else{ //唤醒b_s2队首进程,消费进程队列
p=b_s2;
b_s2=b_s2->next;//阻塞指针指向下一个阻塞进程
strcpy(p->state,"Ready");
strcpy(p->reason,"Null");
while(q->next)//插入就绪队列
q=q->next;
q->next=p;
p->next=NULL;
cout<<"\t* c1消费进程阻塞了!"<
}
void control() //处理器调度程序
{
int rd;
int num=0;
link p=ready;
if(ready==NULL) //若无就绪进程,结束
return;
while(p) //统计就绪进程个数
{
num++;
p=p->next;//最终p变为NULL
}
cout<<"\t* 就绪进程个数为"<
time_t t;
srand((unsigned) time(&t));
rd=rand()%num;//随机函数产生随机数
if(rd==1){
p=ready;
ready=ready->next;
ready->next=p;
p->next=NULL;
strcpy(ready->state,"Run");
strcpy(ready->next->state,"Ready");
}
else
strcpy(ready->state,"Run");
pc=ready->breakp;
}
void processor(){ //模拟处理器指令执行
if(strcmp(ready->name,"Producer")==0) //当前进程为生产者
switch(pc)
{
case 0://produce
cout<<"\t* 生产者生产了字符"<
sp=(sp+1)%len;
pc++;
ready->breakp=pc; //保存断点
break;
case 1: //p(s1)
pc++;
p(1);
break;
case 2: //put
buffer[in]=rec_p[rp1]; //放到缓冲区
cout<
in=(in+1)%BUF;
pc++;
ready->breakp=pc; //保存断点
break;
case 3: //v(s2)
pc++;
cout<<"\t* 释放一个s2信号 "<
break;
case 4://goto01
cout<<"\t* 生产进程goto 0 操作"<
count--; //剩
余字符个数减1
cout<<"\t* 剩余字符count="<
if(count<=0){ //生产结束
cout<<"\t* 生产者结束生产!"<
strcpy(p1->reason,"Null");
ready->breakp=-1;
ready=ready->next;//在就绪队列中去掉
}
}
else //当前进程为消费者
switch(pc)
{
case 0: //p(s2)
pc++;
p(2);
break;
case 1: //get
cout<<"\t* 消费者取字符!"<
out=(out+1)%BUF;
pc++;
ready->breakp=pc; //保存断点
break;
case 2: //v(s1)
pc++;
cout<<"\t* 释放一个s1"<
break;
case 3: //consume
cout<<"\t* 消费了字符" <
rp2++;
con_cnt++;
if(con_cnt>=len){
strcpy(c1->state,"Stop");//完成态
c1->breakp=-1;
return;
}
pc++;
ready->breakp=pc; //保存断点
break;
case 4: //goto0
cout<<"\t* 消费进程goto 0 操作"<
ready->breakp=pc; //保存断点
}
}
void print(){
int i,j;
cout<<"————————生产者消费者模拟———————"<
cout<
cout<<"* 已生产:";
for(j=0;j<=rp1;j++)
cout<
for(j=rp2;j<=rp1;j++)
cout<
for(j=0;j<=rp2;j++)
cout<
cout<
cout<<"1.继续 0.退出\n";
cin>>i;
if(i==0){
exit(0);
}
}
void main(){
cout<<" 生产者消费者模拟\n";
cout<<"—————————\n";
cout<<" 请输入字符串:\n";
cin>>str; //string数组存放将要产生的字符
len=strlen(str);
count=len; //输入字符的个数
init(); //初始化
while(con_cnt
system("cls"); //清屏操作
cout<<"—————————模拟指令流程————————\n";
control(); //处理器调度程序
processor(); //模拟处理器指令执行
print(); //输出显示各个信息
}
cout<<"\n程序结束!\n";
}