(1)选择1-3种磁盘调度算法(先来先服务法、最短寻道优先、电梯算法)模拟实现磁盘调度。
(2)能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等
(3)计算磁头移动的总磁道数
(4)能够显示磁盘调度结果(依次访问的磁道顺序等)
由于小编实验还未去验收实验,为了以防万一,先贴出效果图,等验收完了就将代码粘贴进来!
刚刚验收完:代码如下
#include<iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
typedef struct {
int pSize;
int id;
}sortResult;
#define MAXNUMBER 100
static int PNum; //内存中空闲分区的个数
static int FreeProcess[MAXNUMBER]; //空闲分区对应的内存
static int choice;//算法选择
int backchoice;
int rollchoice;
int continuechoice;
int rollsize;
static int SNum; //进程个数
static char SName[MAXNUMBER];//进程名字
static int SNeed[MAXNUMBER]; //进程大小
static char SWhere[MAXNUMBER][MAXNUMBER];//各个进程的分区位置
static int RWhere[MAXNUMBER][MAXNUMBER];
static int Rsize[MAXNUMBER][MAXNUMBER];
static int LeftFreeProcess[MAXNUMBER];//分区的剩余大小
static int LeftSNeed[MAXNUMBER];//进程剩余的大小
void input();//初始输入
void SelectSolution();
void initial();//初始化
void display();//展示
void firstAdapt();//最先适应法
void bestAdapt();//最佳适应法
void worstAdapt();//最坏适应法
void rolldisplay();//回收
int main() {
input();
SelectSolution();
return 0;
}
//输入分区数和大小、资源数和大小
void input() {
int i;
ifstream inData;
inData.open("dataInput.txt");
//读取数据
inData >> PNum;//分区个数
for (i = 0; i < PNum; i++) {//对应的内存
inData >> FreeProcess[i];
}
inData >> SNum;//进程个数
for (i = 0; i < SNum; i++) {//初始化名称
SName[i] = i + 65;
}
for (i = 0; i < SNum; i++) {
inData >> SNeed[i];//进程大小
}
cout << "进程名称: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SName[i] << "\t";
}
cout << endl;
cout << "进程大小: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SNeed[i] << "\t";
}
cout << endl;
cout << "分区名称: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << "P" << i + 1 << "\t";
}
cout << endl << "内存大小: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << FreeProcess[i] << "\t";
}
}
void SelectSolution() {
cout << endl << "请选择你需要的算法" << endl;
cin >> choice;
if (choice == 1) {
firstAdapt();
SelectSolution();
}
else if (choice == 2) {
bestAdapt();
SelectSolution();
}
else if (choice == 3) {
worstAdapt();
SelectSolution();
}
else {
cout << "输入格式错误,请重新输入";
SelectSolution();
}
}
void initial() {
int i, j;
for (int i = 0; i < SNum; i++) {
for (int j = 0; j < PNum; j++) {
SWhere[i][j] = NULL;//初始化进程的分区位置
RWhere[i][j] = 0;
Rsize[i][j] = 0;
LeftFreeProcess[j] = FreeProcess[j];//初始化剩余内存分区的大小
}
}
for (i = 0; i < SNum; i++) {
LeftSNeed[i] = SNeed[i];//初始化进程的剩余的大小
}
}
void firstAdapt() {
cout << "最先适应法" << endl;
initial();
int i, j;
for (i = 0; i < SNum; i++) {
for (j = 0; j < PNum; j++) {
if (LeftSNeed[i] <= LeftFreeProcess[j] && LeftFreeProcess[j] != 0) {
int startPosition = 0;
for (int p = 0; p < j; p++) {
startPosition += FreeProcess[p];
}
if (LeftFreeProcess[j] < FreeProcess[j]) {
startPosition += (FreeProcess[j] - LeftFreeProcess[j]);
}
cout << SName[i] << "的起始位置是:" << startPosition << endl;
LeftFreeProcess[j] -= LeftSNeed[i];
LeftSNeed[i] = 0;
SWhere[i][j] = SName[i];//指定进程的位置
break;
}
}
}
display();
cout << "是否进行回收?1.是 2.否" << endl;
cin >> backchoice;
int stop = 1;
if (backchoice == 1) {
while (stop) {
rollsize = 0;//每次回收作业要将回收大小初始化
cout << "请选择你要回收的作业" << endl;
cin >> rollchoice;
rollchoice -= 1;
int mark = 0;
for (int i = 0; i < PNum; i++) {
//寻找作业所在的进程
if (SWhere[rollchoice][i] == SName[rollchoice]) {
mark = i;
break;
}
}
cout<<"处在进程:" << mark + 1 << endl;
/*如果回收块的上方有空闲-start*/
int aheadsize = 0;
for (int j = rollchoice - 1; j >= 0; j--) {
if (SWhere[j][mark] == SName[j]) {
/*说明此时有进程,非空*/
break;//寻找结束
}
else if (RWhere[j][mark] == 1) {
aheadsize += Rsize[j][mark];
}
else {
continue;
}
}
/*如果回收块的上方有空闲-end*/
/*如果回收块的下方有空闲-start*/
int abacksize = 0;
int m;
for (m = rollchoice + 1; m < SNum; m++) {
if (SWhere[m][mark] == SName[m]) {
break;
}
else if (RWhere[m][mark] == 1) {
abacksize += Rsize[m][mark];
}
else if (RWhere[m][mark] == 2) {
abacksize += Rsize[m][mark];
break;
}
else {
continue;
}
}
if (m == SNum) {
abacksize += LeftFreeProcess[mark]-aheadsize;
LeftFreeProcess[mark] = 0;
RWhere[rollchoice][mark] = 2;
}
else {
RWhere[rollchoice][mark] = 1;
}
/*如果回收块的下方有空闲-end*/
/*正式回收-start*/
rollsize = aheadsize + abacksize+SNeed[rollchoice];
SWhere[rollchoice][mark] = NULL;
Rsize[rollchoice][mark] = rollsize;
cout << "回收内存:" << rollsize<<endl;
/*正式回收-end*/
/*恢复作业和进程的大小-start*/
LeftSNeed[rollchoice] = SNeed[rollchoice];
LeftFreeProcess[mark] += rollsize;
/*恢复作业和进程的大小-end*/
rolldisplay();
cout << "是否继续?1.是 2.否" << endl;
cin >> continuechoice;
if (continuechoice == 2) {
stop = 0;
}
else if (continuechoice == 1) {
stop = 1;
}
}
}/*if (backchoice == 1)*/
}
void bestAdapt() {
cout << "最佳适应法" << endl;
initial();
int i, j, s, t;
sortResult bestsort[MAXNUMBER];//用来存取每一个内存区的大小
sortResult temp;//用来作为交换中介
for (i = 0; i < PNum; i++) {
bestsort[i].pSize = LeftFreeProcess[i];
bestsort[i].id = i;
}
for (i = 0; i < SNum; i++) {
//每一次寻找都是找最接近该进程大小的内存,因此每次循环都得将内存空间进行排序
//冒泡排序
for (j = 0; j < PNum - 1; j++) {
for (t = j; t < PNum; t++) {
if (bestsort[j].pSize >= bestsort[t].pSize) {
temp = bestsort[j];
bestsort[j] = bestsort[t];
bestsort[t] = temp;
}
}
}
for (s = 0; s < PNum; s++) {
if (LeftSNeed[i] <= bestsort[s].pSize) {
int startPosition = 0;
for (int p = 0; p < bestsort[s].id; p++) {
startPosition += FreeProcess[p];
}
if (LeftFreeProcess[bestsort[s].id] < FreeProcess[bestsort[s].id]) {
startPosition += (FreeProcess[bestsort[s].id] - LeftFreeProcess[bestsort[s].id]);
}
cout << SName[i] << "的起始位置是:" << startPosition << endl;
bestsort[s].pSize -= LeftSNeed[i];
LeftSNeed[i] = 0;
SWhere[i][bestsort[s].id] = SName[i];
break;
}
}
LeftFreeProcess[bestsort[s].id] = bestsort[s].pSize;
}
display();
cout << "是否进行回收?1.是 2.否" << endl;
cin >> backchoice;
int stop = 1;
if (backchoice == 1) {
while (stop) {
rollsize = 0;//每次回收作业要将回收大小初始化
cout << "请选择你要回收的作业" << endl;
cin >> rollchoice;
rollchoice -= 1;
int mark = 0;
for (int i = 0; i < PNum; i++) {
//寻找作业所在的进程
if (SWhere[rollchoice][i] == SName[rollchoice]) {
mark = i;
break;
}
}
cout << "处在进程:" << mark + 1 << endl;
/*如果回收块的上方有空闲-start*/
int aheadsize = 0;
for (int j = rollchoice - 1; j >= 0; j--) {
if (SWhere[j][mark] == SName[j]) {
/*说明此时有进程,非空*/
break;//寻找结束
}
else if (RWhere[j][mark] == 1) {
aheadsize += Rsize[j][mark];
}
else {
continue;
}
}
/*如果回收块的上方有空闲-end*/
/*如果回收块的下方有空闲-start*/
int abacksize = 0;
int m;
for (m = rollchoice + 1; m < SNum; m++) {
if (SWhere[m][mark] == SName[m]) {
break;
}
else if (RWhere[m][mark] == 1) {
abacksize += Rsize[m][mark];
}
else if (RWhere[m][mark] == 2) {
abacksize += Rsize[m][mark];
break;
}
else {
continue;
}
}
if (m == SNum) {
abacksize += LeftFreeProcess[mark] - aheadsize;
LeftFreeProcess[mark] = 0;
RWhere[rollchoice][mark] = 2;
}
else {
RWhere[rollchoice][mark] = 1;
}
/*如果回收块的下方有空闲-end*/
/*正式回收-start*/
rollsize = aheadsize + abacksize + SNeed[rollchoice];
SWhere[rollchoice][mark] = NULL;
Rsize[rollchoice][mark] = rollsize;
cout << "回收内存:" << rollsize << endl;
/*正式回收-end*/
/*恢复作业和进程的大小-start*/
LeftSNeed[rollchoice] = SNeed[rollchoice];
LeftFreeProcess[mark] += rollsize;
/*恢复作业和进程的大小-end*/
rolldisplay();
cout << "是否继续?1.是 2.否" << endl;
cin >> continuechoice;
if (continuechoice == 2) {
stop = 0;
}
else if (continuechoice == 1) {
stop = 1;
}
}
}/*if (backchoice == 1)*/
}
void worstAdapt() {
cout << "最坏适应法" << endl;
initial();
int i, j, s, t;
sortResult worstsort[MAXNUMBER];//用来存取每一个内存区的大小
sortResult temp;//用来作为交换中介
for (i = 0; i < PNum; i++) {
worstsort[i].pSize = LeftFreeProcess[i];
worstsort[i].id = i;
}
for (i = 0; i < SNum; i++) {
//每一次寻找都是找最接近该进程大小的内存,因此每次循环都得将内存空间进行排序
//冒泡排序
for (j = 0; j < PNum - 1; j++) {
for (t = j; t < PNum; t++) {
if (worstsort[j].pSize <= worstsort[t].pSize) {
temp = worstsort[j];
worstsort[j] = worstsort[t];
worstsort[t] = temp;
}
}
}
for (s = 0; s < PNum; s++) {
if (LeftSNeed[i] <= worstsort[s].pSize) {
int startPosition = 0;
for (int p = 0; p < worstsort[s].id; p++) {
startPosition += FreeProcess[p];
}
if (LeftFreeProcess[worstsort[s].id] < FreeProcess[worstsort[s].id]) {
startPosition += (FreeProcess[worstsort[s].id] - LeftFreeProcess[worstsort[s].id]);
}
cout << SName[i] << "的起始位置是:" << startPosition << endl;
worstsort[s].pSize -= LeftSNeed[i];
LeftSNeed[i] = 0;
SWhere[i][worstsort[s].id] = SName[i];
break;
}
}
if (s < PNum) {
LeftFreeProcess[worstsort[s].id] = worstsort[s].pSize;
}
}
display();
cout << "是否进行回收?1.是 2.否" << endl;
cin >> backchoice;
int stop = 1;
if (backchoice == 1) {
while (stop) {
rollsize = 0;//每次回收作业要将回收大小初始化
cout << "请选择你要回收的作业" << endl;
cin >> rollchoice;
rollchoice -= 1;
int mark = 0;
for (int i = 0; i < PNum; i++) {
//寻找作业所在的进程
if (SWhere[rollchoice][i] == SName[rollchoice]) {
mark = i;
break;
}
}
cout << "处在进程:" << mark + 1 << endl;
/*如果回收块的上方有空闲-start*/
int aheadsize = 0;
for (int j = rollchoice - 1; j >= 0; j--) {
if (SWhere[j][mark] == SName[j]) {
/*说明此时有进程,非空*/
break;//寻找结束
}
else if (RWhere[j][mark] == 1) {
aheadsize += Rsize[j][mark];
}
else {
continue;
}
}
/*如果回收块的上方有空闲-end*/
/*如果回收块的下方有空闲-start*/
int abacksize = 0;
int m;
for (m = rollchoice + 1; m < SNum; m++) {
if (SWhere[m][mark] == SName[m]) {
break;
}
else if (RWhere[m][mark] == 1) {
abacksize += Rsize[m][mark];
}
else if (RWhere[m][mark] == 2) {
abacksize += Rsize[m][mark];
break;
}
else {
continue;
}
}
if (m == SNum) {
abacksize += LeftFreeProcess[mark] - aheadsize;
LeftFreeProcess[mark] = 0;
RWhere[rollchoice][mark] = 2;
}
else {
RWhere[rollchoice][mark] = 1;
}
/*如果回收块的下方有空闲-end*/
/*正式回收-start*/
rollsize = aheadsize + abacksize + SNeed[rollchoice];
SWhere[rollchoice][mark] = NULL;
Rsize[rollchoice][mark] = rollsize;
cout << "回收内存:" << rollsize << endl;
/*正式回收-end*/
/*恢复作业和进程的大小-start*/
LeftSNeed[rollchoice] = SNeed[rollchoice];
LeftFreeProcess[mark] += rollsize;
/*恢复作业和进程的大小-end*/
rolldisplay();
cout << "是否继续?1.是 2.否" << endl;
cin >> continuechoice;
if (continuechoice == 2) {
stop = 0;
}
else if (continuechoice == 1) {
stop = 1;
}
}
}/*if (backchoice == 1)*/
}
//显示分区结果
void display() {
int i;
cout << endl;
cout << "进程名称: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SName[i] << "\t";
}
cout << endl;
cout << "进程大小: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SNeed[i] << "\t";
}
cout << endl;
cout << "分区名称: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << "P" << i + 1 << "\t";
}
cout << endl << "内存大小: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << FreeProcess[i] << "\t";
}
cout << endl << "分区剩余内存大小: " << "\t";
for (i = 0; i < PNum; i++) {
cout << LeftFreeProcess[i] << "\t";
}
cout << endl << "分区结果:" << endl;
for (i = 0; i < SNum; i++) {
bool find = false;
for (int j = 0; j < PNum; j++) {
if (SWhere[i][j] != NULL) {
find = true;
cout << SWhere[i][j] << ":P" << j + 1 << endl;
}
}
if (!find) {
cout << SName[i] << ":没有合适的内存P?"<<endl;
}
}
}
void rolldisplay() {
int i;
cout << endl;
cout << "进程名称: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SName[i] << "\t";
}
cout << endl;
cout << "进程大小: " << "\t\t";
for (i = 0; i < SNum; i++) {
cout << SNeed[i] << "\t";
}
cout << endl;
cout << "分区名称: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << "P" << i + 1 << "\t";
}
cout << endl << "内存大小: " << "\t\t";
for (i = 0; i < PNum; i++) {
cout << FreeProcess[i] << "\t";
}
cout << endl << "分区剩余内存大小: " << "\t";
for (i = 0; i < PNum; i++) {
cout << LeftFreeProcess[i] << "\t";
}
cout << endl << "分区结果:" << endl;
for (i = 0; i < SNum; i++) {
bool find = false;
for (int j = 0; j < PNum; j++) {
if (SWhere[i][j] != NULL) {
find = true;
cout << SWhere[i][j] << ":P" << j + 1 << endl;
}
}
if (!find) {
cout << SName[i] << ":已经被回收" << endl;
}
}
}