华师操作系统实验一——进程调度的设计与实现实验报告
操作系统实验报告(进程调度)
华中师范大学计算机科学系《操作系统》实验报告实验题目:进程调度学生姓名:日期:2011-12-9实验2进程调度进程完成,撤消该进程就绪队列首进程投入运行 时间片到,运行进程已占用CPU 时间+1 运行进程已占用CPU 时间已达到所需的运行时间 把运行进程插入到下一个队列的队尾插入新的进程开始 初始化PCB,输入进程信息 所有队列都为空 各进程按FCFS 原则排队等待调度 【实验目的】(1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
(2)了解Windows2000/XP 中进程(线程)的调度机制。
(3)学习使用Windows2000/XP 中进程(线程)调度算法,掌握相应的与调度有关的Win32 API 函数。
【实验内容】在Windows XP 、Windows 2000等操作系统下,使用的VC 、VB 、java 或C 等编程语言,利用相应的WIN32 API 函数,编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法。
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1、进程调度算法:采用多级反馈队列调度算法。
其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS 原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS 原则等待调度执行,以此类推。
2、实验步骤:(1)按先来先服务算法将进程排成就绪队列。
(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。
(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。
(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。
(5)重复步骤(2)、(3)、(4),直到就绪队列为空。
操作系统原理 实验一:进程调度实验报告书-模板
计算机科学系实验报告书课程名:《操作系统原理》题目:进程调度班级:学号:姓名:操作系统原理实验——进程调度实验报告一、目的与要求1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C 语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。
本实验可加深对进程调度算法的理解。
2)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)3)于2012年10月22日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。
3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序实验步骤:1、理解本实验中关于两种调度算法的说明。
2、根据调度算法的说明,画出相应的程序流程图。
3、按照程序流程图,用C语言编程并实现。
源程序:#include <stdlib.h>/*进程调度优先权法*/#include <stdio.h>#include <time.h>#define null 0struct PCB{int id;int prior;int used;int need;int run;char status;struct PCB * next;};main(){struct PCB *head,*rear,*temp,*run,*small,*p,*q;int i,j,t;printf("优先权进程调度算法\n\n 5个初始进程详细信息如下:\n\n");printf("\t进程号\t优先级\tused\tneed\t状态\t下一PCB\n\n");head=null;rear=null;for(i=1;i<=5;i++) { //动态生成含5个元素的队列temp=malloc(sizeof(struct PCB)); //动态分配一个PCB temp->id=i;temp->prior=rand()%5;temp->status='W';temp->next=null;if (head==null){head=temp;rear=head;}else{rear->next=temp;rear=temp;}}temp=head;while(temp!=null){printf("\t%d\t%d\t%c\t%d\n",temp->id,temp->prior,temp->status,temp->next);temp=temp->next;}getchar(); //让程序停下来,可以查看结果。
操作系统的实验报告材料(进程调度算法)
操作系统实验报告实验1进程调度算法报告日期:2016-6-10姓名:学号:班级:任课教师:实验1进程调度算法一、实验内容按优先数调度算法实现处理器调度。
二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验原理设计一个按优先数调度算法实现处理器调度的程序。
(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。
用一单元指出队首进程,用指针指出队列的连接情况。
例:队首标志K1K2K3K4K5PCB1 PCB2 PCB3 PCB4 PCB5(4) 处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。
提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。
操作系统进程调度实验报告
《计算机操作系统》课程实验报告题目实验一进程调度学院: 计算机学院专业: 计算机科学与技术姓名班级学号2015年10月21日实验一进程调度1.实验目的:通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。
2.实验内容:用C语言实现对N个进程采用某种进程调度算法先来先服务调度、短作业优先调度的调度。
3.设计实现:要求给出设计源码,设计源码要有详细注释,#include <stdio.h>#include<iostream>using namespace std;struct program{char name; /*进程名*/int atime; /*到达时间*/int stime; /*服务时间*/int ftime; /*完成时间*/int rtime; /*周转时间*/float qrtime; /*带权周转时间*/};void xianshi(struct program a[],int n){int i,j;struct program t;/*将进程按时间排序*/printf("根据到达时间重新排序:\n");printf("*****进程*************到达时间***************服务时间*****\n");for(j=0;j<n-1;j++)for(i=0;i<n-1-j;i++)if(a[i].atime>a[i+1].atime){t.atime=a[i].atime;a[i].atime=a[i+1].atime;a[i+1].atime=t.atime;=a[i].name;a[i].name=a[i+1].name;a[i+1].name=;t.stime=a[i].stime;a[i].stime=a[i+1].stime;a[i+1].stime=t.stime;}for(i=0;i<n;i++)printf(" %c %d %d |\n",a[i].name,a[i].atime,a[i].stime);printf("----------------------------------------------------\n"); }void fcfs(struct program a[],int n){int i;int time=0;for(i=0;i<n;i++){time=time+a[i].stime;a[i].ftime=a[0].atime+time;a[i].rtime=a[i].ftime-a[i].atime;a[i].qrtime=(float)a[i].rtime/a[i].stime;}printf("\nFCFS算法:\n");printf("*****进程****到达时间****完成时间******周转时间*******带权周转时间*****\n");for(i=0;i<n;i++){printf(" %c %d %.2d %.2d %.2f |\n",a[i].name,a[i].atime,a[i].ftime,a[i].rtime,a[i].qrtime);}printf("-----------------------------------------------------------------------\n");}void main(){int i,m;struct program pro[4];/*创建进程 */printf(" ******先来先服务算法****** \n");printf("请输入进程的数目:\n");scanf("%d",&m);i=m;for(i=0;i<m;i++){printf("请输入进程%d的进程名,到达时间,服务时间\n",i+1);cin>>pro[i].name>>pro[i].atime>>pro[i].stime;}xianshi(pro,m);fcfs(pro,m);getchar();}#include <stdio.h>#include<iostream>using namespace std;struct program{char name; /*进程名*/float atime; /*到达时间*/float stime; /*服务时间*/float ftime; /*完成时间*/float rtime; /*周转时间*/float qrtime; /*带权周转时间*/};void xianshi(struct program a[],int n){int i,j;struct program t;/*将进程按时间排序*/printf("重新排序:\n");printf("*****进程*************到达时间***************服务时间*****\n");for(j=0;j<n-1;j++)for(i=1;i<n-1-j;i++)if(a[i].stime>a[i+1].stime){t.atime=a[i].atime;a[i].atime=a[i+1].atime;a[i+1].atime=t.atime;=a[i].name;a[i].name=a[i+1].name;a[i+1].name=;t.stime=a[i].stime;a[i].stime=a[i+1].stime;a[i+1].stime=t.stime;}for(i=0;i<n;i++)printf(" %c %f %f |\n",a[i].name,a[i].atime,a[i].stime);printf("----------------------------------------------------\n"); }void SJF(struct program a[],int n){int i;a[0].ftime=a[0].atime+a[0].stime;a[0].rtime=a[0].ftime-a[0].atime;a[0].qrtime=a[0].rtime/a[0].stime;for(i=1;i<n;i++){a[i].ftime=a[i-1].ftime+a[i].stime;a[i].rtime=a[i].ftime-a[i].atime;a[i].qrtime=a[i].rtime/a[i].stime;}printf("\nSJF算法:\n");printf("*****进程****到达时间****完成时间******周转时间*******带权周转时间*****\n");for(i=0;i<n;i++){printf(" %c %.2f %.2f %.2f %.2f |\n",a[i].name,a[i].atime,a[i].ftime,a[i].rtime,a[i].qrtime);}printf("-----------------------------------------------------------------------\n");}void main(){int i,m;struct program pro[4];/*创建进程 */printf(" ******短作业优先算法****** \n");printf("请输入进程的数目:\n");scanf("%d",&m);i=m;for(i=0;i<m;i++){printf("请输入进程%d的进程名,到达时间,服务时间\n",i+1);cin>>pro[i].name>>pro[i].atime>>pro[i].stime;}xianshi(pro,m);SJF(pro,m); getchar(); }4.实验结果5.实验过程中出现的问题及解决办法先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行。
进程的调度实验报告(3篇)
第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。
二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。
2. 实现三种调度算法:FCFS、RR和DP。
3. 创建一个进程队列,用于存储所有进程。
4. 实现调度函数,根据所选算法选择下一个执行的进程。
5. 模拟进程执行过程,打印进程执行状态和就绪队列。
四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。
操作系统进程调度实验报告
操作系统进程调度实验报告操作系统进程调度实验报告引言:操作系统是计算机系统中的核心软件之一,负责管理计算机的硬件资源并提供用户与计算机硬件之间的接口。
进程调度作为操作系统的重要功能之一,负责决定哪个进程可以获得处理器的使用权,以及进程如何在处理器上运行。
本实验旨在通过设计和实现一个简单的进程调度算法,加深对操作系统进程调度原理的理解。
一、实验目的本实验的主要目的是通过编写代码模拟操作系统的进程调度过程,掌握进程调度算法的实现方法,深入理解不同调度算法的特点和适用场景。
二、实验环境本实验使用C语言进行编程实现,可在Linux或Windows系统下进行。
三、实验内容1. 进程调度算法的选择在本实验中,我们选择了最简单的先来先服务(FCFS)调度算法作为实现对象。
FCFS算法按照进程到达的先后顺序进行调度,即先到先服务。
这种调度算法的优点是简单易实现,但缺点是无法适应不同进程的执行时间差异,可能导致长作业效应。
2. 进程调度的数据结构在实现进程调度算法时,我们需要定义进程的数据结构。
一个进程通常包含进程ID、到达时间、执行时间等信息。
我们可以使用结构体来表示一个进程,例如:```struct Process {int pid; // 进程IDint arrival_time; // 到达时间int burst_time; // 执行时间};```3. 进程调度算法的实现在FCFS调度算法中,我们需要按照进程到达的先后顺序进行调度。
具体实现时,可以使用一个队列来保存待调度的进程,并按照到达时间的先后顺序将进程入队。
然后,按照队列中的顺序依次执行进程,直到所有进程执行完毕。
4. 实验结果分析通过实现FCFS调度算法,我们可以观察到进程调度的过程和结果。
可以通过输出每个进程的执行顺序、等待时间和周转时间等指标来分析调度算法的效果。
通过比较不同调度算法的指标,可以得出不同算法的优缺点。
四、实验步骤1. 定义进程的数据结构,包括进程ID、到达时间和执行时间等信息。
操作系统进程调度实验报告1
一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。
二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法(先来先服务算法,短作业算法)分别进行模拟调度。
三、实验内容编程实现如下算法1.先来先服务算法;2.短作业算法四、实验代码1.先来先服务算法#include"stdio.h"#include"stdlib.h"typedef struct PCB //定义进程控制块{ char name[10]; //进程名char state; //运行状态int ArriveTime; //到达时间int StartTime; //进程开始时间int FinishTime; //进程结束时间int ServiceTime; //服务时间float WholeTime; //周转时间float WeightWholeTime;//带权周转时间double AverageWT_FCFS; //平均周转时间double AverageWWT_FCFS;//带权平均周转时间struct PCB *next; //指向下个进程}pcb;double x=0,y=0;int i;int time; //计时器int n; //进程个数pcb *head=NULL,*p,*q; //进程链表指针void run_FCFS(pcb *p1) //运行未完成的进程{time = p1->ArriveTime > time? p1->ArriveTime:time;p1->StartTime=time;printf("\n时刻:%d, 当前开始运行作业%s\n\n",time,p1->name);time+=p1->ServiceTime;p1->state='T';p1->FinishTime=time;p1->WholeTime=p1->FinishTime-p1->ArriveTime;p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime;x+=p1->WholeTime;y+=p1->WeightWholeTime;p1->AverageWT_FCFS=p1->WholeTime/n;p1->AverageWWT_FCFS=p1->WeightWholeTime/n;printf(" 到达时间开始时间服务时间完成时间周转时间带权周转时间\n");printf("%6d %10d %10d %8d %10.1f %10.2f \n ",p1->ArriveTime,p1->StartTime,p1->ServiceTime,p1->FinishTime,p1->WholeTime,p1->WeightWholeTime);printf("\n平均周转时间平均带权周转时间\n");printf(" %10.2f %10.2f\n ",p1->AverageWT_FCFS,p1->AverageWWT_FCFS);}void FCFS() //找到当前未完成的进程{int i;p=head;for(i=0;i<n;i++){if(p->state=='F'){ q=p; //标记当前未完成的进程run_FCFS(q);}p=p->next;}}void getInfo() //获得进程信息并创建进程{int num;printf("\n进程个数:");scanf("%d",&n);for(num=0;num<n;num++){p=(pcb *)malloc(sizeof(pcb));printf("依次输入:\n进程名到达时间服务时间\n");scanf("%s\t%d\t%d",&p->name,&p->ArriveTime,&p->ServiceTime);if(head==NULL){head=p;q=p;time=p->ArriveTime;}if(p->ArriveTime < time)time=p->ArriveTime;q->next=p;p->StartTime=0;p->FinishTime=0;p->WholeTime=0;p->WeightWholeTime=0;p->next=NULL;p->state='F';q=p;}}void main(){printf("先来先服务FCFS算法模拟\n");getInfo();p=head;FCFS();}2.短作业调度算法#include<iostream>#include<stdio.h>#include<iomanip>#include<queue>#include<deque>using namespace std;class JCB{public:int start,end,arrive,runtime,zhou,weizhou;string name;char state;void Show(){cout.width(9);cout<<name;cout.width(9);cout<<arrive;cout.width(11);cout<<runtime;cout.width(13);cout<<start;cout.width(10);cout<<end;cout.width(10);cout<<zhou;cout.width(9);cout<<(double)zhou/runtime<<endl;}bool operator<(const JCB& node)const{return arrive<node.arrive;}};int main(){int num;deque<JCB> Q;JCB jcb;cout<<"(SJF)请输入作业数目:";cin>>num;for(int i=1; i<=num; i++){cout<<"\n请输入作业名,到达时间,运行时间:";cin>>>>jcb.arrive>>jcb.runtime;jcb.state='W';Q.push_back(jcb);}deque<JCB>::iterator it,jt,current;current=Q.begin();current->start=current->arrive;current->end=current->start+current->runtime;current->zhou=current->end-current->arrive;current->state='R';for(int i=2; i<=num; i++){int flag=0;for(it=Q.begin(); it!=Q.end(); it++){if(flag==0)for(jt=Q.begin(); jt!=Q.end(); jt++)if(jt->state=='W') break;if(it->state=='W'&&it->arrive<=current->end&&it->runtime<jt->runtime){ jt=it; flag=1;}}if(jt->arrive<=current->end)jt->start=current->end;else jt->start=jt->arrive;jt->end=jt->start+jt->runtime;jt->zhou=jt->end-jt->arrive;jt->state='R';current=jt;}cout<<"\n作业名到达时间服务时间开始执行时间完成时间周转时间带权周转时间"<<endl;cout.setf(ios::left);double sum=0;while(!Q.empty()){jcb=Q.front();jcb.Show();sum+=(double )jcb.zhou/jcb.runtime;Q.pop_front();}cout<<"\n短作业优先算法(SJF)平均带权周转时间:"<<sum/num<<endl;return 0;}五、实验结果1.执行结果2.结果分析先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行。
操作系统实验报告1——进程调度的设计与实现
//画一次进程的调度情况 //1、画正在运行进程的PCB //设置下一个输出文本的字体颜色为绿色 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |
8
} cout << endl; } } }
//新建一个进程的函数 bool threadmanager::newpro() {
struct readyque* t = NULL;
for (int i = 1; i <= 100; ++i) {
if (pidarray[i] == true) //找一个空的进程号 {
一、实验名称:进程调度的设计与实现
二、实验目的: 1. 综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布尔数组,非阻塞
输入,图形用户界面 GUI,进程控制块,进程状态转换,多级反馈队列进程调度算 法。 2. 加深理解操作系统进程调度的过程。 3. 加深理解多级反馈队列进程调度算法。
三、实验内容: 1. 采用一种熟悉的语言,如 C、PASCAL 或 C++ 等,编制程序,最好关键代码采用
//进程队列节点(由于仅仅是模拟实验,这里无动作) struct process {
};
//进程控制块PCB struct PCB {
int pid; //进程标识符 string status; //进程的状态标识,取值为ready或run int priority; //进程优先级,0到49范围内的一个随机整数 process* next; //进程的队列指针 int life; //进程生命周期,1到5范围内的一个随机整数
操作系统实验报告-进程调度实验
进程调度实验一.实验目的及要求:进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
二 . 实验环境:操作系统:Windows XP编译环境:Visual C++ 6.0三.算法描述进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
四. 实验步骤:1.、进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间。
2、程序源码结构:struct pcb { /* 定义进程控制块PCB */char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;sort(){…} /* 建立对进程进行优先级排列函数*/ check(){…} /* 建立进程查看函数*/input(){…} /* 建立进程控制块函数*/main() /*主函数*/{...input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("\n The execute number:%d \n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n resume......");ch=getchar();}printf("\n\n finished.\n");ch=getchar();}3.、实验截图:简单轮转法4、实验结果的分析及说明在操作系统中,由于进程总数多于处理机,它们必然竞争处理机。
操作系统实验报告-进程调度法的实现
操作系统实验报告进程调度算法的实现1.实验目的进程是操作系统最重要的概念之一,本实验通过对进程调度模拟程序的运行,学习运用时间片轮转法进行进程调度,加深对进程的基本调度状态以及进程调度算法的理解。
2.算法思想进程调度算法:采用多级反馈队列调度算法。
其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
4.算法。
5.程序代码程序的主要代码如下:#include<iostream.h>#include<stdlib.h>#include<time.h>#include<stdio.h>#include<string.h>const int MAXCOMMANDLEN =50;///////////////////////////////////////////////////////////////////////////////////////// PROCESS///////////////////////////////////////////////////////////////////////////////////////class Process{friend class CPU; //友元类protected:static int init_ID; //静态初始IDint ID; //进程IDchar runText[MAXCOMMANDLEN]; //进程指令数组int IP; //进程指令指针,保存进程指令执行到的具体位置bool ISuseSource; //进程是否使用资源(是或者否)bool ISblocked; //进程是否被阻塞(是或者否)int unitTime; //进程被cpu执行单位时间, 默认 1int blockTime; //进程被阻塞时间public:static void RandID(); //静态随机生成进程ID的函数Process(); //进程类的构造函数int getID(); //得到进程IDint getIP(); //获取进程指令指针IPvoid setIP(int); //设置IPvoid Runed(); //进程被执行int getUnittime(); //得到进程的单位执行时间2int getBlcoktime(); //得到进程被阻塞的时间void setBlocktime(int); //设置进程被阻塞的时间void setUnittime(int); //设置进程的单位执行时间char getResult(int); //得到进程被执行的结果char* getRuntext(); //得到进程执行的指令void setBlockstate(bool); //设置进程阻塞状态bool getBlockstate(); //得到进程阻塞状态bool getISusesource(); //得到资源的使用状态void setISusesource(bool); //设置资源的使用状态};int Process::init_ID; //初始化静态变量void Process::RandID() //随机产生一个进程ID{srand((unsigned)time(NULL)); //调用srand随机生成函数init_ID=rand();}Process::Process() //进程的构造函数{ID=init_ID++; //进程ID的初值为静态初始ID的值int commandLen; //命令行长度IP=0;cout<<"Please input the text which process runed by CPU [#command#] :>\\ ";cin>>runText; //输入命令if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN )exit(0); //输入长度超出最大长度时退出,特殊情况处理3runText[commandLen]='#'; //初始指令结束标志 '#' runText[commandLen+1]='\0'; //字符串结束标志ISuseSource=false; //设置资源的使用状态为未使用ISblocked=false; //进程的初始状态-》未被阻塞unitTime=1; //进程被执行的单位时间为1 blockTime=0; //阻塞时间为0}void Process::Runed() //进程被CPU执行{cout<<getResult(IP++); //输出得到的进程执行结果}int Process::getID() //得到进程ID {return ID;}int Process::getIP() //得到进行IP {return IP;}void Process::setIP(int ip) //设置进程IP {IP=ip;}bool Process::getISusesource() //得到资源的使用状态{return ISuseSource;4}void Process::setISusesource(bool s) //设置资源的使用状态{ISuseSource=s;}char* Process::getRuntext() //得到进程执行的指令{return runText;}int Process::getUnittime() //得到进程的单位执行时间{return unitTime;}int Process::getBlcoktime() //得到进程阻塞状态{return blockTime;}void Process::setBlocktime(int BT) //设置进程阻塞时间{blockTime=BT;}void Process::setUnittime(int UT) //设置进程的单位执行时间{unitTime=UT;}5void Process::setBlockstate(bool state) //设置进程阻塞状态{ISblocked=state;}bool Process::getBlockstate() //得到进程阻塞状态{return ISblocked;}char Process::getResult(int k) //得到程序的运行结果{return runText[k];}///////////////////////////////////////////////////////////////////////////////////////// SOURCE///////////////////////////////////////////////////////////////////////////////////////class Source //资源类{protected:int ID; //资源 IDbool state; //资源是否被占用状态int pro_ID; //使用资源的进程id Process *pro; //使用资源的进程指针int time; //进程使用资源的时间6public:Source(int); //资源类构造函数bool getState(); //得到资源被使用状态void setState(bool); //设置资源被使用状态void setTime(int); //设置进程使用资源的时间void setPro(Process *); //设置使用该资源的进程int getID(); //得到资源idint getPorID(); //得到使用资源的进程id void setProID(int); //设置使用资源的进程id void runned(); //资源被cpu调用};Source::Source(int id) //资源类构造函数{ID=id; //资源ID初值为idpro=NULL; //指针赋为空值state=true; //状态为被使用状态}void Source::setProID(int id) //设置使用资源的进程id{pro_ID=id;}void Source::setTime(int t) //设置进程使用资源的时间{time=t;}void Source::setState(bool s) //设置资源使用状态{7state=s;}bool Source::getState() //得到资源使用状态{return state;}void Source::setPro(Process *p) //设置使用该资源的进程{pro=p;}void Source::runned() //资源被CPU调用{if(time>0) //时间充足继续运行输出资源信息并使时间减一{cout<<"( Source :"<<ID<<")";time--;}if(time<=0) //时间用完{pro->setISusesource(false); //资源的使用状态为未使用int ip=pro->getIP(); //得到进程的IPpro->setIP(++ip); //设置到下一个ipSource::setState(true); //设置资源的使用状态为正在使用cout<<endl<<"The process "<<pro->getID()<<" relase the source!"<<endl;pro=NULL; //输出资源被释放指针值赋值为空值}8}//////////////////////////////////////////////////////////// ///////////////////////////// CPU////////////////////////////////////////////////////////////// /////////////////////////typedef struct Block //阻塞队列结构{Process *p_BlockProcess; //被阻塞的进程队列int index; //被阻塞的进程在就绪队列中的位置}Block;class CPU{protected:Process *p_Process; //进程队列Process **pp_Process; //进程就绪队列Block *blockQueue ; //进程阻塞队列Source *p_Source; //资源指针int numOfprocess; //进程数量int numOfblock; //被阻塞的进程数int PC; //程序计数器int allTime; //cpu运行的总时间public :CPU(int); //cpu构造函数void Run(); //cpu运行进程bool _IC(Process&); //虚拟IC,进行进程指令翻译void useSource(Process&); //进程申请资源9void blockProcess(Process&); //阻塞进程void releaseBlockPro(); //释放阻塞进程int getAlltime(); //得到进程运行的总时间void displayPro(); //显示进程的基本信息,id,指令,运行时间等void blockTimeADD(); //阻塞时间加1 };CPU::CPU(int num){p_Source=new Source(379857);//创建一个id号为379857的资源numOfprocess=num; //进程数numOfblock=0; //阻塞数allTime=0; //cpu运行的总时间初始化为0p_Process=new Process[numOfprocess];//进程队列申请空间pp_Process=new Process*[numOfprocess];//进程就绪队列申请空间blockQueue=new Block[numOfprocess]; //阻塞队列申请空间for(int i=0;i<numOfprocess;i++){pp_Process[i]=&p_Process[i]; //用二维数组存放进程指针数组头指针blockQueue->p_BlockProcess=NULL; //阻塞队列的阻塞进程赋值为空blockQueue->index=-1; //阻塞队列的索引值置为1 }}int CPU::getAlltime() //得到进程运行的总时间{return allTime;}10void CPU::displayPro() //显示进程的基本信息{for(int i=0;i<numOfprocess;i++)//循环输出被执行的进程的信息{cout<<"\tProcess ID : "<<p_Process[i].getID()<<endl;cout<<" text of runned :"<<p_Process[i].getRuntext()<<endl;}}void CPU::Run() //cpu运行进程{int numPro=numOfprocess; //记录未被运行的进程个数do{for(int num=0;num < numOfprocess;num++){if(!pp_Process[num]) //就绪队列不空继续执行continue;for(int t=0;t<p_Process[num].getUnittime();t++){PC=p_Process[num].getIP();//得到进程Ipif(_IC(p_Process[num]))//判断进程的状态TURE进入{if(t==0) //时间为0运行完输出进程信息cout<<"the process ["<<p_Process[num].getID()<<"] runed : ";if(!p_Process[num].getISusesource())//如果该进程未被运行过,则调用run运行{p_Process[num].Runed();//}else{p_Source->runned(); //if( p_Source->getState() && numOfblock>0 ){releaseBlockPro();////如果进程运行过,现在但未运行,说明为阻塞。
《操作系统》上机实验报告—进程调度
专业和班级
成绩
姓名
学号
课程名称
操作系统
实验名称
进程调度
实
验
目
的
和
要
求
1.进程调度是处理机管理的核心内容。
2.本实验要求用C语言编写和调试一个简单的进程调度程序。
3.通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。
理
论
pcb *p;
pcb *r;
p=get_process();
int cpu=0;
r=p;
while(!process_finish(p)){
cpu+=2;
cpu_round(r);
r=get_next(r,p);
cout<<"运行次数"<<cpu<<endl;
display_round(p);
set_state(p);
if(q->process!=finish)
{t=q;
i=q->priority;
}
q=q->next;
}
t->needtime-=1;
t->priority-=3;
if(t->needtime==0)
t->process=finish;
t->cputime+=1;
}
void priority_cal() //优先级调度算法
if(t==NULL)
{
t=head;
while (t->next!=k && t->process==finish)
进程调度 实验报告
一、实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那
个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度 问题,加深对进程调度的理解。 二、实验内容 1.优先权法、轮转法
简化假设 1)进程为计算型的(无 I/O) 2)进程状态:ready、running、finish 3)进程需要的 CPU 时间以时间片为单位确定 2.算法描述 1) 优先权法——动态优先权
/*******************优先权调度算法所需函数 *****************************************************/ struct process1*creatlist1(int n) {
srand((int)time(0)); struct process1 *first =new process1; first ->next=NULL; for (int i=0;i<n;i++) {
struct process1 *s; s =new process1; s->pcb =i; s-> privilege=random(20)+5; s->cpu=random(20)+1; insert1(first,s ); } return first; } void insert1(struct process1 *first,struct process1 *s) //插入节点 { struct process1 *p=search(first,s); s->next=p->next; p->next=s; //return; }
操作系统实验之进程调度报告
实验一:进程调度一、实习内容1.模拟批处理多道操作系统的进程调度;2.模拟实现同步机构避免并发进程执行时可能与时间相关的错误;二、实习目的进程调度时进程管理的主要内容之一,通过设计,编制,调试一个简单的进程调度模拟系统,对进程调度,进程运行状态变换及PV操作加深理解和掌握。
三、实习题目采用剥夺式优先算法,对三个进程进行模拟调度模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。
【提示】(1)对三个进程进行模拟调度,对各进程的优先数静态设置,P1,P2,P3三个进程的优先数为1,2,3,并指定P1的优先数最高,P3的优先数最低,每个进程都处于执行态“e”,就绪态“r”,等待态“w”三种状态之一,并假定初始态为“r”。
(2)每一个进程用一个PCB表,PCB表的内容根据具体情况设置,该系统在运行过程中能显示或打印各进程和参数的变化情况,以便观察各进程的调度。
(3)在完成必要的初始化后,便进入进程调度程序,首先由P1进入执行,当执行进程因等待某各事件被阻塞或唤醒某个进程等待进程时,转进程调度。
(4)在进入临界区前后,调PV操作。
(5)如果被唤醒的进程优先数高于现有执行的进程,则剥夺现行进程的执行权。
(6)当三个进程都处于等待状态时,本模拟系统退出执行。
四、示例1.数据结构:(1)进程控制块PCBstruct{int id;char status;int priority;int waiter1;}(2)信号量struct{int value;int waiter2;}sem[2](3)现场保护栈stackchar stack[11][4]每个进程都有一个大小为10个字的现场保护栈,用来保护被中断时的断点地址等信息。
(4)全局变量int i;用以模拟一个通用寄存器char addr;用以模拟程序计数器int m1,m2;为系统设置的公用数据被三个进程共享使用。
五、程序框图:六、程序说明:本程序是用C语言编写,模拟三个进程的运行情况,过程在运行中要调用P操作申请信号量,如果该过程得到其申请的信号量,就继续运行,否则P操作阻塞该申请过程的运行,并将过程置为所申请信号量的等待者,如果已有其它过程在等待同一信号量则将该申请过程排在所有等待进程之后。
操作系统实验报告
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
设计程序摹拟进程的轮转法调度过程。
假设初始状态为:有n 个进程处于就绪状态,有m 个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下:1) .输出系统中进程的调度次序;2) .计算CPU 利用率。
硬件环境:Ghost XP SP3 纯净版Y6.0 Pentium(R) Dual-Core CPU E6700 @3.20GHz 3.19 GHz, 1.96 GB 的内存物理地址扩展软件环境:Microsoft Windows XP , Visual Studio 2022#include <iostream>#include <algorithm>#include <queue>using namespace std;const int MaxNum = 100;struct Node{int index;int arriveTime;int rest;};bool NodeCmp(const Node& a,const Node& b){return a.arriveTime < b.arriveTime;}int n; //进程数int ArrivalTime[MaxNum];int ServiceTime[MaxNum];int PServiceTime[MaxNum];int FinishTime[MaxNum];int WholeTime[MaxNum];double WeightWholeTime[MaxNum];bool Finished[MaxNum];double AverageWT,AverageWWT;bool isEnterQue[MaxNum];int cntTimes[MaxNum];void init(){memset(PServiceTime,0,sizeof(PServiceTime));memset(Finished,0,sizeof(Finished));memset(FinishTime,0,sizeof(FinishTime));memset(WholeTime,0,sizeof(WholeTime));memset(WeightWholeTime,0,sizeof(WeightWholeTime)); }int sum(int array[],int n){int sum=0;int i;for(i=0;i<n;i++){sum += array[i];}return sum;}double sum(double array[],int n){double sum=0;int i;for(i=0;i<n;i++){sum += array[i];}return sum;}void print(){int i=0;cout<<"进程完成时间:";for(i=0;i<n;i++){cout<<FinishTime[i]<<' ' ;}cout<<endl;cout<<"周转时间:";for(i=0;i<n;i++){cout<<WholeTime[i]<<' ';}cout<<endl;cout<<"带权周转时间:";for(i=0;i<n;i++){printf("%.2f ",WeightWholeTime[i]);}cout<<endl;}void SearchToEnterQue(queue<Node>& que,Node* pArr,int maxArrivalTime) {int i;for(i=0;i<n;i++){if(pArr[i].arriveTime>maxArrivalTime)break ;if(isEnterQue[pArr[i].index]==false){que.push(pArr[i]);isEnterQue[pArr[i].index] = true;}}}void Work(int q){init();memset(isEnterQue,0,sizeof(isEnterQue));memset(cntTimes,0,sizeof(cntTimes));Node* pNodeArr = new Node[n];int i;for(i=0;i<n;i++){pNodeArr[i].index = i;pNodeArr[i].arriveTime = ArrivalTime[i];pNodeArr[i].rest = ServiceTime[i];}sort(pNodeArr,pNodeArr+n,NodeCmp);int totalTime = sum(ServiceTime,n);int time=pNodeArr[0].arriveTime;queue<Node> que;que.push(pNodeArr[0]);isEnterQue[pNodeArr[0].index]=true;Node cur;cout<<"================================================="<<endl;while(!que.empty()) {cur = que.front();que.pop();cntTimes[cur.index]++;if(cntTimes[cur.index]==1)printf("在%d时刻,进程%d开始执行。
(完整word版)操作系统-进程调度算法设计与实现实验报告
实验报告课程名称操作系统实验名称进程调度算法设计与实现姓名学号专业班级实验日期成绩指导教师(①实验目的②实验设备和环境③实验内容与步骤④实验结果与分析⑤总结,问题及建议)一、内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程二、要求:①进程数不少于5个;②进程调度算法任选;最好选用动态优先数法,每运行一个时间片优先数减3③用C++(或C)语言编程;④程序运行时显示进程调度过程。
三、步骤:①设计PCB及其数据结构:进程标识数:ID进程优先数:PRIORITY(优先数越大,优先级越高)进程已占用时间片:CPUTIME进程尚需时间片:ALLTIME(一旦运行完毕,ALLTIME为0)进程队列指针:NEXT,用来将PCB排成队列进程状态:STATE(一般为就绪,不用)②设计进程就绪队列及数据结构;③设计进程调度算法,并画出程序流程图;④设计输入数据和输出格式;结构格式:当前正运行的进程:0当前就绪队列:2,1,3,4⑤编程上机,验证结果。
四、分析假设调度前,系统中有5个进程,其初始状态如下:①以时间片为单位调度运行;②每次总是从ALLTIME中不为0,且PRIORITY最大的进程调度运行一个时间片;③上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③④直到所有进程的ALLTIME均变为0。
五、代码#include〈iostream〉#include〈string〉#include<queue〉using namespace std;typedef struct pcb {string pName;//进程名int priorityNumber;//优先数float serviceTime;//服务时间float estimatedRunningtime;//估计运行时间char state;//状态bool operator〈(const struct pcb &a)const {return priorityNumber > a。
华师操作系统实验一——进程调度的设计与实现实验报告
华师操作系统实验一——进程调度的设计与实现实验报告实验名称:华师操作系统实验一,进程调度的设计与实现一、实验目的1.了解进程调度的概念和作用;2.熟悉进程调度算法的原理和实现方式;3.掌握进程调度的设计与实现方法。
二、实验要求1.设计并实现一个简单的进程调度器;2.使用给定的进程列表作为参考;3.实现多个进程调度算法;4.在给定的时间片内完成所有进程的调度。
三、实验原理进程调度是操作系统中一个重要的功能,它负责按照一定的算法和策略将系统资源分配给各个进程,实现进程的合理调度和运行。
不同的进程调度算法有不同的优缺点。
常见的进程调度算法包括:先来先服务调度算法(FCFS)、短作业优先调度算法(SJF)、高响应比优先调度算法(HRRN)、时间片轮转调度算法(RR)等。
在本次实验中,我们需要设计实现一个简单的进程调度器,要求支持多个进程调度算法,并能够在给定的时间片内完成所有进程的调度。
四、实验步骤1.初始进程列表:根据实验要求,获取给定的进程列表,包括进程名称、到达时间、服务时间等信息;2.进程调度算法设计:根据实验要求,选择并设计多个进程调度算法;3.进程调度器设计:根据选定的进程调度算法,设计进程调度器的数据结构和实现方式;4.进程调度器实现:根据前述设计,实现进程调度器的主要功能,包括创建调度器、添加进程、运行调度算法、输出调度结果等;5.测试与优化:使用给定的进程列表对进程调度器进行测试,并根据测试结果进行优化。
五、实验结果及分析根据实验要求,我们设计并实现了一个简单的进程调度器,并支持了多个进程调度算法。
在测试中,我们发现不同的调度算法对于不同的进程列表有不同的影响。
先来先服务调度算法(FCFS)适合服务时间较短的进程列表,能够保证所有进程按照到达顺序依次执行,但可能会导致服务时间较长的进程等待时间过长。
短作业优先调度算法(SJF)适合服务时间较长的进程列表,能够尽可能地减少平均等待时间,但可能会导致服务时间较短的进程等待时间过长。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机学院实验课程:操作系统实验实验项目:进程调度的设计与实现指导老师:***开课时间:2012~2013年度第2学期专业:网络工程班级:11本6班学生:卢伟柱学号:***********华南师范大学教务处专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分一、实验目的1.综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布尔数组,非阻塞输入,图形用户界面GUI ,进程控制块,进程状态转换,多级反馈队列进程调度算法。
2.加深理解操作系统进程调度的过程。
3.加深理解多级反馈队列进程调度算法。
二、实验内容与主要设计思想1.采用一种熟悉的语言,如C、PASCAL或C++等,编制程序,最好关键代码采用C/C++ ,界面设计可采用其它自己喜欢的语言。
2.采用多级反馈队列调度算法进行进程调度。
3.每个进程对应一个PCB。
在 PCB 中包括进程标识符pid、进程的状态标识status、进程优先级priority、进程的队列指针 next 和表示进程生命周期的数据项life (在实际系统中不包括该项)。
4.创建进程时即创建一个PCB ,各个进程的pid 都是唯一的,pid 是在1到100 范围内的一个整数。
可以创建一个下标为1 到100 的布尔数组,“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。
5.进程状态status 的取值为“就绪ready”或“运行run ”,刚创建时,状态为“ready”。
被进程调度程序选中后变为“run ”。
6.进程优先级priority 是0 到49范围内的一个随机整数。
7.进程生命周期life 是1 到5 范围内的一个随机整数。
8.初始化时,创建一个邻接表,包含50个就绪队列,各就绪队列的进程优先级priority 分别是0 到49。
9.为了模拟用户动态提交任务的过程,要求动态创建进程。
进入进程调度循环后,每次按ctrl+f即动态创建一个进程,然后将该 PCB 插入就绪专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分队列中。
按ctrl+q退出进程调度循环。
10.在进程调度循环中,每次选择优先级最大的就绪进程来执行。
将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。
设计图形用户界面GUI ,在窗口中显示该进程和其他所有进程的PCB 内容。
如果将该运行进程的生命周期不为0 ,则重新把它变为就绪状态,插入就绪队列中;否则该进程执行完成,撤消其PCB 。
以上为一次进程调度循环。
三、d程序的主要流程图专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分四、实验心得1.通过计数器KillTimer()、ONTIMER()以及在计数器中对函数run()设计并在ONTIMER()中对run函数调用从而完成多级反馈队列运行的模拟。
2.使用MFC设计界面,可以通过按钮和快捷键进成相关的操作,还充分利用了模板进行简化设计邻接表。
3.实验中最重要的是在自己无法解决问题的时候,向同学、老师等请教以及利用好网络资源。
4.在设计的时候,要尽可能考虑到用户的一切可能的操作,提高程序的用户友好性。
五、主要源程序清单主要程序MyScheuleDlg.cpp的代码:// MyScheduleDlg.cpp : implementation file//#include "stdafx.h"#include "MySchedule.h"#include "MyScheduleDlg.h"#include <string.h>#include <iostream>#include <queue>#include "PCB.h"using namespace std;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILE专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分static char THIS_FILE[] = __FILE__;#endifbool flag[100];queue<PCB> q[50];/////////////////////////////////////////////////////////////////// //////////// CMyScheduleDlg dialogCMyScheduleDlg::CMyScheduleDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyScheduleDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyScheduleDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMyScheduleDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyScheduleDlg)专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分DDX_Control(pDX, IDC_LIST1, m_LIST);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyScheduleDlg, CDialog)//{{AFX_MSG_MAP(CMyScheduleDlg)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CMyScheduleDlg message handlersBOOL CMyScheduleDlg::OnInitDialog(){CDialog::OnInitDialog();// Set the icon for this dialog. The framework does this automatically专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_LIST.DeleteAllItems();while(m_LIST.DeleteColumn(0));// 清空Control List内容m_LIST.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 添加网格m_LIST.SetTextColor(RGB(255,0,255)); // 设置字体颜色//m_LIST.InsertColumn(0,"",LVCFMT_LEFT,0); // 第0列用来定位// 插入列,50个优先级列for(int i=0;i<50;i++){CString s;s.Format("%d",i);s="优先级"+s;m_LIST.InsertColumn(i,s,LVCFMT_LEFT,185);}for(i=0;i<100;i++)m_LIST.InsertItem(i,"");for(i=1;i<=100;i++)flag[i]=false;for(i=0;i<50;i++)addPCB();return TRUE; // return TRUE unless you set the focus to a control专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CMyScheduleDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icon专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CMyScheduleDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyScheduleDlg::OnButton1() //创建线程{// TODO: Add your control notification handler code hereKillTimer(1);addPCB();UpdateWindow();OnButton2();}专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分void CMyScheduleDlg::OnButton2()//调度开始{// TODO: Add your control notification handler code hereSetTimer(1,1000,NULL);//设置定时器}void CMyScheduleDlg::OnButton3(){// TODO: Add your control notification handler code hereKillTimer(1);//移除定时器}void CMyScheduleDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default run();CDialog::OnTimer(nIDEvent);}void CMyScheduleDlg::run()//模拟进程执行{PCB pcb;CString s1,s2,s3,s4;for(int i=49;i>=0;i--)//检测各个队列是否为空{专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分if(!q[i].empty())break;}if(i!=-1){pcb=q[i].front();q[i].pop();s1.Format("%d",pcb.getpid());s2.Format("%d",pcb.getlife());pcb.setstatus("run");s3="pid:"+s1+" status:"+pcb.getstatus()+" life:"+s2;m_LIST.SetTextColor(RGB(0,255,0)); // 设置字体颜色m_LIST.SetItemText(0,pcb.getpriority(),s3);UpdateWindow();Sleep(1000);// 停顿一段时间m_LIST.SetTextColor(RGB(255,0,0)); // 设置字体颜色for(int j=0;j<=q[i].size();j++){s4=m_LIST.GetItemText(j+1,pcb.getpriority());m_LIST.SetItemText(j,pcb.getpriority(),s4);}m_LIST.SetItemText(j,pcb.getpriority(),"");UpdateWindow();pcb.setpriority(pcb.getpriority()/2);专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分pcb.setlife(pcb.getlife()-1);if(pcb.getlife()!=0){s1.Format("%d",pcb.getpid());s2.Format("%d",pcb.getlife());pcb.setstatus("ready");s3="pid:"+s1+" status:"+pcb.getstatus()+" life:"+s2;q[pcb.getpriority()].push(pcb);m_LIST.SetItemText(q[pcb.getpriority()].size()-1,pcb.getpriority( ),s3);}else{flag[pcb.getpid()]=false;}}else{KillTimer(1);AfxMessageBox("进程调度完毕!");}}void CMyScheduleDlg::addPCB()//添加PCB专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分{PCB pcb;CString s1,s2,s3,s4;while(true){pcb.setpid(rand()%100+1);if(!flag[pcb.getpid()]){flag[pcb.getpid()]=true;break;}}pcb.setstatus("ready");pcb.setpriority(rand()%49);pcb.setlife(rand()%5+1);s1.Format("%d",pcb.getpid());s2.Format("%d",pcb.getlife());s3="pid:"+s1+" status:"+pcb.getstatus()+" life:"+s2;q[pcb.getpriority()].push(pcb);m_LIST.SetItemText(q[pcb.getpriority()].size()-1,pcb.getpriority( ),s3);}BOOL CMyScheduleDlg::PreTranslateMessage(MSG* pMsg) //设置快捷键{专业网络工程年级、班级11级6班课程名称操作系统实验实验项目进程调度的设计与实现实验类型 验证 设计 综合实验时间2013 年 5 月27 日实验指导老师冯刚实验评分// TODO: Add your specialized code here and/or call the base class UINT nKeyCode =pMsg->wParam;if(pMsg->message==WM_KEYDOWN){if(nKeyCode==_T('F')&&(::GetKeyState(VK_CONTROL)&0x8000)) OnButton1();else{if(nKeyCode==_T('S')&&(::GetKeyState(VK_CONTROL)&0x8000)) OnButton2();else{if(nKeyCode==_T('Q')&&(::GetKeyState(VK_CONTROL)&0x8000))OnButton3();}}}return CDialog::PreTranslateMessage(pMsg);}。