C语言程序设计进程调度.docx
《C语言程序设计进程调度.docx》由会员分享,可在线阅读,更多相关《C语言程序设计进程调度.docx(20页珍藏版)》请在冰豆网上搜索。
![C语言程序设计进程调度.docx](https://file1.bdocx.com/fileroot1/2023-1/10/6bacd522-7e7a-475c-805b-e89dccb960f2/6bacd522-7e7a-475c-805b-e89dccb960f21.gif)
C语言程序设计进程调度
辽宁工业大学
C语言程序设计课程设计(论文)
题目:
进程调度
院(系):
软件学院
专业班级:
学号:
学生姓名:
指导教师:
教师职称:
助教
起止时间:
2009.12.14至2009.12.26
课程设计(报告)任务及评语
院(系):
软件学院教研室:
软件教研室
学号
学生姓名
专业班级
程序设计(报告)题目
进程调度
程序设计(报告)任务
程序设计的任务与要求:
(1)掌握C语言编程的基础知识。
(2)较熟练地编写C语言应用程序。
(3)了解C语言的常用标准函数、编程技巧、异常处理。
(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。
(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
2009年12月31日
目录
第1章课程设计的目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1程序功能介绍2
2.2程序整体设计说明2
2.2.1设计思路2
2.2.2数据结构设计及用法说明3
2.2.3程序结构3
2.2.4各模块的功能及程序说明4
2.2.5程序结果7
2.3程序源代码及注释10
第3章课程设计总结17
参考资料18
第1章课程设计的目的与要求
1.1课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
1.2课程设计的实验环境
硬件要求能运行Windows2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3课程设计的预备知识
熟悉C语言及C语言开发工具。
1.4课程设计要求
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
第2章课程设计内容
2.1程序功能介绍
在多道程序环境下,进程数目往往多于处理机数目,致使他们争用处理机。
这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行。
分配处理机的任务是由进程调度程序完成的。
一个进程被建立后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同点进程队列。
因此,进程调度性能的商量是操作系统设计的一个重要指标。
在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。
也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。
于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。
进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。
2.2程序整体设计说明
2.2.1设计思路
在本程序中,我将系统默认为真的情况下的算法置为优先数算法,如果用户不加以选择那么进程就会按照优先数算法进行调度,只有选择了轮转法才会按时间片的顺序执行进程。
在程序的最后我还添加了一些显示当前时间和进程序号的小功能。
运用了程序设计语言编写了这个进程调度模拟系统,其中的调度算法采用了优先数调度算法和轮转调度算法。
优先数调度算法用于进程调度时,系统把处理机分配给就绪队列中优先数最大的进程,系统一旦把处理机分配给就绪队列中优先数最大的进程后,该进程便一直执行下去直至完成,若因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先数最大的进程。
每个进程的状态可以是执行E(execute),就绪R(ready)和等待W(wait)三种状态之一.就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示.
2.2.2数据结构设计及用法说明
程序设计分为优先数调度算法和轮转调度算法两个数据结构,在每个数据结构块中都含有进程控制块PCB,其中包括该进程的基本信息和当前状态等参数,系统通过选择运用哪一个结构块里的算法进行调度来完成用户的需求。
1.优先级与时间片的设计
1)进程因等待放弃CPU时,优先级置为1(高优先级)
2)进程因时间片到放弃CPU时,优先级置为0(低优先级)
3)优先1对应时间片4;优先级0对应时间片10。
2.进程控制块(PCB)的内容
进程标识3---9
进程优先级0,1
进程优先级0,1
进程等待时间20
链接指针
2.2.3程序结构
进程调度流程图如图2.1所示:
图2.1进程调度流程图
2.2.4各模块的功能及程序说明
1程序算法
(1)PCB结构,变量与主程序
structPCB
{
intpname;
intpri;
intruntime;
intwaitting;
structPCB*next;
}
pcb[7];
structPCB*running,ready,wait;
intsin=0;
main()
{
创建PCB[3]--PCB[9]并插入ready队列;
/*pname分别为3--9,pri=0,runtime=10,waittime=0*/
for(;;)/*系统程序,完成初始化和处理机分派功能*/
{cast{sig=0:
swtch;
sig=1:
waiter;
sig=3:
proc3;
sig=4:
proc4;
sig=5:
proc5;
sig=6:
proc6;
sig=7:
proc7;
sig=8:
proc8;
sig=9:
proc9;}
}
}
(2)进程调度程序
swtch()
{
while(ready==NULL)wakeup();
移出就绪队列第一个PCB;
送running指针;
若pri=1,则runntime=4,否则runtime=10;
将running→pname送sig
}
(3)将进程等待函数
wait()
{
将运行进程插入wait队列,优先数置1;
sig=0;
}
(4)进程唤醒函数
wakeup()
{
将wait队列中所有的PCB中waittime减1;
将wait队列中的所有的waittime=0的PCB揭除;
插入到ready队列中第一个优先级为0的PCB前面
}
[/b][/font][/size]
2数据结构的模块说明
1)优先级与时间片的设计
进程因等待放弃CPU时,优先级置为1(高优先级)
进程因时间片到放弃CPU时,优先级置为0(低优先级)
优先1对应时间片4;优先级0对应时间片10。
(2)进程控制块(PCB)的内容
进程标识3---9
进程优先级0,1
进程优先级0,1
进程等待时间20
链接指针
2.2.5程序结果
------------programinitstarts------------
ProcessID:
0,Name:
Process0,Priority:
8,RemainSecs:
8Staturs:
Ready
ProcessID:
1,Name:
Process1,Priority:
0,RemainSecs:
4Staturs:
Ready
ProcessID:
2,Name:
Process2,Priority:
1,RemainSecs:
8Staturs:
Ready
ProcessID:
3,Name:
Process3,Priority:
3,RemainSecs:
6Staturs:
Ready
ProcessID:
4,Name:
Process4,Priority:
5,RemainSecs:
4Staturs:
Ready
------------programinitends------------
------------startofmainsimulationprogram------------
Line:
1ProcessID:
1,Name:
Process1,Priority:
0,RemainSecs:
4Staturs:
Running
Line:
2ProcessID:
2,Name:
Process2,Priority:
1,RemainSecs:
8Staturs:
Running
Line:
3ProcessID:
1,Name:
Process1,Priority:
1,RemainSecs:
3Staturs:
Running
Line:
4ProcessID:
2,Name:
Process2,Priority:
2,RemainSecs:
7Staturs:
Running
Line:
5ProcessID:
1,Name:
Process1,Priority:
2,RemainSecs:
2Staturs:
Running
Line:
6ProcessID:
3,Name:
Process3,Priority:
3,RemainSecs:
6Staturs:
Running
Line:
7ProcessID:
2,Name:
Process2,Priority:
3,RemainSecs:
6Staturs:
Running
Line:
8ProcessID:
1,Name:
Process1,Priority:
3,RemainSecs:
1Staturs:
Running
Line:
9ProcessID:
1,Name:
Process1,Priority:
4,RemainSecs:
0Staturs:
Ends
Line:
10ProcessID:
3,Name:
Process3,Priority:
4,RemainSecs:
5Staturs:
Running
Line:
11ProcessID:
2,Name:
Process2,Priority:
4,RemainSecs:
5Staturs:
Running
Line:
12ProcessID:
4,Name:
Process4,Priority:
5,RemainSecs:
4Staturs:
Running
Line:
13ProcessID:
3,Name:
Process3,Priority:
5,RemainSecs:
4Staturs:
Running
Line:
14ProcessID:
2,Name:
Process2,Priority:
5,RemainSecs:
4Staturs:
Running
Line:
15ProcessID:
4,Name:
Process4,Priority:
6,RemainSecs:
3Staturs:
Running
Line:
16ProcessID:
3,Name:
Process3,Priority:
6,RemainSecs:
3Staturs:
Running
Line:
17ProcessID:
2,Name:
Process2,Priority:
6,RemainSecs:
3Staturs:
Running
Line:
18ProcessID:
4,Name:
Process4,Priority:
7,RemainSecs:
2Staturs:
Running
Line:
19ProcessID:
3,Name:
Process3,Priority:
7,RemainSecs:
2Staturs:
Running
Line:
20ProcessID:
2,Name:
Process2,Priority:
7,RemainSecs:
2Staturs:
Running
Line:
21ProcessID:
0,Name:
Process0,Priority:
8,RemainSecs:
8Staturs:
Running
Line:
22ProcessID:
4,Name:
Process4,Priority:
8,RemainSecs:
1Staturs:
Running
Line:
23ProcessID:
4,Name:
Process4,Priority:
9,RemainSecs:
0Staturs:
Ends
Line:
24ProcessID:
3,Name:
Process3,Priority:
8,RemainSecs:
1Staturs:
Running
Line:
25ProcessID:
3,Name:
Process3,Priority:
9,RemainSecs:
0Staturs:
Ends
Line:
26ProcessID:
2,Name:
Process2,Priority:
8,RemainSecs:
1Staturs:
Running
Line:
27ProcessID:
2,Name:
Process2,Priority:
9,RemainSecs:
0Staturs:
Ends
Line:
28ProcessID:
0,Name:
Process0,Priority:
9,RemainSecs:
7Staturs:
Running
Line:
29ProcessID:
0,Name:
Process0,Priority:
10,RemainSecs:
6Staturs:
Running
Line:
30ProcessID:
0,Name:
Process0,Priority:
11,RemainSecs:
5Staturs:
Running
Line:
31ProcessID:
0,Name:
Process0,Priority:
12,RemainSecs:
4Staturs:
Running
Line:
32ProcessID:
0,Name:
Process0,Priority:
13,RemainSecs:
3Staturs:
Running
Line:
33ProcessID:
0,Name:
Process0,Priority:
14,RemainSecs:
2Staturs:
Running
Line:
34ProcessID:
0,Name:
Process0,Priority:
15,RemainSecs:
1Staturs:
Running
Line:
35ProcessID:
0,Name:
Process0,Priority:
16,RemainSecs:
0Staturs:
Ends
------------endofmainsimulationprogram------------
程序运行结果如图2.2所示:
图2.2程序运行结果
2.3程序源代码及注释
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedefstructnode
{
charname[10];/*进程标识符*/
intprio;/*进程优先数*/
intround;/*进程时间轮转时间片*/
intcputime;/*进程占用CPU时间*/
intneedtime;/*进程到完成还要的时间*/
intcount;/*计数器*/
charstate;/*进程的状态*/
structnode*next;/*链指针*/
}PCB;
PCB*finish,*ready,*tail,*run;/*队列指针*/
intN;/*进程数*/
firstin()
{
run=ready;/*就绪队列头指针赋值给运行头指针*/
run->state='R';/*进程状态变为运行态*/
ready=ready->next;/*就绪对列头指针后移到下一进程*/
}
voidprt1(chara)
{
if(toupper(a)=='P')/*优先数法*/
printf("namecputimeneedtimeprioritystate\n");
else
printf("namecputimeneedtimecountroundstate\n");
}
voidprt2(chara,PCB*q)
{
if(toupper(a)=='P')/*优先数法的输出*/
printf("%-10s%-10d%-10d%-10d%c\n",q->name,
q->cputime,q->needtime,q->prio,q->state);
else/*轮转法的输出*/
printf("%-10s%-10d%-10d%-10d%-10d%-c\n",q->name,
q->cputime,q->needtime,q->count,q->round,q->state);
}
voidprt(charalgo)
{
PCB*p;
prt1(algo);/*输出标题*/
if(run!
=NULL)/*如果运行指针不空*/
prt2(algo,run);/*输出当前正在运行的PCB*/
p=ready;/*输出就绪队列PCB*/
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;/*输出完成队列的PCB*/
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;
}
getch();/*压任意键继续*/
}
insert1(PCB*q)
{
PCB*p1,*s,*r;
intb;
s=q;/*待插入的PCB指针*/
p1=ready;/*就绪队列头指针*/
r=p1;/*r做p1的前驱指针*/
b=1;
while((p1!
=NULL)&&b)/*根据优先数确定插入位置*/
if(p1->prio>=s->prio)
{
r=p1;
p1=p1->next;
}
else
b=0;
if(r!
=p1)/*如果条件成立说明插入在r与p1之间*/
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1;/*否则插入在就绪队列的头*/
ready=s;
}
}
insert2(PCB*p2)
{
tail->next=p2;/*将新的PCB插入在当前就绪队列的尾*/
tail=p2;
p2->next=NULL;
}
voidcreate1(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;/*就绪队列头指针*/
finish=NULL;/*完成队列头指针*/
run=NULL;/*运行队列指针*/
printf("Enternameandtimeofprocess\n");/*输入进程标识和所需时间创建PCB*/
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->prio=50-time;
if(ready!
=NULL)/*就绪队列不空调用插入函数插入*/
insert1(p);
else
{
p->next=ready;/*创建就绪队列的第一个PCB*/
ready=p;
}
}
clrscr();
printf("outputofpriority:
\n");
printf("************************************************\n");
prt(alg);/*输出进程PCB信息*/
run=ready;/*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
voidcreate2(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("Enternameandtimeofroundprocess\n");
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->count=0;/*计数器*/
p->state='w';
p->round=2;/*时间片*/
if(ready!
=NULL)
insert2(p);
else
{
p->next=ready;
ready=p;
tail=p;
}
}
clrscr();
printf("outputofround\n");
printf("************************************************\n");
prt(alg);/*输出进程PCB信息*/
run=ready;/*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
priority(charalg)
{
while(run!
=NULL)/*当运行队列不空时,有进程正在运行*/
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->prio=run->prio-3;/*每运行一次优先数降低3个单位*/
if(run->needtime==0)/*如所需时间为0将其插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';/*置状态为完成态*/
run=NULL;/*运行队列头指针为空*/
if(ready!
=NULL)/*如就绪队列不空*/
firstin();/*将就绪对