操作系统实验报告Word文件下载.docx

上传人:b****5 文档编号:20246187 上传时间:2023-01-21 格式:DOCX 页数:66 大小:463.03KB
下载 相关 举报
操作系统实验报告Word文件下载.docx_第1页
第1页 / 共66页
操作系统实验报告Word文件下载.docx_第2页
第2页 / 共66页
操作系统实验报告Word文件下载.docx_第3页
第3页 / 共66页
操作系统实验报告Word文件下载.docx_第4页
第4页 / 共66页
操作系统实验报告Word文件下载.docx_第5页
第5页 / 共66页
点击查看更多>>
下载资源
资源描述

操作系统实验报告Word文件下载.docx

《操作系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告Word文件下载.docx(66页珍藏版)》请在冰豆网上搜索。

操作系统实验报告Word文件下载.docx

stdlib.h>

conio.h>

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

structpcb//定义进程控制块PCB

{

charname[10];

charstate;

//状态

intsuper;

//优先级

intntime;

//需要时间

intcount;

//计数

intrtime;

//需要运行时间

structpcb*link;

//指针

}*ready=NULL,*p;

//队列指针

typedefstructpcbPCB;

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

PCB*first,*second;

intinsert=0;

if((ready==NULL)||((p->

super)>

(ready->

super)))//优先级最大者的插到队首

{

p->

link=ready;

ready=p;

}

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

first=ready;

//第一个ready,第二个就绪

second=first->

link;

while(second!

=NULL)

if((p->

(second->

super))//若插入进程比当前进程优先数大,

//插入到当前进程前面

link=second;

first->

link=p;

second=NULL;

insert=1;

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

first=first->

//下一个调到前面去

second=second->

if(insert==0)

}

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

inti,num;

printf("

\n请输入进程数:

"

);

scanf("

%d"

&

num);

for(i=0;

i<

num;

i++)

\n进程号No.%d:

\n"

i+1);

p=getpch(PCB);

//宏(type*)malloc(sizeof(type))

\n输入进程名:

%s"

p->

name);

\n输入进程优先数:

p->

super);

\n输入进程运行时间:

ntime);

rtime=0;

state='

w'

;

count=0;

link=NULL;

sort();

//调用sort函数

intspace()

intl=0;

PCB*pr=ready;

while(pr!

l++;

pr=pr->

return(l);

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

\nqname\tstate\tsuper\tndtimewtimeruntime\n"

|%s\t"

pr->

|%c\t"

state);

|%d\t"

count);

rtime);

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

PCB*pr;

\n****当前正在运行的进程是:

//显示当前运行进程

disp(p);

pr=ready;

\n****当前就绪队列状态为:

//显示就绪队列状态

disp(pr);

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

\n进程[%s]已完成.\n"

free(p);

if(ready==NULL)

p=NULL;

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

PCB*q;

(p->

rtime)++;

q=ready;

if(p->

rtime==p->

ntime)

destroy();

//调用destroy函数

else

if(ready!

super)--;

//动态优先数,得一次cpu优先级减1,对于相同优先级的,按照原先在队列中的顺序调度

while(q!

(q->

count)++;

if((q->

count==2))

super)++;

count)=0;

q=q->

//调用sort函数

main()//主函数

intlen,h=0;

charch;

input();

len=space();

while((len!

=0)&

&

(p!

=NULL))

ch=getchar();

//getchar();

h++;

\nTheexecutenumber:

%d\n"

h);

{}

p=ready;

ready=p->

R'

check();

running();

\n按任一键继续......"

\n\n进程已经完成.\n"

(2)时间片轮转法调度

iostream>

#include<

stdio.h>

#include"

stdlib.h"

structPCB

intname;

//进程标识符

intrr;

//已运行时间

inttime;

//进程要求运行时间

charsta;

//进程的状态

structPCB*next;

//链接指针

};

structPCBpcb1,pcb2,pcb3,pcb4,pcb5,*tail,*head,*rp;

//队列指针

chushihua()//初始化

inti,time;

pcb1.name=1;

pcb2.name=2;

pcb3.name=3;

pcb4.name=4;

pcb5.name=5;

pcb1.rr=pcb2.rr=pcb3.rr=pcb4.rr=pcb5.rr=0;

pcb1.sta=pcb2.sta=pcb3.sta=pcb4.sta=pcb5.sta='

请输入时间片p1需要运行的时间:

&

time);

pcb1.time=time;

请输入时间片p2需要运行的时间:

pcb2.time=time;

请输入时间片p3需要运行的时间:

pcb3.time=time;

请输入时间片p4需要运行的时间:

pcb4.time=time;

请输入时间片p5需要运行的时间:

pcb5.time=time;

pcb1.next=&

pcb2;

//链接队列

pcb2.next=&

pcb3;

pcb3.next=&

pcb4;

pcb4.next=&

pcb5;

pcb5.next=&

pcb1;

head=&

tail=&

voidprintf1()

+---------------|---------------|---------------|---------------+\n"

|程序名|已运行时间|要求运行时间|状态|\n"

|---------------|---------------|---------------|---------------|\n"

printf2()//显示初始状态

processesp%drunning\n"

head->

printf1();

|\t%d\t|\t%d\t|\t%d\t|\t%c\t|\n"

name,head->

rr,head->

time,head->

sta);

rp=head;

while(rp!

=tail)

{

rp=rp->

next;

rp->

name,rp->

rr,rp->

time,rp->

roundrun()//时间片轮转法

{

intflag=1;

while(flag<

=5)

head->

rr++;

if((head->

rr==head->

time)||(head->

time==0))//当进程完成

tail->

sta='

f'

printf2();

head=head->

//就绪队列头指针后移到下一进程

next=head;

//尾指针指向head

flag++;

else//没finished,继续running

r'

tail=head;

}

voidmain()

chushihua();

\n运行啦***************:

roundrun();

(3)多级队列反馈调度:

#defineNULL0

#defineMAL(type)(type*)malloc(sizeof(type))

usingnamespacestd;

typedefstructLNode

{charname[5];

intruntime;

intneedtime;

structLNode*next;

}LNode;

LNode*pcb;

intT,D,J;

voidprint()

{LNode*p=pcb;

\n进程名需执行时间已执行时间状态\n"

for(inti=0;

i<

J;

i++)

{printf("

%s%10d%10d%c\n"

p->

name,p->

needtime,p->

runtime,p->

p=p->

system("

PAUSE"

voidinput()

{inti;

请输入进程数:

J);

for(i=0;

{LNode*p,*q;

q=MAL(LNode);

\n请输入第%d个进程的进程名:

i+1);

q->

请输入第%d个进程需要的执行时间:

needtime);

if(q->

needtime<

=0)

所需时间要大于0\n请重新输入——\n"

i--;

else

{q->

runtime=0;

q->

state='

N'

next=NULL;

if(i==0)

pcb=p=q;

{p->

next=q;

p=q;

\n进程初始化态为:

print();

voidrun()

{inti,time=0,l=1;

\n请输入队列个数:

D);

\n请输入第一个队列的时间片长度:

T);

=J;

{intk=1;

LNode*p,*q;

if(i<

J){time=l*T;

l=l*2;

elsei--;

p=pcb;

while(p!

=NULL)

{if(p->

state=='

Y'

){p=p->

continue;

runtime=p->

runtime+time;

=p->

runtime)

if(p->

needtime==p->

p->

}

needtime;

if(p->

)printf("

\n进程%s已运行完毕!

for(q=pcb;

q!

=NULL;

q=q->

next)

{if(q->

){k=0;

break;

if(k==1)break;

elseprint();

intmain()

{input();

run();

所有进程执行完成!

return0;

六、结果过程及截图

七、思考题

1、分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。

答:

动态有限权算法:

动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。

处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。

时间片的轮转法:

系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。

每运行一次,进程的需要时间减1,直到就绪队列为空!

八、实验总结

(1)虽然实验原理很简单,但是在编写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。

(2)在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。

(3)通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。

实验二作业调度

本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。

1、为单道批处理系统设计一个作业调度程序

(1)、编写并调试一个单道处理系统的作业调度模拟程序。

(2)、作业调度算法:

分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。

先来先服务就是每次调度都是从后备作业队列中,选择一个最先进入该队列的作业,将它调入内存,为它分配资源、创建进程,然后放入就绪队列,投入运行,一直运行到完成或发生某事件而阻塞后,才放弃处理。

最短作业优先是从后备队列中选择一个估计运行时间最短的作业,将它调入内存运行并一直执行到完成,或发生某事件而被阻塞放弃处理时,再重新调度。

响应比高者优先是通过计算出作业的响应比,按响应比高而进行调度的,其计算公式是:

优先权=(等待时间+要求服务时间)/要求服务时间.

(3)、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。

(4)、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:

作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。

每个作业的最初状态总是等待W。

(5)、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。

1、实验原理

先来先服务算法:

是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业,那么顺序挑选后面的作业。

FCFS算法简单易行,但性能却不大好。

短作业优先算法:

总是按照作业要求运行时间来选择作业,每次挑选要求作业执行时间短且资源要求能满足的作业优先分派处理机,通常后来的短作业不抢先正在执行的作业。

SJF改善平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量,但对长作业非常不利。

响应比高者优先算法:

最高响应比优先法(HRN,HighestResponse_ratioNext)是对FCFS方式和SJF方式的一种综合平衡。

FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。

因此,这两种调度算法在某些极端情况下会带来某些不便。

HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。

  响应比R定义如下:

R=(W+T

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

当前位置:首页 > 高等教育 > 其它

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

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