• 大小: 4KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: C/C++
  • 标签:

资源简介

实验内容: ① 由用户指定要产生的进程及其类别,存入进入就绪队列。    ② 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。    ③ 程序询问是否要继续?如果要转直①开始执行,否则退出程序。 实验目的: 通过实验模拟生产者与消费者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。 实验要求: 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态、进程产品(字符)、进程链指针等等。 系统开辟了一个缓冲区,大小由buffersize指定。 程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者等待队列(consumer)。一个链表(over),用于收集已经运行结束的进程 本程序通过函数模拟信号量的原子操作。

资源截图

代码片段和文件信息

/*#include
#include
#include
#include
using namespace std;

#define buffersize  10//缓冲区的长度
struct PCB{
string cls;//producer and consumer
int number;
string zhuangtai;
PCB *next;
};
int buffersum;//记录缓冲区有多少已经填充
PCB *ready *prowait *conwait *over;
PCB *P[20];
void Init(){//初始化,将20个进程分为生产者与消费者
int clas i;
PCB *p;

ready = new PCB;
ready->next = NULL;
over = new PCB;
over->next = NULL;
prowait = new PCB;
prowait->next = NULL;
conwait = new PCB;
conwait->next = NULL;//完成头指针的初始化

p = ready;
srand((int)time(0));
clas=rand() % 20+1;
for (i = 1; i <= clas; i++){
P[i - 1] = new PCB;
P[i - 1]->next = NULL;
P[i - 1]->cls = “producer“;
P[i - 1]->number = i;
P[i - 1]->zhuangtai = “ready“;
p->next = P[i - 1];
p = p->next;
}
for (i = clas + 1; i <= 20; i++){
P[i - 1] = new PCB;
P[i - 1]->next = NULL;
P[i - 1]->cls = “consumer“;
P[i - 1]->number = i;
P[i - 1]->zhuangtai = “ready“;
p->next = P[i - 1];
p = p->next;
}
}
void print(){
PCB *p;
p = over->next;
cout << “##运行结束进程:“ << endl;
while (1){
if (p == NULL)
break;
cout << “进程系统号:“ << p->number << “\t进程类型:“ << p->cls << endl;
p = p->next;
}
p = ready->next;
cout << “##就绪队列:“ << endl;
while (1){
if (p == NULL)
break;
cout << “进程系统号:“ << p->number << “\t进程类型:“ << p->cls << endl;
p = p->next;
}
p = prowait->next;
cout << “##生产者等待队列:“<< endl;
while (1){
if (p == NULL)
break;
cout << “进程系统号:“ << p->number << “\t进程类型:“ << p->cls << endl;
p = p->next;
}
p = conwait->next;
cout << “##消费者等待队列:“ << endl;
while (1){
if (p == NULL)
break;
cout << “进程系统号:“ << p->number << “\t进程类型:“ << p->cls << endl;
p = p->next;
}
}
void jud

评论

共有 条评论

相关资源