资源简介
熟练应用生产者消费者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;
- 上一篇:C语言socket编程实现网络数据传输
- 下一篇:C++模糊逻辑代码实现
相关资源
- 生产者消费者问题C/C++源程序
- 生产者与消费者 进程的同步与互斥模
- 操作系统 作业调度算法FCFS SJF HRN C语
- 操作系统 C++ 页面置换算法含实验报告
- 优先级和时间片轮转调度实验算法c语
- 操作系统 缓冲池 C++
- 操作系统处理机作业-电梯调度模拟
- 操作系统实验 循环首次适应算法C
- 单处理器系统的进程调度+操作系统(
- 一个简单的文件系统操作系统课程设
- 文件系统 操作系统实验 C++
- 操作系统C语言实现银行家算法,键盘
- 生产者消费者问题C++语言
- 操作系统 课程设计 C++ 读者写着问题
- 操作系统 课程设计 C++ 模拟文件系统
- 分段式管理系统
- 操作系统课程设计 文件管理 C C++
- 操作系统课程设计——多线程同步演
- 文件系统的用户界面[含答案]
- 进程管理和调度的算法实现
- 用C#和C++实现的进程调度算法程序操作
- 操作系统实验--电梯调度 VC++实现
- 基于C++的ATM机操作系统设计
- 操作系统课程设计银行家算法C语言
- 操作系统3种页面置换算法 C++实现
- 操作系统中的文件管理模拟
- 操作系统CPU调度算法之最短剩余时间
- 操作系统设备管理模拟 银行家算法
- c++操作系统进程管理模拟
- 生产者与消费者问题
评论
共有 条评论