问题遇到的现象和发生背景
在popready 从就绪队列出队的里边。next 不是按着12345的顺序走的
是按着1054321的顺序走的 导致我输出第二个内容的时候是乱码
这怎么把它变过来呀
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
#include"string.h"
#define _CRT_SECURE_NO_WARNINGS
#include<cstring>
#include<string>
#include<iostream>
#define SLOT 5 //时间片大小
using namespace std;
#define n 10 //假定系统允许进程个数为10
//进程控制块结构定义
typedef struct pcb
{
int name; //进程标识符 采用编号的方式 标识信息
int srt; //服务时间
string status; //进程状态ready running 说明信息
int ax, bx, cx, dx; //进程现场信息,通用寄存器内容
int pc; //进程现场信息,程序计数器内容
int psw; //进程现场信息,程序状态字寄存器内容
int next; //下一个进程控制块的位置
}pcb;
typedef struct
{
int head;
int tail;
}Ready; //定义指向就绪队列的头指针head和尾指针tail
int psw, ax,bx,cx,dx,pc;
pcb pcbarea[n]; //模拟进程控制块区域的数组//定义了typedef的枚举类型了以后就可以直接写
int run=-1; //定义指向正在运行进程的进程控制块的指针//初始化为-1代表运行队列为空
int head;//定义头指针
Ready ready;//就绪队列指针
int pfree; //定义指向空闲进程控制块队列的指针
int o;//记录pcbarea的第几个
int popready()//就绪队列出队
{
int name;
if (ready.head == -1)//就是判断一下队列是不是空的
{
cout << "就绪队列为空。不能出队。\n" << endl;
return 0;
}
name = ready.head;//让name代表队列的头一个数
ready.head = pcbarea[name-1].next;//头指针后移
//是这里的问题!!!上一行next没有按着12345的顺序走,
//是按着1054321的顺序走的。
//导致第二次输入的数据是空的,输出的乱码
if (ready.head == -1)//如果后移一位发现等于-1了,说明队列里就只有一个,移出来了以后就是空的
{//说名头尾指针指在了同一个数上//头指针后移了 尾指针也要后移。如下
ready.tail = -1;
}
cout << "ceshiyixia " << pcbarea[ready.head].name << endl;
return name;
}
void pushready(int x)//就绪队列入队 x是标识号
{
int temp;
cout << ready.head << endl;
if (ready.head == -1)
{//如果是空的的就入队的是第一个,就让头和尾都指向他
ready.head = x;
ready.tail = x;
}
else
{
temp = ready.tail;//为什么要给temp? 有什么用
ready.tail = x;//入队从后边开始入
}
pcbarea[ready.tail].next = -1;//因为入队是从尾巴开始入的,所以尾巴后边必为-1
}
//创建PCB进程控制块
void createpcb(int x,pcb pcb1)//x为要创建PCB在PCB区域数组的编号
{
pcbarea[x].ax = pcb1.ax;
pcbarea[x].bx = pcb1.bx;
pcbarea[x].cx = pcb1.cx;
pcbarea[x].dx = pcb1.dx;
pcbarea[x].name = pcb1.name;
pcbarea[x].next = -1;
pcbarea[x].pc = pcb1.pc;
pcbarea[x].psw = pcb1.psw;
pcbarea[x].status = pcb1.status;
}
void createprocess(int name,pcb pcb2)
{
pcb2.status="ready";
createpcb(name, pcb2);
pushready(name);//就绪队列入队
}
int TIME;
void schedule()
{
int srt;
int name;//进程编号
if (ready.head == -1)
{
cout << "没有进程可以调度" << endl;
return;
}
name = popready();//就绪队列出队
srt = pcbarea[name].srt;
pcbarea[name].status = "running";
TIME = SLOT;//这是什么意思??//单处理系统是一次只能执行一个程序,所以时间片就是如果一个程序没有执行完就切换到就绪队列的尾部
//恢复cpu现场
if (srt > TIME)//如果服务时间大于时间片大小 再次转入就绪队列尾部
{ //就算是要传回也要在运行过程中显示执行了
//恢复cpu现场
ax = pcbarea[name].ax;
bx = pcbarea[name].bx;
cx = pcbarea[name].cx;
dx = pcbarea[name].dx;
pc = pcbarea[name].pc;
psw = pcbarea[name].psw;
run = name; //将选中的进程赋给运行指针//为了输出的时候写的方便
cout << "输出调度结果(要求时间太长无法满足服务时间将传回)\n" << endl;
cout << "进程号是" << pcbarea[run].name << endl;
cout << "进程状态" << pcbarea[run].status << endl;
cout << "寄存器内容" << pcbarea[run].ax << pcbarea[run].bx << pcbarea[run].cx << pcbarea[run].dx << pcbarea[run].pc << pcbarea[run].psw;
pcbarea[name].srt = srt - TIME;//写上剩下的
//传回就绪队列尾部 等待再次运行完成
pushready(name);
}
else
{ //恢复cpu现场
ax = pcbarea[name-1].ax;
bx = pcbarea[name-1].bx;
cx = pcbarea[name-1].cx;
dx = pcbarea[name-1].dx;
pc = pcbarea[name-1].pc;
psw = pcbarea[name-1].psw;
run = name-1; //将选中的进程赋给运行指针//为了输出的时候写的方便
cout << "输出调度结果\n" << endl;
cout << "进程号是" << pcbarea[run].name << endl;
cout << "进程状态" << pcbarea[run].status << endl;
cout << "寄存器内容" << pcbarea[run].ax << pcbarea[run].bx << pcbarea[run].cx << pcbarea[run].dx << pcbarea[run].pc << pcbarea[run].psw;
}
}
int main()
{
int name;
int srt;
string status="ready";
int ax, bx, cx, dx, pc, psw;
//初始化指针 让在一开始的时候就绪队列为零
ready.head = -1;
ready.tail = -1;
while (status=="ready")
{ //输入进程控制块
cout << "请输入你的进程控制块信息(当status为ready时继续进行下一个):" << endl;
cout << "标识符 服务时间 进程状态 通用寄存器中间结果缓存 通用寄存器的指针 通用寄存器串操作循环控制计数器 通用寄存器的间接的输入输出 " << endl;
cin >>name>>srt>> status >> ax >> bx >> cx >> dx >> pc >> psw;//还用不用输入寄存器的内容???
if (status != "ready")
break;
pcbarea[o].name = name;
pcbarea[o].srt = srt;
pcbarea[o].status = status;
pcbarea[o].ax = ax;
pcbarea[o].bx = bx;
pcbarea[o].cx = cx;
pcbarea[o].dx = dx;
pcbarea[o].pc = pc;
pcbarea[o].psw = psw;
cout << "name" << name << "放入了数组的第" << o << "个空位" << endl;
createprocess(name,pcbarea[o]);//这里的name是进程编号
o++;
cout <<"输入了" <<o<<"个" << endl;
}
cout << "进程输入已中止" << endl;
int shu;
shu = ready.head;
while (shu!=-1)
{
schedule();
}
}