操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx

上传人:b****2 文档编号:1214199 上传时间:2023-04-30 格式:DOCX 页数:26 大小:244.01KB
下载 相关 举报
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第1页
第1页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第2页
第2页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第3页
第3页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第4页
第4页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第5页
第5页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第6页
第6页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第7页
第7页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第8页
第8页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第9页
第9页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第10页
第10页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第11页
第11页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第12页
第12页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第13页
第13页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第14页
第14页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第15页
第15页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第16页
第16页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第17页
第17页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第18页
第18页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第19页
第19页 / 共26页
操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx

《操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx(26页珍藏版)》请在冰点文库上搜索。

操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx

图1-2进程控制块

CpuModel类成员

Cpurun()

Cpu模拟运行函数

CreatePcb()

进程创建函数

ShowPcb()

进程显示函数

PriModel()

实现优先级调度算法

FcfsModel()

实现先来先服务算法

pcbnum

进程数量

freetime

Cpu空闲时间

allturn

总周转时间

allaver

总带权周转时间

PcbList[]

进程就绪队列的实现

图1-3CpuModel类

程序流程图

1.可强占优先调度算法实现过程流程图:

2先来先服务调度算法实现过程流图

3.数据结构设计

1.设计创建进程的结构类型定义和结构变量说明structProcessPcb,定义PCB相关变量:

ProcessPcb(){next=NULL;

}

charpro_name[20];

//进程的名字

inttime_submit;

//提交时间,从时间为1开始计时

inttime_exe;

//进程所需的运行时间

intpro_id;

//进程ID(系统生成)

intpro_priority;

//进程优先级

inttime_start;

//开始执行的时间

inttime_end;

//结束的时间

inttime_wait;

//等待的时间

intpro_state;

//进程的状态(就绪,执行,完成)

inttime_left;

//还需多少时间单位,初始化为所需的执行时间

inttime_turn;

//周转时间

doubletime_aver;

//带权周转时间

2.创建PCB类classCpuModel,定义程序中使用的各函数:

CpuModel{

CpuModel(){pcbnum=0;

voidcpurun();

//cpu模拟运行函数

boolGetPcb();

//进程输入函数

voidShowPcb();

//将输入的进程展示出来

voidPriModel();

//可强占的优先进程调度模式

voidFcfsModel();

//先到先服务调度模式

ProcessPcbPcbList[100];

//按提交时间排的未就绪进程队列()

4.测试结果及分析

1.开始运行,显示:

2.输入进程数,各进程属性:

关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。

3.显示已创建的各进程及其属性:

此处的优先级数,是用100减去执行时间。

对于优先级数相同,则默认FIFO。

4.测试可强占的优先进程调度:

一次调度完成,将计算此次运行中CPU的利用率。

5.先到先服务调度算法运行情况:

6.选择5,回车,退出程序。

五.设计心得

在学完操作系统课程之后,一直对进程调度这一块不是很理解,借着做课程设计的机会,我就选择了进程调度模拟编程这个题目,打算在做课程设计的过程中好好的再学习一下这块的知识。

我在做课程设计的过程中,遇到了许多的问题,通过请教同学,上网查资料等途径一一解决。

通过这次操作系统的课程设计,我研究了进程调度的相关知识,加深了对进程调度的理解。

课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。

总体来说我认为操作系统这门学科在计算机科学当中是非常重要的,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西,我想这也许就是课程设计的最终目的吧。

参考文献

[1]刘振安、刘燕君著.《C++程序设计课程设计》.北京:

机械工业出版社,2004

[2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京:

高等教育出版社,2004

[3]陈向群,向勇等.Windows操作系统原理(第二版).北京:

机械工业出版社,2004.

[4]费翔林,李敏,叶保留等.Linux操作系统实验教程.北京:

高等教育出版社,2009

附录:

#include<

iostream.h>

queue>

string>

windows.h>

malloc.h>

usingnamespacestd;

//进程的状态

#defineUNREADY0//未就绪

#defineREADY1//就绪

#defineEXECUTE2//执行

#defineEND3//完成

//进程的PCB结构类型定义和结构变量说明

structProcessPcb

{

ProcessPcb()

{

next=NULL;

}

//提交时间,从时间的1开始计时

inttime_left;

doubletime_aver;

ProcessPcb*next;

};

//封装CPU调度与分配程序模块。

进程类

classCpuModel

public:

CpuModel()

{

pcbnum=0;

}

voidcpurun();

boolCreatePcb();

voidShowPcb();

voidPriModel();

voidFcfsModel();

private:

ProcessPcbPcbList[100];

//按提交时间排的未就绪进程队列

intpcbnum;

//进程数量

intfreetime;

//cpu空闲时间

intallturn;

//总周转时间

floatallaver;

//总带权周转时间

#include<

algorithm>

//cpu模拟运行函数

voidCpuModel:

:

cpurun()

intchoose=0;

while

(1)

{

cout<

<

"

***主菜单***"

endl;

cout<

----------------------------------"

***1:

创建进程***"

***2:

显示已创建的进程***"

***3:

可强占的优先进程调度***"

***4:

先到先服务调度***"

***5:

退出系统***"

\n***请选择:

"

;

cin>

>

choose;

endl;

switch(choose)

case1:

CreatePcb();

//创建进程

break;

case2:

ShowPcb();

//显示已创建的进程

case3:

PriModel();

//可强占的优先进程方式

break;

case4:

FcfsModel();

//先到先服务调度方式

case5:

return;

//结束程序

}

//按进程提交时间排序的比较函数

boolcmp(ProcessPcba,ProcessPcbb)

if(a.time_submit<

b.time_submit)

returntrue;

returnfalse;

//判断是否数字

intisnumber(chara[])

intlen=strlen(a);

inti,num=0;

if(a[0]>

'

0'

&

a[0]<

='

9'

num=a[0]-'

;

elsereturn-1;

for(i=1;

i<

len;

i++)

if(a[i]>

a[i]<

num=num*10+a[i]-'

returnnum;

//进程输入函数

boolCpuModel:

charnum[10];

\n***请输入你想建立的进程个数:

cin>

num;

//输入进程个数

pcbnum=isnumber(num);

if(pcbnum<

=0)

***输入有错***\n"

return0;

}

inti;

for(i=0;

pcbnum;

i++)//输入进程信息

***请依次输入第"

i+1<

个进程的信息***"

*******名字:

PcbList[i].pro_name;

***提交时间:

PcbList[i].time_submit=isnumber(num);

if(PcbList[i].time_submit<

=0)

cout<

return0;

***执行时间:

cin>

PcbList[i].time_exe=isnumber(num);

if(PcbList[i].time_exe<

}

PcbList[i].time_left=PcbList[i].time_exe;

//设置剩余执行时间

PcbList[i].pro_state=UNREADY;

//设置状态为未就绪

PcbList[i].pro_priority=100-PcbList[i].time_exe;

//设置优先级,优先级=100-执行时间

sort(PcbList,PcbList+pcbnum,cmp);

//按提交时间排序

PcbList[i].pro_id=i+1;

//设置Id,根据提交时间

return1;

//展示所需执行进程信息

inti;

\n***所需执行的进程信息如下***\n"

cout<

进程编号:

PcbList[i].pro_id<

进程名字:

<

PcbList[i].pro_name<

提交时间:

PcbList[i].time_submit

执行时间:

PcbList[i].time_exe<

优先级数:

PcbList[i].pro_priority<

//可强占的优先进程调度模式

********可强占的优先进程调度过程如下********\n"

freetime=0;

//初始化系统空闲时间为0

inttime=0;

//时间

intnextid=0;

intpnum=0;

//已就绪进程数目

ProcessPcb*head;

//就绪队列

ProcessPcb*pcb,*pcb1,*pcb2;

head=(ProcessPcb*)malloc(sizeof(ProcessPcb));

head->

next=NULL;

//head指针不用,head->

next开始为就绪队列

//模拟cpu开始工作

while(head->

next!

=NULL||pnum<

pcbnum)

Sleep(1000);

time++;

//时间片为1

*Time:

第"

time<

秒"

//打印

//进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)

while(pnum<

pcbnum&

PcbList[pnum].time_submit<

=time)

pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb));

*pcb=PcbList[pnum++];

//进入就绪队列

pcb->

next=head->

next;

//插在head之后

next=pcb;

}

//查找在time时间片应该运行的进程

if(head->

next==NULL)

没有可运行的进程"

freetime++;

else

pcb2=head;

pcb=head->

pcb1=head->

//查找当前优先级最高的就绪进程

while(pcb1->

=NULL)

if(pcb->

pro_priority<

=pcb1->

next->

pro_priority)

pcb2=pcb1;

pcb=pcb1->

pcb1=pcb1->

//运行优先级最高的进程

if(pcb->

time_left==pcb->

time_exe)//该进程是否已开始

{

time_start=time;

//设置开始时间

pcb->

pro_state=EXECUTE;

//设置状态为执行

pcb->

pro_priority=pcb->

pro_priority-3;

//优先级数减3

time_left--;

//剩余执行时间减去时间片1

//打印该进程信息

pcb->

pro_id<

<

pro_name<

time_submit<

\n开始时间:

还剩时间:

time_left<

//该进程是否执行结束

time_left==0)

pcb2->

next=pcb2->

//将其在就绪队列中出列

time_end=time;

//设置结束时间

time_turn=pcb->

time_end-pcb->

time_submit+1;

//计算周转时间

time_aver=pcb->

time_turn/(double)pcb->

time_exe;

//计算带权周转时间

pro_state=END;

\n进程"

运行结束:

\n进程名字:

<

time_exe<

开始时间:

结束时间:

time_end<

\n周转时间:

time_turn<

带权周转时间:

time_aver<

}

}

//模拟CPU工作结束

\n所有进程运行完毕!

doublec=(time-freetime)/(double)time*100;

\ncpu利用率:

c<

%"

}//可强占的优先进程调度模式结束

//先到先服务调度模式

********先到先服务进程调度过程如下********\n"

ProcessPcbque[100];

intquef=0,quee=0;

//就绪队列的头指针和尾指针

//模拟cpu开始工作

while(quef<

quee||pnum<

Sleep(1000);

//打印

//进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)

while(pnum<

que[quee++]=PcbList[pnum++];

//查找time时间片的运行进程

if(quef==quee)

{

//运行进程

if(que[quef].time_left==que[quef].time_exe)//该进程是否已开始

que[quef].time_start=time;

que[quef].pro_state=EXECUTE;

que[quef].time_left--;

//打印进程信息

que[quef].pro_id<

que[quef].pro_name<

que[quef].time_submit<

que[quef].time_exe

que[quef].time_start<

que[quef].time_left<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2