时间片轮转课设报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return 0; } void SRdl()//输入进程信息 { int processnum; PCB *p,*q; printf("\n ********** 操作系统课程设计 **********"); printf("\n"); printf("请输入进程个数:"); scanf("%d",&processnum); Readydl->count=processnum; p=(PCB *)malloc(sizeof(PCB)); memset(p,0, sizeof(PCB));//将p中所有数据清零 Readydl->headzz=p; Readydl->endzz=p; while(processnum>0) { printf("请输入第%d个进程信息:\n",Readydl->count-processnum+1); printf("进程名:"); scanf("%d",&p->processID); printf("到达时间:"); scanf("%d",&p->ddtime); printf("服务时间:"); scanf("%d",&p->yqtime); p->wctime=0; p->next=NULL; p->yxtime=0; p->state=' '; p->zztime=0;//周转时间 p->w_zztime=0; Readydl->endzz=p; q=p; p=(PCB *)malloc(sizeof PCB); q->next=p; processnum--; printf("\n");
} void RdlCZ(PCB *p,Dlzz *L) { if(!p) return; if(PDdl(L)) { L->headzz=L->endzz=p; } else { L->endzz->next=p; L->endzz=p; } L->count++; } void XSdl(Dlzz *L)//显示队列内容 { PCB *tem; tem=L->headzz; printf("进程ID 到达时刻 服务时间 已运行时间 完成时刻 状态 周 转时间 带权周转时间\n"); while(tem!=NULL) { printf(" %d\t %d\t %d\t\t %d\t %d %c %d %.2f\n", tem->processID,tem->ddtime,tem->yqtime,tem->yxtime,tem>wctime,tem->state,tem->zztime,tem->w_zztime); tem=tem->next; } } void JCdltime(Dlzz *L,int time)//检查到达时间是否为当前系统时间,如果 为当前系统时间则将该进程置于运行队列中 { PCB *tem,*tem1; tem=L->headzz; while(tem!=NULL&&tem->ddtime==time) {
1.3 课程设计内容
设计并实现一个采用时间片轮转算法的进程调度演示程序
1.4 时间安排
1)分析设计贮备阶段 (1 天) 2)编程调试阶段 (7 天) 3)写课程设计报告、考核(2 天)
第2部分 实验原理分析
2.1问题描述
设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别 在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别 利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度, 计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进 程的平均周转时间和平均带权周转时间。 程序要求如下: 1. 每一个进程有一个 PCB,其内容可以根据具体情况设定。 2. 进程数、进入内存时间、要求服务时间、优先级等均可以在界面上 设定 3. 可读取样例数据(要求存放在外部文件中)进行进程数、进入内存 时间、时间片长度、进程优先级的初始化 4. 可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互
斥资源与进程间的 同步关系,故只有两种状态) 5. 采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进 程的状态以及相应的 阻塞队列 6. 有性能比较功能,可比较同一组数据在不同调度算法下的平均周转 时间 7. 具有一定的数据容错性
2.2问题分析
(1).基本原理
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务 的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执 行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完 时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进 程的执行,并将它送往就绪队列的队尾;然后,再把处理机分配给就绪 队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就 绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行 时间。换言之,系统能在给定的时间内响应所有用户的请求。
第1部分 课设简介
1.1 课程设计题目
采用时间片轮转算法的进程调度程序
1.2 课程设计目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了
一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立 分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计 的能力。
(2).时间片大小的确定
在时间片轮转算法中,时间片的大小对系统性能有很大的影响, 如选择很小的时间片将有利于短作业,因为它能较快的完成,但会频繁 地发生中断、进程上下文的切换,从而增加系统的开销;反之,如选择 太长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算 法便退化为FCFS算法,无法满足交互式用户的请求。一个较为可取 的大小是,时间片略大于一次典型的交互所需要的时间。这样可使大多 数进程在一个时间片内完成。 下图示出了时间片分别为q=1和q=4时,A、B、C、D、 E五个进程的运行情况,以及各进程的平均周转时间和带权平均周转时 间。 作业 情 况 时 间 进程 名 到达 时间 A 0 B 1 C 2 D 3 E 4 平均
第3部分 主要的功能模块
3.1数据结构
主要的数据结构及模块有: typedef struct PCB //结构体 { int processID; //进程名 char state; //状态 int ddtime; //到达时刻
int yqtime; //要求服务时间 int yxtime; //已运行时间 int wctime; //结束运行时刻 int zztime; //周转时间 float w_zztime;//带权周转时间 struct PCB *next; }PCB;
3.3 测试用例及运行结果
所选择的数据如下表: 进程名 1 到达时间 0 服务时间 4
2 3 4 5 运行结果部分截图如下图所示:
1 2 3 4
3 5 2 4
第4部分 源代码
#include <stdio.h> #include<malloc.h> #include<string.h> #include<windows.h> typedef struct PCB //结构体 { int processID; //进程名 char state; //状态 int ddtime; //到达时刻 int yqtime; //要求服务时间 int yxtime; //已运行时间 int wctime; //结束运行时刻 int zztime; //周转时间 float w_zztime;//带权周转时间 struct PCB *next; }PCB; typedef struct { PCB *headzz; //队头指针 PCB *endzz; //队尾指针 int count; //队列结点个数 }Dlzz; Dlzz *Readydl=(Dlzz *)malloc(sizeof(Dlzz)); //就绪队列 Dlzz *Rundl=(Dlzz *)malloc(sizeof(Dlzz)); //运行队列 Dlzz *Finishdl=(Dlzz *)malloc(sizeof(Dlzz));//完成队列 int PDdl(Dlzz *L)//判断队列是否为空 { if(L->headzz==NULL&&L->endzz==NULL) return 1; else
3.2主要的函数
void RR( ) //时间轮转调度算法 { int tem=0; int time=0; int timepice; system("cls"); printf("请输入时间片大小:"); scanf("%d",&timepice); tem=timepice;//tem每执行一次减一 while(!(PDdl(Readydl)&&PDdl(Rundl))) { JCdltime(Readydl,time); time++; if(PDdl(Rundl)!=1) { if((Rundl->headzz!=NULL)&&(Rundl->headzz>yxtime!=Rundl->headzz->yqtime))//判断进程没有运行完的操作 { if(tem==0)//判断时间片用完之后的操作 { JCdltime(Readydl,time+1); Rundl->headzz->state='W'; Rundl->endzz->next=Rundl->headzz; Rundl->endzz=Rundl->headzz; Rundl->headzz=Rundl->headzz->next; Rundl->endzz->next=NULL; tem=timepice;
片
服务 时间 完成 时间
4 12 12 3 4 4 1
Hale Waihona Puke Baidu
3 10 9 3 7 6 2
5 18 16 3.2 12 10 2
2 11 8 4 14 11 5.5
4 17 13 3.25 18 14 3.5 9 2.8 11.6 3.29
RR q=1
周转 时间 带权 周转 时间 完成 时间
RR q=4
周转 时间 带权 周转 时间
} //时间没有用完的操作 tem--; Rundl->headzz->yxtime++; Rundl->headzz->state='R'; if((Rundl->headzz!=NULL)&&(Rundl->headzz>yxtime==Rundl->headzz->yqtime))//判读进程执行完之后的操作 { printf("进程%d已经执行完毕!\n",Rundl>headzz->processID); Rundl->headzz->state='F'; Rundl->headzz->wctime=time; Rundl->headzz->zztime=Rundl->headzz>wctime-Rundl->headzz->ddtime; Rundl->headzz->w_zztime=((float)(Rundl>headzz->zztime))/Rundl->headzz->yqtime; tem=tem+timepice; RdlCZ(Rundl->headzz,Finishdl); CdlCZ(Rundl->headzz,Rundl); } } } JCdltime(Readydl,time+1); } system("cls"); XSdl(Finishdl); printf("\n"); JStime(Finishdl); }
} Readydl->endzz->next=NULL; } void CdlCZ(PCB *p,Dlzz *L)//删除p元素 { PCB *q; q=L->headzz; if(PDdl(L)) return; if(L->endzz==L->headzz) { L->endzz=NULL; L->headzz=NULL; L->count--; return; } if(p==L->headzz) { L->headzz=p->next; p->next=NULL; L->count--; return; } while(q->next!=NULL) { if(q->next==p) { q->next=p->next; if(p==L->endzz) L->endzz=q; L->count--; break; } q=q->next; }
采用时间片轮转算法的进程调度程序
姓 学 学
名: 号: 院:
指导老师:
日期:2014年3月18日
目 录 第1部分 课设简介 2 1.1 课程设计题目 2 1.2 课程设计目的 2 1.3 课程设计内容 3 1.4 时间安排 3 第2部分 实验原理分析 3 2.1问题描述 3 2.2问题分析 3 第3部分 主要的功能模块 4 3.2主要的函数 5 3.3 测试用例及运行结果 6 第4部分 源代码 9 第5部分 总结及参考文献 16 5.1 总结 16 5.2 参考文献 16