进程调度(C/C++语言写法)

C++进程调度程序

 

按照这个实验,我用C++写了一个程序,就是进程调度的程序。下面是代码:(很多注释,希望你们能够看懂)

#include<iostream>
#include<string>
#include<fstream>
#include<windows.h>

using namespace std;

struct PCB {
	string name;//进程名
	struct PCB *next;//指针
	int time;//运行时间
	int grade;//优先级
	string state;//状态
};



PCB *head;//进程队列的头

int couter = 1;//计算第几次运行

char choose;//用来判断用户是否申请资源


void init();//初始化
void output();//打印进程调用的情况
void ReSort(PCB *p);//重新对进程队列排序
void Print();//打印
void ReadIn();
void WriteOut();
void Request();


int main() {
	init();
	output();

	return 0;
}

void init() {
	ReadIn();
	Print();
	system("pause");

}

void output() {

	PCB *p = head;

	system("cls"); 
	cout<<"第"<<couter<<"次运行:"<<endl;
	cout<<"当前运行的进程:"<<p->name<<endl;

	//Print();


	p->grade = p->grade - 1;//运行后优先级-1
	p->time = p->time - 1; //运行后运行时间-1
	couter++;

	if(head->next != NULL && p->time != 0) {//如果不为尾节点,当前的运行时间不为0,把头节点独立出来,重新按优先级排序

	//	cout<<"重新排序之前:\n\n";
		Print();

		PCB *work = head;//把头节点独立出来
		head = head->next;//将头指针指向第二节点
		PCB *p = head;
		PCB *temp = head;//用来保存上一节点

		//按优先级,插入排序
		while(p != NULL) {
			if(p->grade >= work->grade && p->next == NULL) {//如果当前节点大于或者等于独立出来的节点,且当前只有一个节点
				p->next = work;
				work->next = NULL;
				break;
			} else if(p->grade >= work->grade && p->next->grade <= work->grade) { //如果当前进程的优先级大于或者等于独立出来的节点,且当前节点的下一个节点的优先级小于或者等于独立出来的节点
				work->next = p->next;
				p->next = work;
				break;
			} else if(p->grade < work->grade) { //如果当前节点比独立的节点要小
				work->next = p;
				head = work;
				break;
			}
			temp = p;//保留当前节点
			p = p->next;
		}
		//cout<<"重新排序之后:\n\n";
		//Print();
	}
	
	
	else if(head->next == NULL && head->time != 0){//如果当前为最后一个进程,且运行时间不为0 
		Print();
	}



	else if(head->time == 0) {//如果当前进程的运行时间为0
		if(head->next != NULL) { //如果当前不是最后一个结束的节点
			head->state = "结束";
			Print();
			head = head->next;
		} else if(head->next == NULL) { //如果当前为最后一个结束的点
			head->state = "结束";
			Print();
			cout<<"所有进程均已完成!"<<endl;
			exit(0);
		}
	}



	if(choose != 'k') {
		cout<<"你想申请新的进程吗?(y申请)/(n不申请)/(k不再申请)"<<endl;
		cin>>choose;
		if(choose == 'y' || choose == 'Y') {
			ReSort(p);
		}
	}

	output();//递归调用
}

void ReSort(PCB *p) {

	PCB *temp = new PCB;
	temp->next = NULL;
	cout<<"请输入进程名:";
	cin>>temp->name;
	cout<<"请输入进程运行时间:";
	cin>>temp->time;
	cout<<"请输入进程优先级:";
	cin>>temp->grade;
	temp->state = "就绪";
	//重新排序

	p = head;
	PCB *last = head;//用来保存上一节点
	while(p != NULL) {
		if(p->grade >= temp->grade && p->next->grade <= temp->grade) {
			temp->next = p->next;
			p->next = temp;
			break;
		} else if(p->grade >= temp->grade && p->next == NULL) {
			p->next = temp;
			temp->next = NULL;
			break;
		} else if(p->grade < temp->grade) {
			temp->next = p;
			head = temp;
			break;
		}
		last = p;//保留当前节点
		p = p->next;
	}
	//调试
	Print();//打印
	
	WriteOut();
	system("pause");

}



void ReadIn() {
	ifstream inputfile;
	inputfile.open("进程调度.txt");

	head = new PCB;
	PCB *p = head;
	while(inputfile) {
		inputfile>>p->name>>p->time>>p->grade>>p->state;
		p->next = NULL;
		if(inputfile.peek() == EOF) break;//判断文件尾巴字符,到了尾巴,退出循环
		p->next = new PCB;
		p = p->next;
	}
}

void WriteOut() {
	PCB *p = head;
	ofstream outputfile;
	outputfile.open("进程调度.txt");
	while(p != NULL) {
//		if(p->next != NULL)outputfile<<p->name<<" "<<p->time<<" "<<p->grade<<" "<<p->state<<"\n";
//		else outputfile<<p->name<<" "<<p->time<<" "<<p->grade<<" "<<p->state;
		outputfile<<p->name<<" "<<p->time<<" "<<p->grade<<" "<<p->state;
		if(p->next != NULL)outputfile<<"\n";
		p = p->next;
	}
}

void Print() {
	//system("cls");
	cout<<"------------------------------------------------------------"<<endl;
	cout<<"当前进程队列\n";
	PCB *p = head;
	cout<<"进程名字    运行时间    优先级数    进程状态\n" ;
	while(p != NULL) {
		cout<<p->name<<"            ";
		cout<<p->time<<"            ";
		cout<<p->grade<<"            ";
		cout<<p->state<<endl;
		p = p->next;
	}
	cout<<"------------------------------------------------------------"<<endl<<endl;
	cout<<"正在进入运行下一个进程。。。。\n\n";
	Sleep(1500);
}

 

实验3:使用时间片轮转和优先权进程调度算法模拟 实验目的: 通过模拟进程调度算法加深对进程调度的理解 实验内容: (1)用C/C++/JAVA等语言来实现对N个进程采用优先权调度和时间片轮转调度。 (2)每个用来标识进程进程控制块PCB用结构来描述,可能需要包括以下字段(根据需要删减,不用的成员可以删除掉): 进程标识数 ID。 进程优先数 PRIORITY,并规定优先数越小的进程,其优先权越高。 进程已占用的CPU时间CPUTIME。(初始都为0) 进程总的需要运行的时间ALLTIME。 进程剩余运行时间remainTime, 当进程运行完毕时,remainTime变为0。 进程的结束时间finishTime, 当进程结束时,“系统”的时间,计算周转时间用 进程状态STATE。(就绪,运行,结束,根据需要决定是否使用) (3)输出 为观察进程调度是否正确,应输出进程的“执行”过程。但是注意,我们是模拟进程执行,所以进程并不会真正“执行”,只是输出进程执行的先后顺序,和进程执行,结束的时间点。 对于时间片轮转,应该每个时间片输出一次 ---------------------------------------------------------- Id pri cpuTime allTime 0 4 3 4 1 3 2 6 0 4 3 4 ....... 对于优先权调度,每次调度输出一次,进行的结束时间,依次输出调度进程的信息 最后输出进程的周转时间,带权周转时间和系统平均周转时间等 (4)实验数据(来自于第二章的作业) 假设就绪队列中有如下5个进程,初始时状态如下 作业 执行时间  优先数 ----------------------  1     10        3  2      6        1  3      2        4  4      4        5  5      8        2 如果使用时间片调度算法,请自行设定时间片(如1,2等),并比较不同时间片下的周转时间等,输出调度进程的信息,进程的周转时间,带权周转时间和系统平均周转时间等 (5) 实验设计: 实验的小数据量使用数组或链表都可以,但考虑到真实的应用经常要删除和添加PCB,应该使用链表,如果涉及动态的插入删除,并且需要随时找最大/最小,也可以考虑用树/堆等其他数据结构(如C++中的优先级队列)。 参考流程图如下: (6)提高要求: 6.1 给每个进程增加“到达”时间,重新计算优先级调度的各个结果,并验证结果是否正确(周转时间,带权周转时间等) 提示:为方便处理,可以使用多个队列:已到的,未到的 除了一般情况的到达时间,还需要考虑两种特殊情况:0时刻没有进程来;某个进程结束后还其他进程还没来 用如下几组数据,如: 到达时间 运行时间 优先级 3 2 3 6 2 1 0 1 2 3 3 1 等测试 6.2 考虑是否可以实现“抢占”优先级调度?提示:每个时间单位重新检测 提高要求:测试和比较: 随机产生100个进程(需要考虑随机数的范围),用你写的不同的调度算法去调度,比较他们的平均周转时间,平均带权周转时间,看看是否和理论分析一致。 实验小组讨论话题: 1.其他调度算法的模拟 2.使用“多线程”更真实的模拟(用一个线程调度,一个线程随机产生待调度的“进程”) 3.是否可以加入其他的状态模拟,比如“阻塞”(进程PCB中给出阻塞时间) 4.真实的操作系统调度代码所考虑的问题,和我们写的模拟代码的区 请用c语言完成上面的实验
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值