① 设计PCB及其数据结构:
进程标识数:ID
进程优先数:PRIORITY(优先数越大,优先级越高)
进程已占用时间片:CPUTIME,每得到一次调度,值加1;
进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)
进程队列指针:NEXT,用来将PCB排成队列
进程状态:STATE(一般为就绪,可以不用)
② 设计进程就绪队列及数据结构;
③ 设计进程调度算法,并画出程序流程图;
④ 设计输入数据和输出格式;
结构格式:当前正运行的进程:0
当前就绪队列:2,1,3,4
⑤ 编程上机,验证结果。
#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
int id;
unsigned int arrivetime;
unsigned int alltime;
unsigned int usetime;
int finishtime;
}pcb; //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
int i=0,j=0;
pcb temp[1];
for (i; i < 5; i++) {
for (j=i+1 ; j < 5; j++) {
if (list[j].arrivetime < list[i].arrivetime) {
temp[0] = list[i];
list[i] = list[j];
list[j] = temp[0];
}
}
}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
printf("\n正在执行的进程:\n");
cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;
printf("\n排队进程:\n");
cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
for (int t = 0; t < i; t++) {
if (list[t].finishtime == 0) {
cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
}
}
}
// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
listsorted(pcblist);
pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
pcblist[0].usetime = pcblist[0].alltime;
listtime += pcblist[0].usetime;
listprint(pcblist, i);
pcblist[0].arrivetime = -99;
}
#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
int id;
unsigned int arrivetime;
unsigned int alltime;
unsigned int usetime;
int finishtime;
}pcb; //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
int i=0,j=0;
pcb temp[1];
for (i; i < 5; i++) {
for (j=i+1 ; j < 5; j++) {
if (list[j].arrivetime < list[i].arrivetime) {
temp[0] = list[i];
list[i] = list[j];
list[j] = temp[0];
}
}
}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
printf("\n正在执行的进程:\n");
cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;
printf("\n排队进程:\n");
cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
for (int t = 0; t < i; t++) {
if (list[t].finishtime == 0) {
cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
}
}
}
// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
listsorted(pcblist);
pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
pcblist[0].usetime = pcblist[0].alltime;
listtime += pcblist[0].usetime;
listprint(pcblist, i);
pcblist[0].arrivetime = -99;
}
#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
int id;
unsigned int arrivetime;
unsigned int alltime;
unsigned int usetime;
int finishtime;
}pcb; //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
int i=0,j=0;
pcb temp[1];
for (i; i < 5; i++) {
for (j=i+1 ; j < 5; j++) {
if (list[j].arrivetime < list[i].arrivetime) {
temp[0] = list[i];
list[i] = list[j];
list[j] = temp[0];
}
}
}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
printf("\n正在执行的进程:\n");
cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;
printf("\n排队进程:\n");
cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
for (int t = 0; t < i; t++) {
if (list[t].finishtime == 0) {
cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
}
}
}
// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
listsorted(pcblist);
pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
pcblist[0].usetime = pcblist[0].alltime;
listtime += pcblist[0].usetime;
listprint(pcblist, i);
pcblist[0].arrivetime = -99;
}
#pragma once
//排序,row行数,m根据某一列排序
void sorted(int a[5][5], int row, int m)
{
int n,j,t;
int temp[10];
for (n = 0; n < row - 1; n++) {
for (j = n + 1; j < row; j++)
if (a[j][m] > a[n][m])
{
for (t = 0; t < row ; t++) {
temp[t] = a[n][t];
a[n][t] = a[j][t];
a[j][t] = temp[t];
}
}
}
}
//打印元素a二维数组,
void print_f(int a[][5],int row,int column,string s[])
{
int n, m;
printf("\n\n\t\t\t各进程状态\n");
cout <<s[0]<<"\t\t" << s[1]<<"\t" << s[2] << "\t\t" << s[3] << "\t\t" << s[4];
printf("\n");
for (n = 0; n < row; n++) {
for (m = 0; m < column; m++) {
printf("%d\t\t",a[n][m]);
if (m == column - 1) printf("\n");
}
}
}
//调度算法,a二维数组,row行键,column列键,arr就绪队列
void process_manege(int a[][5],int row,int column, int* arr,int &arr_count)
{
int check, temp_i = 0, id_count = 0;
int temp[5] = { -1,-1,-1,-1,-1 };
for (check = 0; check < row; check++) {
if (a[check][4] == 0) { //判断进程是否结束
printf("\n第%d号进程已结束", a[check][0]);
for (int m = 1; m < column-1; m++) a[check][m] = -99;
//arr_count = arr_count-1;
}
}
sorted(a, row, 1);
for (id_count ,temp_i; id_count <row;id_count++) //添加至就绪队列
{
if (a[id_count][4] != 0) {
temp[temp_i] = a[id_count][0];
temp_i++;
}
arr = temp;
}
printf("\n当前正运行的进程:%d",arr[0]);
printf("\n当前就绪队列:");
for (int state_id = 1; state_id < row;state_id++)
printf(" %d ", arr[state_id]);
a[0][1]-=3,a[0][2]+=1,a[0][3]-=1; //对正在运行进程进行更改
if (a[0][3] == 0) { a[0][4] = 0; arr_count = arr_count - 1; }
}
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
#include "标头1.h"
int main1()
{
int timepip = 2;
int row=5; //进程数
int column = 5;//属性数
int arr[5] = { NULL };//就绪队列
int arr_count = 5; //计数arr里元素个数
int flag = 1;
//初始化静态数组,ID,PRIORITY,CPUTIME,ALLTIME,STATE(ready=1,finish=0)
string pcb[15] = { "ID","PRIORITY","CPUTIME","ALLTIME","STATE" };
int process_id[5][5] = { { 0,9,0,3,1 },{ 1,38,0,2,1 }, { 2,30,0,6,1 }, { 3,29,0,3,1 },{ 4,0,0,4,1 } };
printf("初始进程队列\n");
print_f(process_id, row, column, pcb);
printf("\n");
while (flag) {
printf("已用时间:%ds", timepip);
process_manege(process_id, row, column, arr,arr_count);
printf("\t剩余进程%d个",arr_count);
print_f(process_id, row, column, pcb);
timepip += 2;
if(arr_count == 0) flag = 0;
printf("\n\n");
}
return 0;
}
int main2()
{
int listtime = 0;
int i = 5,j =5; //i=j表示进程个数
pcb pcblist[5] = { NULL };
pcblist[0].id = 1, pcblist[0].arrivetime = 4, pcblist[0].alltime = 4, pcblist[0].usetime = 0, pcblist[0].finishtime = 0;
pcblist[1].id = 2, pcblist[1].arrivetime = 9, pcblist[1].alltime = 6, pcblist[1].usetime = 0, pcblist[1].finishtime = 0;
pcblist[2].id = 3, pcblist[2].arrivetime = 1, pcblist[2].alltime = 45, pcblist[2].usetime = 0, pcblist[2].finishtime = 0;
pcblist[3].id = 4, pcblist[3].arrivetime = 3, pcblist[3].alltime = 5, pcblist[3].usetime = 0, pcblist[3].finishtime = 0;
pcblist[4].id = 5, pcblist[4].arrivetime = 2, pcblist[4].alltime = 22, pcblist[4].usetime = 0, pcblist[4].finishtime = 0;
while (j>0)
{
Fifo(pcblist, listtime, i);
printf("总花销时间:%d\n\n",listtime);
j--;
}
return 0;
}
int main()
{
printf("使用优先级时间片算法:\n");
main2();
printf("使用先来先服务算法:\n");
main1();
}