资源简介

熟练应用生产者消费者PV操作的实验, 实验内容 1. 由用户指定要产生的进程及其类别,存入进入就绪队列。   2. 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。   3. 程序询问是否要继续?如果要转直①开始执行,否则退出程序。

资源截图

代码片段和文件信息

#include “stdio.h“
#include  
#include  
#include “iostream.h“
#define NULL 0 
#define OK 1
#define ERROR 0
#define buffersize 3
#define getpch(type) (type*)malloc(sizeof(type)) 

int productnum=0;  //产品数量
int processnum=0;//进程计数器
int full=0; 
int empty=buffersize; // semaphore
char buffer[buffersize];  // 缓冲区
int bufferpoint=0;  // 缓冲区指针

struct pcb 
{  /* 定义进程控制块PCB */
int flag;  // flag=1 表示生产者; flag=2 表示消费者
int numlabel;//进程编号
char product;//产品
char state;//进程状态
struct pcb * processlink;
}*exe=NULL*over=NULL;  // over链表

typedef struct pcb PCB;
PCB* readyhead=NULL * readytail=NULL;   // 就绪队列
PCB* consumerhead=NULL * consumertail=NULL;  // 消费者队列
PCB* producerhead=NULL * producertail=NULL;   // 生产者队列


int InitQueue (PCB* headPCB* tail)
{//初始化队列
    if(!head) 
exit(0);
    head->processlink=NULL;
    return OK;
}

bool hasElement(PCB*pro)
{//判断队列是否为空
if(pro->processlink==NULL)
return false;
else 
return true;
}

void linkqueue(PCB* processPCB** tail)
{   // 把就绪队列里的进程放入生产者队列的尾
(*tail)->processlink=process;
(*tail)=process; 
return ;
}

void freelink(PCB* linkhead)
{//清除队列
PCB* p;
while(linkhead!=NULL)
{
p=linkhead;
linkhead=linkhead->processlink;
free(p);
}
return ;
}

PCB* getq(PCB* headPCB** tail)
{//出队
PCB* p;
p=head->processlink;
if(p!=NULL)
{
head->processlink=p->processlink;
p->processlink=NULL; 
if( head->processlink ==NULL )
(*tail)=head;
}
else
return NULL;
return p;
}

void linklist(PCB* pPCB* listhead)
{
PCB* cursor=listhead;
while(cursor->processlink!=NULL)
{
cursor=cursor->processlink;
}
cursor->processlink=p;
}

int processproc()
{//给PCB分配内存。
int ifnum;
char ch;
PCB*p=NULL;
cout< printf(“:)  请输入进程个数:“);
cin>>num;
for(i=0;i {//产生相应的的进程:
cout<<“:)  输入1生产者进程“< cout<<“:)  输入2消费者进程“< scanf(“%d“&f);                            
getchar();
p=(PCB*)malloc(sizeof(PCB));
if(!p)
{
cout<<“:)  内存分配失败“< return false;
}
p->flag=f;//进程标志,1为生产者,2为消费者
processnum++;//进程计数器加1
p->numlabel=processnum;//进程编号记为进程计数器
p->state=‘w‘;//置为等待
p->processlink=NULL;
if(p->flag==1)
{//输入1为生产者进程;
cout<<“:)  您要产生的进程是生产者,它是第“< cout<<“:)  请输入您要该进程产生的字符“< scanf(“%c“&ch);
getchar();
p->product=ch;
productnum++;
cout<<“:)  该进程产生的内容是“<product< }
else
{ //输入2为消费者进程;
cout<<“:)  产生的进程是消费者,它是第“<numlabel<<“个进程“< }
linkqueue(p&readytail);  //并把这些进程放入就绪队列中。
}
return true;
}

bool waitempty()
{// 如果缓冲区满,该进程进入生产者等待队列;
if(empty<=0)
{
cout<<“:)  进程“<numlabel<<“缓冲区存数,该进程进入生产者等待队列“< linkqueue(exe&producertail);//缓冲区满,进程压入生产者等待队列队尾
return false;
}
else
{
empty--;//缓冲区未满,则进行生产操作
return true;
}
}

void signalempty()
{//将等待中的生产者进程进入就绪队列
PCB* p;

评论

共有 条评论