操作系统 磁盘调度.docx

上传人:b****1 文档编号:13374275 上传时间:2023-06-13 格式:DOCX 页数:20 大小:135.79KB
下载 相关 举报
操作系统 磁盘调度.docx_第1页
第1页 / 共20页
操作系统 磁盘调度.docx_第2页
第2页 / 共20页
操作系统 磁盘调度.docx_第3页
第3页 / 共20页
操作系统 磁盘调度.docx_第4页
第4页 / 共20页
操作系统 磁盘调度.docx_第5页
第5页 / 共20页
操作系统 磁盘调度.docx_第6页
第6页 / 共20页
操作系统 磁盘调度.docx_第7页
第7页 / 共20页
操作系统 磁盘调度.docx_第8页
第8页 / 共20页
操作系统 磁盘调度.docx_第9页
第9页 / 共20页
操作系统 磁盘调度.docx_第10页
第10页 / 共20页
操作系统 磁盘调度.docx_第11页
第11页 / 共20页
操作系统 磁盘调度.docx_第12页
第12页 / 共20页
操作系统 磁盘调度.docx_第13页
第13页 / 共20页
操作系统 磁盘调度.docx_第14页
第14页 / 共20页
操作系统 磁盘调度.docx_第15页
第15页 / 共20页
操作系统 磁盘调度.docx_第16页
第16页 / 共20页
操作系统 磁盘调度.docx_第17页
第17页 / 共20页
操作系统 磁盘调度.docx_第18页
第18页 / 共20页
操作系统 磁盘调度.docx_第19页
第19页 / 共20页
操作系统 磁盘调度.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统 磁盘调度.docx

《操作系统 磁盘调度.docx》由会员分享,可在线阅读,更多相关《操作系统 磁盘调度.docx(20页珍藏版)》请在冰点文库上搜索。

操作系统 磁盘调度.docx

操作系统磁盘调度

成绩

 

课程设计报告

 

题目进程调度

课程名称操作系统课程设计

院部名称信息技术学院

专业10计算机科学与技术

班级10计算机科学与技术单

学生姓名龚校丹

学号1005202013

课程设计地点1318

课程设计学时20

指导教师李莉

金陵科技学院教务处制

 

目录

一、课程设计的目的和要求3

1.1课程设计的目的3

1.2课程设计的要求3

二、系统需求分析3

三、概要设计3

3.1系统功能流程图3

3.2主函数与各子函数之间的关系图4

四、详细设计5

4.1数据结构5

4.2各功能模块分析5

4.2.1sort()函数功能的分析与设计5

4.2.2check()函数功能的分析与设计6

4.2.3disp()函数功能分析与设计7

五、调试与运行8

5.1运行过程描述8

5.2输入进程信息8

5.3显示运行结果9

5.4遇到问题10

六、结论与体会10

七、参考文献10

附件11

一、课程设计的目的和要求

1.1课程设计的目的

进程调度是处理机管理的核心内容。

本设计要求用C语言编写和调试一个简单的进程调度程序。

通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。

1.2课程设计的要求

(1)进程调度算法:

采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

(2)每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:

进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

(3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

(4)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

(5)就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

(6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

  

(7)重复以上过程,直到所要进程都完成为止。

二、系统需求分析

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪进程的个数大于处理器数时,就必须依照某种策略决定哪些进程优先占用处理器。

本课设模拟在单处理器情况下的处理器调度,加深了解处理器调度的工作。

进程是在自身的虚拟地址空间运行的一个单独的程序。

进程与程序是有区别的,虽然它由程序产生。

程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。

而且一个程序可以启动多个进程。

进程是程序执行时的一个实例,从用户的观点来看,进程的目的是担当分配系统资源(CPU时间,存储器等)的实体。

进程调度算法用于确定就绪队列中的哪一个进程即将获得CPU。

该优先级调度算法为:

每一个进程确定一个优先数,进程就绪队列按照优先数排序。

根据优先级的顺序模拟执行进程,时间片减一,优先级减一,在进行第二次排序运行。

三、概要设计

3.1系统功能流程图

下图是根据实验要求以及进程调度程序的功能,画出的程序设计流程图。

把3个进程按给定的优先数从大到小连成队列。

用一单元指出队首进程。

处理器调度总是先对首进程运行。

采用动态改变优先数的办法,进程每运行一次,则:

优先数-1要求运行时间-1

进程运行完一次后,若要求运行时间不等于0,则要求将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间等于0,则它的状态修改为“结束”,且退出队列。

进程调度系统流程图

3.2主函数与各子函数之间的关系图

运用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),设计一个有3个进程共行的进程调度程序。

每个进程有一个进程控制块(PCB)表示;每个进程的状态可以是两种状态之一;就绪进程获得CPU后都只能运行一个时间片;每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查;重复以上过程,直到所要进程都完成为止。

下图为函数调用图:

各子函数功能介绍:

1)sort()函数:

进程按优先级从大到小排序。

读取PCB进程控制块信息,判断它是否为优先级最大者,如果是,则插入队首,如果不是最大,则进行优先级比较,插入适当位置。

结束本次函数调用。

2)input()函数功能:

建立进程控制块。

然后调用sort函数。

要求输入以下信息:

1.需要输入模拟运行进程数。

2.各进程的信息,进程名,进程优先级,进程运行时间。

3)disp()函数功能:

用于显示当前进程。

因为进程有执行和就绪状态,所以各个函数显示信息不一样,所以用if语句判断。

4)check()函数功能:

查看当前进程以及就绪队列状态,调用disp()函数显示。

5)destroy()函数功能:

显示撤消进程的进程名字。

6)running()函数功能:

进程运行时间到,置就绪状态。

中间有个判断语句,如果需要的时间和运行的时间相等,则调用destroy函数显示撤销进程。

否则将当前进程的优先级减一,并调用sort函数排序。

四、详细设计

4.1数据结构

进程名

Pcb指针

要求运行时间

优先数

状态

假定系统有3个进程,每一个进程用一个进程控制块PCB来代表。

进程控制块的格式图。

 

进程名:

作为进程的标识,假设五个进程的进程名分别为A,B,C。

PCB指针:

按优先数的大小把3个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“NULL”。

要求运行时间:

假设进程需要运行的单位时间数。

优先数:

赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态:

可假设有2种状态,“就绪”状态“执行”状态。

3个进程的初始状态都为“就绪”状态,用“R”表示,“执行”状态用“W”表示。

4.2各功能模块分析

4.2.1sort()函数功能的分析与设计

1)功能分析

本程序主要是sort()函数的流程图,sort()函数主要是一个建立对进程进行优先级排列函数,通过对当前读取的进程优先级与之前的进程的比较,从而判断出下一个该执行的进程号以及进程队列。

2)功能模块图

根据对该函数的功能的分析,该功能模块图如下图所示:

4.2.2check()函数功能的分析与设计

1)功能分析

Check()函数主要是查看并显示当前进程以及就绪队列状态。

具体如下:

先显示当前的进程,调用disp()函数,然后判断指针是否为空,为空则结束该函数调用,不为空则显示就绪队列,调用disp()函数实现。

2)功能模块图

根据对该函数的功能的分析,该功能模块图如下图所示:

 

4.2.3disp()函数功能分析与设计

1)功能分析:

该函数主要是用来显示当前正在运行的进程和就绪状态的进程,当进程块正在运行,disp()函数通过被check()函数调用来显示当前运行进程的相关信息,要是进程不在运行,即在就绪状态也可调用disp()函数显示进程信息。

2)功能模块图:

根据对该函数的功能的分析,该功能模块图如下图所示:

五、调试与运行

5.1运行过程描述

1)输入你要模拟运行的进程数,初始化进程PCB。

2)输入PCB的信息,包括进程名,优先级,需要运行时间。

3)将PCB表中的各项按从前到后的顺序加入至就绪队列中。

4)主摸拟过程:

while(就绪队列不为空||runProcess不为空)

{

延时

If(runProcess不为空)

{

输出当前活动进程的各属性值(如进程名,优先值,需要运行时间)

将当前活动进程的优先值加1,剩余运行时间减1.

If(当前进程的剩余运行时间为0)

{

当前进程状态置1,并加至结束队列中.

更新PCB表中的内容.

}

elseif(就绪队列不为空)//为空时就剩下一个进程,无需再加入队列

{

当前进程状况置为准备状态

根据动态优先数将当前的进程插入到就绪队列的适当的位置更新PCB表.

}

}

If(runProcess不为空&&runProcess->remainSecs==0)

//处理只剩下最后一个进程且剩余运行时间>0的情况

置runProcess为NULL.

if(就绪队列不为空)

{

从就绪队列中弹出一个进程给runProcess

置runProcess的状态为运行态.

更新PCB表

}

}

5.2输入进程信息

此阶段主要是初始化进程,初始提示如下图:

我输入了3,代表我将模拟三个进程调度,然后是输入各个进程的信息。

每一次进程都要输入它的名字,优先级以及运行时间,进程名作为进程的标识,3个进程的进程名分别为A,B,C,优先级分别是1,2,3,它们的运行时间是1,2,3。

指针按优先数的大小把3个进程连成队列,用指针值初下一个进程的进程控制块的首地址,最后一个进程的指针为“0”。

当前运行结果如下

5.3显示运行结果

此图是通过disp函数来显示进程,首先显示运行的次数,接着显示工作正在运行的进程的相关信息,然后显示就绪状态的进程信息,每次一个进程运行完成屏幕会显示“进程[?

]运行结束”。

当全部运行完成时,屏幕显示“并发进程模拟调度结束”。

5.4遇到问题

在调试过程中让我们输入进程相关信息时,我把进程的运行时间写的比优先级大,优先级每次减1,最后会成为负数,经过几次实践证明,我发现该进程虽然可以运行,但是不够具有代表性,所以我将所有的运行时间同进程的优先级,最后优先级减下来的结果为0,满足当前系统要求。

在刚开始创建进程时,我用了fock()函数来真实创建进程,一直累加,导致进程创建进入死循环,系统崩溃了。

六、结论与体会

本次实验主要是对进程利用C语言编写程序代码,然后进行上机调试、修改、进行连接,测试,VC不支持mallac函数,不能运行该程序,所以,我下载了个dev_c++,来运行该程序。

而且,在编程时一定要细心,不要忘了定义使用的值,一些累加的要设置初值,否则信息出错。

通过本次实验对进程的调试,我对课本上有关进程的知识进一步加深了理解,而且也知道了进程该如何运行,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)的具体实施办法。

七、参考文献

1、《计算机操作系统》汤子赢等编著,西安电子科技大学出版社

2、《操作系统实验教程》张丽芬等编著,清华大学出版社2006年

 

附件

进程调度系统源程序清单

#include"stdio.h"

#include

#include

#definegetpch(type)(type*)malloc(sizeof(type))

structpcb{/*定义进程控制块PCB*/

charname[10];

charstate;

intsuper;

intntime;

intrtime;

structpcb*link;

}*ready=NULL,*p;

typedefstructpcbPCB;

intsystem(constchar*string);

sort()/*建立对进程进行优先级排列函数*/

{

PCB*first,*second;

intinsert=0;

if((ready==NULL)||((p->super)>(ready->super)))/*优先级最大者,插入队首*/

{

p->link=ready;

ready=p;

}

else/*进程比较优先级,插入适当的位置中*/

{

first=ready;

second=first->link;

while(second!

=NULL)

{

if((p->super)>(second->super))/*若插入进程比当前进程优先数大,*/

{/*插入到当前进程前面*/

p->link=second;

first->link=p;

second=NULL;

insert=1;

}

Else/*插入进程优先数最低,则插入到队尾*/

{

first=first->link;

second=second->link;

}

}

if(insert==0)first->link=p;

}

}

input()/*建立进程控制块函数*/

{

inti,num;

printf("请输入并发的进程数目(0~9)");

scanf("\t%d",&num);

printf("\n请输入进程相关信息\n");

for(i=1;i<=num;i++)

{

printf("\n进程%d:

\n",i);

p=getpch(PCB);

printf("\n进程名:

");

scanf("%s",p->name);

printf("\n进程优先级:

");

scanf("%d",&p->super);

printf("\n进程运行时间:

");

scanf("%d",&p->ntime);

printf("\n");

p->rtime=0;p->state='w';

p->link=NULL;

sort();/*调用sort函数*/

}

}

intspace()

{

intl=0;PCB*pr=ready;

while(pr!

=NULL)

{

l++;

pr=pr->link;

}

return(l);

}

disp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/

{

if(pr->state=='R')

{

printf("\n进程名进程状态进程优先级进程需要时间进程已运行时间\n");

printf("%s\t",pr->name);

printf("%c\t",pr->state);

printf("%d\t",pr->super-1);

printf("%d\t",pr->ntime);

printf("%d\t\n",pr->rtime+1);

}

else

{

printf("\n进程名进程状态进程优先级进程需要时间进程已运行时间\n");

printf("%s\t",pr->name);

printf("%c\t",pr->state);

printf("%d\t",pr->super);

printf("%d\t",pr->ntime);

printf("%d\t",pr->rtime);

}

}

check()/*建立进程查看函数*/

{

PCB*pr;

printf("\n****当前正在运行的进程为:

%s",p->name);/*显示当前运行进程*/

disp(p);

pr=ready;

printf("\n****就绪队列状态为:

\n");/*显示就绪队列状态*/

while(pr!

=NULL)

{

disp(pr);

pr=pr->link;

}

}

destroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/

{

printf("\n进程[%s]运行结束.",p->name);

free(p);

}

running()/*建立进程就绪函数(运行时间到,置就绪状态*/

{

(p->rtime)++;

if(p->rtime==p->ntime)

destroy();/*调用destroy函数*/

else

{

(p->super)--;

p->state='w';

sort();/*调用sort函数*/

}

}

main()/*主函数*/

{

intlen,h=0;

charch;

input();

len=space();

while((len!

=0)&&(ready!

=NULL))

{

ch=getchar();

h++;

printf("\n运行次数为:

%d\n",h);

p=ready;

ready=p->link;

p->link=NULL;

p->state='R';

check();

running();

printf("\n请按任意键进入下次运行过程");

ch=getchar();

}

printf("\n并发进程优先级调度模拟结束\n");

ch=getchar();

}

 

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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