处理机调度实验

一、实验名称处理机调度           

 

二、实验目的与要求

目的:通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解有关调度算法的基本原理。

要求:设计一个对N个并发的进程实现处理机调度的程序,调度算法可选用先来先服务、最高优先数、轮转法等任一种。

三、实验内容

    在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,调度的策略采用先来先服务调度算法。

    通过该程序可以了解OS中进程的几种状态,以及基本的调度进程的策略。

    假定系统的并发度为五(最多可以创建5个进程),每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:

进程名

要求运行时间

状态

指针

    其中,进程名——作为进程的标识;

要求运行时间——假设进程需要运行的单位时间数;

状态——可假设有三种状态,“就绪”状态、“阻塞”状态和“结束”状态。新创建进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示,“阻塞”状态的进程用“B”表示。

指针——用指针指出下一个进程具有相同状态的进程控制块的首地址;

    系统可以设置两个队列(就绪,堵塞)

    设计时通过控制台输入命令,如

New:新建进程,则增加一个pcb到就绪队列;

Run(finish):运行进程,则从就绪队列头部删除一进程并投入运行,显示运行状态,并顺利结束;

Run(wait):运行后堵塞,从就绪队列头部删除一进程并投入运行,显示运行1个时间单位后又堵塞,并将此进程加入到堵塞队列尾部;

Signal:唤醒进程,从堵塞队列头部将堵塞的进程加入到就绪队列尾部;

                Show显示所有进程的进程控制块PCB的信息。

代码实现:

#include 
#include 
#include 
using namespace std;
const int READY = 1;  // 就绪
const int RUN =2; //运行
const int END = 3;  // 结束
const int BLOCK=4;  // 阻塞

typedef struct node { //进程控制块PCB
	string Name;
	int Runtime;
	int Status = READY;
	struct node *next=NULL;
} PCB;

PCB*ready_head=new PCB,*ready_tail=NULL,*block_head=new PCB,*block_tail=NULL;//就绪队列,阻塞队列

void New() {
	cout<<"------新建进程------"<next ==NULL) {
		ready_head->next = process;
	} else {
		ready_tail->next=process;
	}
	cout<<" 输入线程的名称:";
	cin>>process->Name;
	cout<<" 输入线程的运行时间:";
	cin>>process->Runtime;
	ready_tail=process;
	cout<<" 进程创建成功!"<next ==NULL) {
		cout<<" 就绪队列为空!"<next;
	ready_head->next=ready_head->next->next;
	cout<Name<<" 运行完毕."<next ==NULL) {
		cout<<" 就绪队列为空!"<next;
	ready_head->next=ready_head->next->next;
	cout<<" 进程 "<Name<<" 运行一个时间单位"<Runtime--; 
	process->Status=BLOCK;
	cout<<" 该进程阻塞..."<next==NULL) {
		block_head->next=process;
	} else {
		block_tail->next=process;
	}
	block_tail=process;
	block_tail->next=NULL;
	cout<<" 进程阻塞成功!"<next;
	block_head->next=block_head->next->next;
	if(ready_head->next==NULL) {
		ready_head->next=process;
	} else {
		ready_tail->next=process;
	}
	process->Status=READY;
	ready_tail=process;
	process->next=NULL;
	cout<Name<<"进程唤醒成功!"<next;
	cout<<"进程名	cpu_time	状态"<Name<<"	"<Runtime<<"		";
		if(p->Status==1) {
			cout<<"READY"<Status==2) {
			cout<<"RUN"<Status==3) {
			cout<<"END"<next;
	}
	p=block_head->next;
	while(p!=NULL) {
		cout<Name<<"	"<Runtime<<"		";
		if(p->Status==1) {
			cout<<"READY"<Status==2) {
			cout<<"RUN"<Status==3) {
			cout<<"END"<next;
	}
} 
int main() {
	while(true) {
		cout<<"***************欢迎来到先来先服务调度算法***************"<>cmd;
		if(cmd=="1") {
			New();
		} else if(cmd=="2") {
			Run_finish();
		} else if(cmd=="3") {
			Run_wait();
		} else if(cmd=="4") {
			Signal();
		} else if(cmd=="5") {
			Show();
		} else if (cmd=="q") {
			break;
		} else {
			cout<<"错误输入!"<

实验结果:

  1. 创建进程:实验截图(已创建p1为例),创建了p1,p2,p3

处理机调度实验_第1张图片

 2. 运行并结束进程:实验截图

处理机调度实验_第2张图片

 3. 运行后阻塞:实验截图

处理机调度实验_第3张图片

 4. 唤醒进程:实验截图

处理机调度实验_第4张图片

你可能感兴趣的:(操作系统,操作系统,进程调度)