logo资料库

用时间片轮转法调度虚拟进程.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
一、课设目的
二、课设任务
三、实验方法与设计分析
四、程序流程图
五、程序源代码
六、运行结果
七、问题及解决方法
八、心得体会
《操作系统课程设计》报告 学 号: 姓 名: 班 级: 指导教师: 报告日期:
一、课设目的 通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通 过实践深入理解进程的调度算法。 二、课设任务 要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度 策略为时间片轮转法,主要任务包括:  进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另 外调度运行结果输出到一个运行日志文件;  设计 PCB 适用于时间片轮转法;  建立进程队列;  实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。 ○5 总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。 三、实验方法与设计分析 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、 优先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到 达时间为输入进程的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行 R(Run)、或完成 F(Finish)三种状态 之一。 就绪进程获得 CPU 后都只能运行一个时间片。用已占用 CPU 时间加 1 来表示。 如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程, 如果运行一个时间片后进程的已占用 CPU 时间还未达所需要的运行时间,也就是进程还需 要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列等待 CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检 查。 重复以上过程,直到所要进程都完成为止
四、程序流程图 开始 设置时间片 增加进程 选择 是 继续增加 PCB 顺序 结束进程 调度进程 PCB 顺序 打印进程 结束 循环 五、程序源代码 #include "stdafx.h" #include #include #include #include #include #include using namespace std; ofstream myfile("bb.txt",ios::app||ios::trunc); typedef struct node { char name[10];/*进程名*/ int round; /*进程分配的时间片*/
int cputime; /*进程消耗的CUP时间*/ int needtime; /*进程需要的CUP时间*/ int count; /*进程运行时间*/ char state; /*进程的状态:'R':运行,'W':等待,'F':结束*/ struct node *next;/*指向下一个进程的指针*/ }PCB; PCB *finish,*ready,*tail,*run;/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/ int N;/*定义进程的数目*/ void firstin(void) { if(ready!=NULL) { run=ready; ready=ready->next; run->state='R'; run->next=NULL; } else run=NULL; { } } void prt1(char a) cout<<"name" <<" cputime" <<" needtime"<<" count "<<" round"<<" state"<name<<" "<cputime<<" "<needtime<<" "<count<<" "<round<<" "<state<name<<" ";myfile<cputime<<" ";myfile<needtime<<" "; myfile<count<<" ";myfile<round<<" "; myfile<state<
} p=ready; while(p!=NULL) { } prt2(algo,p); p=p->next; p=finish; while(p!=NULL) { prt2(algo,p); p=p->next; } getchar(); } void insert(PCB *q) { } tail->next=q; tail=q; q->next=NULL; void rcreate_task(char algo) { PCB *p; int n,time; char na[10]; ready=NULL; finish=NULL; run=NULL; cout<<"请输入进程数目N:"; cin>>N; for(n=0;n>na; cout<<"Enter the time of process:"<>time; strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0; p->state='W'; p->round=2;
if(ready!=NULL) { insert(p); } else { p->next=ready; ready=p; tail=p; } } run=ready; ready=ready->next; run->state='R'; cout<<"创建成功。"<count==run->round) { run->count=0; if(ready!=NULL) { run->state='W'; insert(run); firstin(); } } prt(algo); void roundrun(char algo) { while(run!=NULL) { run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->count=run->count+1; if(run->needtime==0) { run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL)
firstin(); { } } else { if(run->count==run->round) { run->count=0; if(ready!=NULL) run->state='W'; insert(run); firstin(); { } } } prt(algo); } } void caidan() { } cout<<"**************************主页************************"<>algo; if(algo=='i'||algo=='I') rcreate_task(algo); { } else if(algo=='c'||algo=='C') { } chakan(algo); else if(algo=='o'||algo=='O') { } roundrun(algo);
else if(algo=='h'||algo=='H') { } goto loop2; goto loop1; myfile.close(); return 0; loop2: } 六、运行结果
分享到:
收藏