用C语言模拟Linux操作系统下处理机调度实验报告.docx

上传人:b****5 文档编号:28885063 上传时间:2023-07-20 格式:DOCX 页数:11 大小:103.20KB
下载 相关 举报
用C语言模拟Linux操作系统下处理机调度实验报告.docx_第1页
第1页 / 共11页
用C语言模拟Linux操作系统下处理机调度实验报告.docx_第2页
第2页 / 共11页
用C语言模拟Linux操作系统下处理机调度实验报告.docx_第3页
第3页 / 共11页
用C语言模拟Linux操作系统下处理机调度实验报告.docx_第4页
第4页 / 共11页
用C语言模拟Linux操作系统下处理机调度实验报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

用C语言模拟Linux操作系统下处理机调度实验报告.docx

《用C语言模拟Linux操作系统下处理机调度实验报告.docx》由会员分享,可在线阅读,更多相关《用C语言模拟Linux操作系统下处理机调度实验报告.docx(11页珍藏版)》请在冰豆网上搜索。

用C语言模拟Linux操作系统下处理机调度实验报告.docx

用C语言模拟Linux操作系统下处理机调度实验报告

实验二:

处理机调度

一、实验目的:

1、了解Linux下Emacs编辑器的使用方法,掌握各种常用的键盘操作命令;

2、理解并掌握处理机调度算法。

二、实验内容及要求:

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

当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机。

本实验模拟在单处理机情况下处理机调度。

1、优先调度算法实现处理机的调度:

设计思路:

1每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识、指针(按优先数的大小把进程连成队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针为"0"、要求运行时间、优先数、状态(就绪、结束;

2每次运行处理机调度程序前,为每个进程确定它的"优先数"和"要求运行时间";

3把给定的进程按优先数的大小连成队列,用一单元指出队首进程;

4每模拟执行一次进程,优先数减一,要求运行时间减一;

5如果要求运行的时间>=0,再将它加入队列(按优先数的大小插入,重置队首标志);如果要求运行的时间=0,那么把它的状态修改为结束,且推出队列;

6若就绪队列不为空,重复上述,直到所有的进程都结束;

7程序有显示和打印语句,每次运行后显示变化。

2、按时间片轮转法实现处理机调度:

设计思路:

1每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识、指针(把进程连成循环队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址、已运行时间、状态(就绪、结束;

2每次运行处理机调度程序前,为每个进程确定它的"要求运行时间";

3用指针把给定的进程按顺序排成循环队列,用另一标志单元记录轮到的进程;

4每模拟运行一次进程,已运行时间加一;

5进程运行一次后,把该进程控制块的指针值送到标志单元,以指示下一个轮到的进程。

若该进程要求运行时间≠已运行时间,未执行结束,待到下一轮再执行;若要求运行时间=已运行时间,状态改为结束,退出队列;

6若就绪队列不为空,重复步骤四和五;

7程序有显示和打印语句,每次运行后显示变化。

3、程序设计:

1、优先数调度算法:

/*我的思路:

先主函数输入要进行调度的进程数,然后调用函数create(,把进程的信息输入,再调用函数insert(,把输入的函数按照优先数的大小排成链表,然后调用函数prio(实现优先数调度*/

#include

#include

#include

typedefstructnode

{charname[10];/*进程名*/

intprio;/*优先数*/

intcputime;/*占用cpu时间*/

intneedtime;/*要求运行时间*/

charstate;/*状态*/

structnode*next;/*指针*/

}PCB;

PCB*ready,*run,*finish;/*就绪执行结束指针*/

intN;

voidprt(/*输出函数,可以方便看到进程执行的演示*/

{

PCB*p;

printf("NAMECPUTIMENEEDTIMEPRIORITYSTATUS\n";

if(run!

=NULLprintf("%-10s%-10d%-10d%-10d%c\n",run->name,run->cputime,run->needtime,run->prio,run->state;/*输出执行的进程的信息*/

p=ready;

while(p!

=NULL

{printf("%-10s%-10d%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->prio,p->state;/*输出就绪进程的信息*/

p=p->next;}

p=finish;

while(p!

=NULL

{printf("%-10s%-10d%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->prio,p->state;/*输出结束队列的信息*/

p=p->next;}

getchar(;}/*使用getchar(函数可以让输出时停留画面,等待人按回车继续*/

voidinsert(PCB*q/*插入新进程,把进程按优先数大小排序*/

{PCB*p1,*s,*r;

intb;

s=q;/*指针s指向新要插入的进程*/

p1=ready;/*指针p1指向原来的进程队列的队首*/

r=p1;/*使用指针r是指向p1前面的进程*/

b=1;

while((p1!

=NULL&&b

if(p1->prio>=s->prio{r=p1;p1=p1->next;}/*新进程的优先数小,则p1

elseb=0;指向下一个进程继续比*/

if(r!

=p1{r->next=s;s->next=p1;}/*新进程找到位置,插在r和p1之间*/

else{s->next=p1;ready=s;}}/*新进程的优先数最大,插在队首,并

voidcreate(修改就绪队首ready指针*/

{PCB*p;

inti;

ready=NULL;run=NULL;finish=NULL;

printf("PleaseenterthenameandtimeandpriorityofPCB:

\n";

/*输入进程名、和*/

for(i=0;i

{p=malloc(sizeof(PCB;/*为新进程开辟空间*/

scanf("%s",p->name;/*输入进程名*/

scanf("%d",&p->needtime;/*输入进程要求运行时间*/

scanf("%d",&p->prio;/*输入进程优先数*/

p->cputime=0;

p->state='W';/*表示就绪队列中未在队首先执行,但也是就绪状态*/

if(ready!

=NULLinsert(p;/*就绪队首不为NULL,插入新进程*/

else{p->next=ready;ready=p;}}/*否则先插在NULL前*/

printf("Displayisgoingtostart:

\n";

printf("***********************************************\n";

prt(;

run=ready;/*队列排好,run指向就绪队列队首*/

ready=ready->next;/*ready指向下一个进程,这样当进程执行时如果优先数小于其他的进程,应该先进行优先数最大的进程*/

run->state='R';}/*队首进程的状态为就绪*/

voidprio(

{while(run!

=NULL

{run->cputime=run->cputime+1;/*运行一次cpu占用时间加一*/

run->needtime=run->needtime-1;/*运行一次要求运行时间减一*/

run->prio=run->prio-1;/*运行一次优先数减一*/

if(run->needtime==0/*若要求运行时间为0时*/

{run->next=finish;/*退出队列*/

finish=run;/*finish为结束进程的队列*/

run->state='E';/*修改状态为结束*/

run=NULL;/*释放run指针*/

if(ready!

=NULL/*创建新就绪队列的头指针*/

{run=ready;run->state='R';ready=ready->next;}}

else

if((ready!

=NULL&&(run->prioprio

/*队首进程的优先数比它下一个小,且下一个进程不为NULL时执行*/

{run->state='W';

run->next=NULL;/*队首进程退出进程队列*/

insert(run;/*在进程队列中重新插入原来的队首进程*/

run=ready;/*重新置就绪队列的头指针*/

run->state='R';

ready=ready->next;}

prt(;}}

voidmain(

{printf("PleaseenterthetotalnumberofPCB:

\n";

scanf("%d",&N;

create(;/*模拟创建进程,并输入相关信息*/

prio(;}/*优先数调度算法*/

2、时间片轮转法:

#include

#include

#include

typedefstructnode

{charname[10];/*进程名*/

intcount;/*计数器,判断是否=时间片的大小*/

intcputime;/*占用cpu时间*/

intneedtime;/*要求运行时间*/

charstate;/*状态*/

structnode*next;/*指针*/

}PCB;

PCB*ready,*run,*finish,*tail;/*就绪执行结束尾指针*/

intN,round;

voidprt(/*输出函数,可以方便看到进程执行的演示*/

{/*略同优先数法*/}

voidinsert(PCB*q/*在队尾插入新的进程*/

{tail->next=q;tail=q;q->next=NULL;}

voidcreate(

{PCB*p;

inti;

ready=NULL;run=NULL;finish=NULL;

printf("PleaseenterthenameandtimeofPCB:

\n";

/*输入进程名、和*/

for(i=0;i

{p=malloc(sizeof(PCB;/*为新进程开辟空间*/

scanf("%s",p->name;/*输入进程名*/

scanf("%d",&p->needtime;/*输入进程要求运行时间*/

p->cputime=0;

p->state='W';/*表示就绪队列中未在队首先执行,但也是就绪状态*/

if(ready!

=NULLinsert(p;/*就绪队首不为NULL,插入新进程*/

else{p->next=ready;ready=p;tail=p;}}

printf("Displayisgoingtostart:

\n";

printf("***********************************************\n";

prt(;

run=ready;/*队列排好,run指向就绪队列队首*/

ready=ready->next;/*ready指向下一个进程*/

run->state='R';}/*队首进程的状态为就绪*/

voidcount(

{while(run!

=NULL

{run->cputime=run->cputime+1;/*运行一次cpu占用时间加一*/

run->needtime=run->needtime-1;/*运行一次要求运行时间减一*/

run->count=run->count+1;/*运行一次计数器加一*/

if(run->needtime==0/*若要求运行时间为0时*/

{run->next=finish;/*退出队列*/

finish=run;/*finish为结束进程的队列*/

run->state='E';/*修改状态为结束*/

run=NULL;/*释放run指针*/

if(ready!

=NULL/*创建新就绪队列的头指针*/

{run=ready;run->state='R';ready=ready->next;}}

else

if(run->count==round/*如果时间片到*/

{run->count=0;/*计数器置0*/

if(ready!

=NULL/*如就绪队列不空*/

{run->state='W';

insert(run;/*在进程队列中重新插入原来的队首进程*/

run=ready;/*重新置就绪队列的头指针*/

run->state='R';

ready=ready->next;}

prt(;}}

voidmain(

{printf("PleaseenterthetotalnumberofPCB:

\n";

scanf("%d",&N;

printf("Pleaseenterthetimeround(don'tbetoobig,1or2isbest:

\n";

scanf("%d",&round;/*输入时间片的大小,不应太大*/

create(;/*模拟创建进程,并输入相关信息*/

count(;}/*优先数调度算法*/

四、程序运行的初值及执行结果:

1、优先数调度算法:

以下是输出的结果(符合优先数调度):

2、时间片轮转法调度算法:

以下是输出结果(符合时间片轮转法调度):

五、结果分析:

在优先数调度中,程序首先输出各个进程的初始值,按回车之后,由于进程p1的优先数最大,排在就绪队列的队首,首先执行,执行一次后优先数减一,要求运行时间减一,cpu占用时间加一,再和其他的进程比较优先数,还是最大,继续执行,再执行一次后优先数小于进程p3,所以下一个执行的是p3,按这样的顺序,在就绪队列队首的进程状态为"R",不在队首的就绪进程状态为"W",结束的进程状态为"E",一直执行,直到所有进程状态都为"E",调度完成。

在时间片轮转法调度中,先设置了时间片的大小为1,然后各个进程按循环队列依次执行,每执行一次,要求运行时间减一,若等于0了,则状态改为"E",退出队列,直到所有进程的状态为"E",调度完成。

6、实验小结:

本次实验虽然为模拟在单处理机情况下处理机的调度,但深深帮我理解了处理机调度的工作,也对进程的几种状态就绪、结束等有了明确的认识。

优先数调度的思考度更强点,在编写C程序的时候,对于其中的进程插入和优先数调度两个函数思考了蛮久,每执行一次进程后,优先数的改变将又要重新排就绪队列,这也是实验的难点所在,自己原来学C的时候对于队列不是很熟,也借本次实验又巩固了原来的知识。

也许是有了优先数调度的基础,时间片轮转法调度的编写来得相对轻松,它的insert(函数比较简单,不用根据优先数来排队,而是直接插在队尾即可。

另外,通过本次实验,我对函数的分模块书写的优点感受颇深,方便了移植和修改,减轻了下次编写的负担,这也是我们以后面向程序设计的要求所在。

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1