计算机操作系统实验
报告
院系:公共管理学院
班级:信息管理与信息系统一班
姓名:周晨妍
学号:
指导老师:匡林爱
日期:2015年11月19日
一、课程设计目的
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
二、先来先服务调度算法
1、算法原理
设计程序模拟进程的先来先服务FCFS过程。假设有n个进程分别在T1, „ ,Tn
时刻到达系统,它们需要的服务时间分别为S1, „ ,Sn。分别采用先来先服务FCFS调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, „ ,Tn和服务时间S1, „ ,Sn。 2)要求采用先来先服务FCFS调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间; 3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
2、实验提示
用C语言实现提示:
1)程序中进程调度时间变量描述如下: static int MaxNum=100; int ArrivalTime[MaxNum]; int ServiceTime[MaxNum]; int FinishTime[MaxNum]; int WholeTime[MaxNum];
double WeightWholeTime[MaxNum]; double AverageWT_FCFS; double AverageWWT_FCFS;
2)进程调度的实现过程如下: 变量初始化;
接收用户输入n,T1, „ ,Tn,S1, „ ,Sn;
按照选择算法进行进程调度,计算进程的完成时间、周转时间和带权周
转时间;
计算所有进程的平均周转时间和平均带权周转时间; 按格式输出调度结果。
3、程序流程图
4、作业时间表
平均带权周转时间 W=(1+2.23+26+1.08)/4ms=7.5775ms
5、程序源代码
#include
typedef struct PCB //定义进程控制块 { char name[10]; //进程名 char state; //运行状态
int ArriveTime; //到达时间 int StartTime; //进程开始时间 int FinishTime; //进程结束时间 int ServiceTime; //服务时间 float WholeTime;//周转时间
float WeightWholeTime;//带权周转时间 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(
p1->FinishTime=time;
p1->WholeTime=p1->FinishTime-p1->ArriveTime;
p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime; x+=p1->WholeTime; y+=p1->WeightWholeTime;
printf(
printf(
p1->ServiceTime,p1->FinishTime,p1->WholeTime,p1->WeightWholeTime);
}
void FCFS() //找到当前未完成的进程 {
int i; p=head;
for(i=0;i
if(p->state=='F') {
q=p; //标记当前未完成的进程 run_FCFS(q); }
p=p->next; } }
void getInfo() //获得进程信息并创建进程 {
int num;
printf(
for(num=0;num
p->next=NULL; p->state='F'; q=p; } }
void main()
{ printf(
6、运行结果
三、短作业优先调度算法
1、实验提示
用C语言实现提示:
程序中进程调度时间变量描述如下: char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime; //开始时间 float finishtime; //完成时间 float zztime; //周转时间
float dqzztime; //带权周转时间
2、程序流程图
总体流程图
详细流程图
3、作业时间表
平均带权周转时间 W=(1+13+2.31+1.08)/4ms=4.3475ms
4、程序源代码
#include
struct sjf //定义进程的结构体 {
char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime; //开始时间 float finishtime; //完成时间 float zztime; //周转时间
float dqzztime; //带权周转时间 };
sjf b[100]; //定义短作业优先算法进程的最大数量
void Sinput(sjf *p,int N) //输入函数 {
int i;
printf(
void SPrint(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) //输出函数 {
int k;
printf(
printf(
printf(
void Ssort(sjf *p,int N) //按短作业优先算法排序 {
for(int i=1;i
void Sdeal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) //运行结果 {
int k;
for(k=0;k
个进程的完成时间+现在进程的服务时间 } }
for(k=0;k
void SJF(sjf *p,int N) {
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; Ssort(p,N);
Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
SPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); }
void main() //主函数 {
int M;
printf(
5、运行结果
三、优先级调度算法
1、实验提示
进程控制块结构
char name[20]; //进程名称
int priority; //优先级数 int gettime; //到达时间 float dotime; //服务时间 int starttime; //开始时间 int finishtime; //完成时间 float turntime; //周转时间 float ptime; //带权周转时间
2、作业时间表
3、程序源代码
#include
#include
struct process //进程结构体 {
char name[20]; //进程名称 int priority; //优先级数 int gettime; //到达时间 float dotime; //服务时间 int starttime; //开始时间 int finishtime; //完成时间 float turntime; //周转时间 float ptime; //带权周转时间 };
int n; //进程的个数
float averageturntime,averageptime; //平均周转时间和平均加权周转时间
void GetInProcess(process *pp) //对进程数组进行初始化 {
cout
cout
cin>>pp[i].name; cin>>pp[i].priority; cin>>pp[i].gettime; cin>>pp[i].dotime; }
cout
cout
cout
cout
cout
void ProcessPriority(process *pp) //对此进程数组按优先级从小到大排序,级数越小优先级越高。 {
for(int i=0;i
int k=i;
for(int j=k+1;j
if(pp[i].priority>pp[j].priority) k=j; process t; t=pp[k]; pp[k]=pp[i]; pp[i]=t; } }
void PrintProcess(process *pp) //输出排序后的诸进程
{ float s1,s2,sum1=0,sum2=0; //sum1表示所有进程周转时间之和,sum2表示所有进程加权周转时间之和。
cout
cout
pp[0].starttime=pp[0].gettime;
pp[0].finishtime=pp[0].starttime+pp[0].dotime; pp[0].turntime=pp[0].finishtime-pp[0].gettime; pp[0].ptime=pp[0].turntime/pp[0].dotime; for(int i=1;i
pp[i].starttime=pp[i-1].finishtime;
pp[i].finishtime=pp[i].starttime+pp[i].dotime; pp[i].turntime=pp[i].finishtime-pp[i].gettime; pp[i].ptime=pp[i].turntime/pp[i].dotime; }
for(i=0;i
sum1=sum1+pp[i].turntime; sum2=sum2+pp[i].ptime; }
s1=sum1/n; s2=sum2/n; for(i=0;i
cout
cout
cout
cout
cout
int main() {
cout
cin>>n;
process a[100]; GetInProcess(a); ProcessPriority(a); PrintProcess(a); return 0; }
3、运行结果
计算机操作系统实验
报告
院系:公共管理学院
班级:信息管理与信息系统一班
姓名:周晨妍
学号:
指导老师:匡林爱
日期:2015年11月19日
一、课程设计目的
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
二、先来先服务调度算法
1、算法原理
设计程序模拟进程的先来先服务FCFS过程。假设有n个进程分别在T1, „ ,Tn
时刻到达系统,它们需要的服务时间分别为S1, „ ,Sn。分别采用先来先服务FCFS调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, „ ,Tn和服务时间S1, „ ,Sn。 2)要求采用先来先服务FCFS调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间; 3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
2、实验提示
用C语言实现提示:
1)程序中进程调度时间变量描述如下: static int MaxNum=100; int ArrivalTime[MaxNum]; int ServiceTime[MaxNum]; int FinishTime[MaxNum]; int WholeTime[MaxNum];
double WeightWholeTime[MaxNum]; double AverageWT_FCFS; double AverageWWT_FCFS;
2)进程调度的实现过程如下: 变量初始化;
接收用户输入n,T1, „ ,Tn,S1, „ ,Sn;
按照选择算法进行进程调度,计算进程的完成时间、周转时间和带权周
转时间;
计算所有进程的平均周转时间和平均带权周转时间; 按格式输出调度结果。
3、程序流程图
4、作业时间表
平均带权周转时间 W=(1+2.23+26+1.08)/4ms=7.5775ms
5、程序源代码
#include
typedef struct PCB //定义进程控制块 { char name[10]; //进程名 char state; //运行状态
int ArriveTime; //到达时间 int StartTime; //进程开始时间 int FinishTime; //进程结束时间 int ServiceTime; //服务时间 float WholeTime;//周转时间
float WeightWholeTime;//带权周转时间 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(
p1->FinishTime=time;
p1->WholeTime=p1->FinishTime-p1->ArriveTime;
p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime; x+=p1->WholeTime; y+=p1->WeightWholeTime;
printf(
printf(
p1->ServiceTime,p1->FinishTime,p1->WholeTime,p1->WeightWholeTime);
}
void FCFS() //找到当前未完成的进程 {
int i; p=head;
for(i=0;i
if(p->state=='F') {
q=p; //标记当前未完成的进程 run_FCFS(q); }
p=p->next; } }
void getInfo() //获得进程信息并创建进程 {
int num;
printf(
for(num=0;num
p->next=NULL; p->state='F'; q=p; } }
void main()
{ printf(
6、运行结果
三、短作业优先调度算法
1、实验提示
用C语言实现提示:
程序中进程调度时间变量描述如下: char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime; //开始时间 float finishtime; //完成时间 float zztime; //周转时间
float dqzztime; //带权周转时间
2、程序流程图
总体流程图
详细流程图
3、作业时间表
平均带权周转时间 W=(1+13+2.31+1.08)/4ms=4.3475ms
4、程序源代码
#include
struct sjf //定义进程的结构体 {
char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime; //开始时间 float finishtime; //完成时间 float zztime; //周转时间
float dqzztime; //带权周转时间 };
sjf b[100]; //定义短作业优先算法进程的最大数量
void Sinput(sjf *p,int N) //输入函数 {
int i;
printf(
void SPrint(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) //输出函数 {
int k;
printf(
printf(
printf(
void Ssort(sjf *p,int N) //按短作业优先算法排序 {
for(int i=1;i
void Sdeal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) //运行结果 {
int k;
for(k=0;k
个进程的完成时间+现在进程的服务时间 } }
for(k=0;k
void SJF(sjf *p,int N) {
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; Ssort(p,N);
Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
SPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); }
void main() //主函数 {
int M;
printf(
5、运行结果
三、优先级调度算法
1、实验提示
进程控制块结构
char name[20]; //进程名称
int priority; //优先级数 int gettime; //到达时间 float dotime; //服务时间 int starttime; //开始时间 int finishtime; //完成时间 float turntime; //周转时间 float ptime; //带权周转时间
2、作业时间表
3、程序源代码
#include
#include
struct process //进程结构体 {
char name[20]; //进程名称 int priority; //优先级数 int gettime; //到达时间 float dotime; //服务时间 int starttime; //开始时间 int finishtime; //完成时间 float turntime; //周转时间 float ptime; //带权周转时间 };
int n; //进程的个数
float averageturntime,averageptime; //平均周转时间和平均加权周转时间
void GetInProcess(process *pp) //对进程数组进行初始化 {
cout
cout
cin>>pp[i].name; cin>>pp[i].priority; cin>>pp[i].gettime; cin>>pp[i].dotime; }
cout
cout
cout
cout
cout
void ProcessPriority(process *pp) //对此进程数组按优先级从小到大排序,级数越小优先级越高。 {
for(int i=0;i
int k=i;
for(int j=k+1;j
if(pp[i].priority>pp[j].priority) k=j; process t; t=pp[k]; pp[k]=pp[i]; pp[i]=t; } }
void PrintProcess(process *pp) //输出排序后的诸进程
{ float s1,s2,sum1=0,sum2=0; //sum1表示所有进程周转时间之和,sum2表示所有进程加权周转时间之和。
cout
cout
pp[0].starttime=pp[0].gettime;
pp[0].finishtime=pp[0].starttime+pp[0].dotime; pp[0].turntime=pp[0].finishtime-pp[0].gettime; pp[0].ptime=pp[0].turntime/pp[0].dotime; for(int i=1;i
pp[i].starttime=pp[i-1].finishtime;
pp[i].finishtime=pp[i].starttime+pp[i].dotime; pp[i].turntime=pp[i].finishtime-pp[i].gettime; pp[i].ptime=pp[i].turntime/pp[i].dotime; }
for(i=0;i
sum1=sum1+pp[i].turntime; sum2=sum2+pp[i].ptime; }
s1=sum1/n; s2=sum2/n; for(i=0;i
cout
cout
cout
cout
cout
int main() {
cout
cin>>n;
process a[100]; GetInProcess(a); ProcessPriority(a); PrintProcess(a); return 0; }
3、运行结果