《操作系统》实验指导书Word文档格式.docx

上传人:b****8 文档编号:22275370 上传时间:2023-02-03 格式:DOCX 页数:36 大小:47.10KB
下载 相关 举报
《操作系统》实验指导书Word文档格式.docx_第1页
第1页 / 共36页
《操作系统》实验指导书Word文档格式.docx_第2页
第2页 / 共36页
《操作系统》实验指导书Word文档格式.docx_第3页
第3页 / 共36页
《操作系统》实验指导书Word文档格式.docx_第4页
第4页 / 共36页
《操作系统》实验指导书Word文档格式.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

《操作系统》实验指导书Word文档格式.docx

《《操作系统》实验指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《《操作系统》实验指导书Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。

《操作系统》实验指导书Word文档格式.docx

程序开始运行后,首先提示:

请用户选择算法,输入进程名和相应的NEEDTIME值。

每次显示结果均为如下5个字段:

namecputimeneedtimeprioritystate

1.在state字段中,"

R"

代表执行态,"

W"

代表就绪(等待)态,"

F"

代表完成态。

2.应先显示"

态的,再显示"

态的。

3.在"

态中,以优先数高低或轮转顺序排队;

在"

态中,以完成先后顺序排队。

实验二存储管理动态分区分配及回收算法

分区管理是应用较广泛的一种存储管理技术。

本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并讨论不同分配算法的特点。

1、编写:

FirstFitAlgorithm

2、编写:

BestFitAlgorithm

3、编写:

空闲区回收算法

(一)主程序

1、定义分区描述器node,包括3个元素:

(1)adr——分区首地址

(2)size——分区大小

(3)next——指向下一个分区的指针

2、定义3个指向node结构的指针变量:

(1)head1——空闲区队列首指针

(2)back1——指向释放区node结构的指针

(3)assign——指向申请的内存分区node结构的指针

3、定义1个整形变量:

free——用户申请存储区的大小(由用户键入)

(二)过程

1、定义check过程,用于检查指定的释放块(由用户键入)的合法性

2、定义assignment1过程,实现FirstFitAlgorithm

3、定义assignment2过程,实现BestFitAlgorithm

4、定义acceptment1过程,实现FirstFitAlgorithm的回收算法

5、定义acceptment2过程,实现BestFitAlgorithm的回收算法

6、定义print过程,打印空闲区队列

(三)执行

程序首先申请一整块空闲区,其首址为0,大小为32767;

然后,提示用户使用哪种分配算法,再提示是分配还是回收;

分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。

(四)输出

要求每执行一次,输出一次空闲区队列情况,内容包括:

编号首址终址大小

输出空闲区队列的排序,应符合所用分配算法的要求。

附录1:

实验报告模版

课程名称分院班组桌号

实验者姓名实验日期年月日

评分教师签名

一、实验目的

通过……,了解……,体会……,掌握……,提高……。

二、实验要求

……。

三、实验过程

1.准备

A.查阅相关资料;

B.初步编写程序;

C.准备测试数据;

D.……。

2.上机调试

3.主要流程和源代码

4.遇到的主要问题和解决方法

A.……;

B.……。

四、实验结果

五、实验总结

通过本次实验,我学到了……,了解了……,掌握了……,提高了……。

附录2:

实验教学大纲

《操作系统(A)》实验教学大纲

课程编号:

0901020

计划学时:

12

面向专业:

计算机科学与技术专业

制订:

计算机软件教研室

执笔人:

崔来堂

审定人:

邸书灵

一、课程性质、目的及任务

《操作系统》是计算机科学与技术专业的一门学位课。

《操作系统》课程理论性强,较抽象,难以理解和接受。

因此,有必要加强实验环节。

通过上机编程,模拟操作系统对计算机资源管理的主要策略和算法,从而有效地加深学生对所学理论知识的理解和掌握,提高学生的系统开发能力和应用开发能力。

二、主要参考书

1、《计算机操作系统》张尧学等清华大学出版社2000.8

2、《计算机操作系统》刘乃琦等电子工业出版社2003.5

3、《计算机操作系统》汤子瀛西安电子科技大学出版社2003.3

4、《计算机操作系统》庞丽萍等华中理工大学出版社2000.12

三、考试考核办法

根据考勤、实验检查及实验报告等综合考虑给定。

四、实验项目与内容提要

序号

实验项目名称

实验内容

提要

实验

性质

实验者

类别

学时

开设

组数

每组

人数

消耗

(元/人时)

主要仪器设备

名称及配套数

1

处理机调度编程

模拟处理机调度算法

验证

演示

设计

综合

研究生

微机、windows/unix/linux、

TC/VB/Dephi

本科生

6

70

专科生

2

存储管理编程1

模拟内存的分区管理

演示

设计

综合

3

存储管理编程2

(选作)

模拟内存的页式管理

实验一源代码

#include<

stdio.h>

stdlib.h>

string.h>

#include<

windows.h>

/*进程控制块数据结构*/

typedefstructnode

{

charname[10];

/*进程名*/

intprio;

/*进程优先级*/

intround;

/*循环轮转法进程每次轮转的时间片*/

intcputime;

/*进程累计消耗的CUP时间*/

intneedtime;

/*进程到完成还需要的CUP时间*/

intcount;

/*循环轮转法一个是时间片内进程运行时间*/

charstate;

/*进程的状态:

'

R'

:

运行,'

W'

等待,'

F'

结束*/

structnode*next;

/*指向下一个进程的链指针*/

}PCB;

PCB*finish,*ready,*tail,*run;

/*指向三个队列的队首的指针,

finish为完成队列头指针,

ready为就绪队列头指针,

tail为就绪队列的队尾指针,

run为当前运行进程头指针*/

intN;

/*定义进程的数目*/

voidfirstin(void);

//调度就绪队列的第一个进程投入运行;

voidprint1(chara);

//打印表头行信息

voidprint2(charchose,PCB*p);

//打印每一行的状态信息

voidprint(charchose);

//打印每执行一次算法后所有的进程的状态信息

voidinsert_prio(PCB*q);

//在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;

voidprior_init(charchose);

//进程优先级法初始化将进程按优先级插入到就绪队列里

voidpriority(charchose);

//进程优先级算法总函数

voidinsert_rr(PCB*q);

//在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;

voidroundrun_init(charchose);

//循环轮转法初始化将就绪队列保存为FIFO队列

voidroundrun(charchose);

//循环轮转法总算法

voidmain()//主函数

charchose='

'

;

while((chose!

='

q'

)&

&

(chose!

Q'

))

{

fflush(stdin);

printf("

选择进程优先级算法请输入P,选择循环轮转算法请输入R,退出请输入Q\n"

);

请输入你的选择:

"

scanf("

%c"

&

chose);

if((chose!

{

system("

cls"

if((chose=='

P'

)||(chose=='

p'

{

prior_init(chose);

priority(chose);

system("

}

elseif((chose=='

r'

roundrun_init(chose);

roundrun(chose);

}

}

}

printf("

谢谢使用!

\n"

}

voidfirstin(void)//调度就绪队列的第一个进程投入运行;

if(ready!

=NULL)

run=ready;

ready=ready->

next;

run->

state='

next=NULL;

else

run=NULL;

voidprint1(chara)//打印表头行信息

if(toupper(a)=='

printf("

namecputimeneedtimeprioritystate\n"

else

namecputimeneedtimecountroundstate\n"

}

voidprint2(charchose,PCB*p)//打印每一行的状态信息

if(toupper(chose)=='

printf("

%s\t%d\t%d\t%d\t%c\n"

p->

name,p->

cputime,p->

needtime,p->

prio,p->

state);

%s\t%d\t%d\t%d\t%d\t%c\n"

count,p->

round,p->

voidprint(charchose)//打印每执行一次算法后所有的进程的状态信息

PCB*p;

print1(chose);

if(run!

print2(chose,run);

p=ready;

while(p!

print2(chose,p);

p=p->

p=finish;

print2(chose,p);

p=p->

voidinsert_prio(PCB*q)/*在优先数算法中,将尚未

完成的PCB按优先数顺序插入到就绪队列中;

*/

PCB*p,*s,*r;

/*p,r用来控制就绪队列滚动,S指向插入的队列*/

s=q;

r=p;

if(s->

prio>

ready->

prio)//要插入的进程的优先级大于ready的优先级

s->

next=ready;

ready=s;

else//要插入的进程的优先级不大于ready的优先级

while(p)

if(p->

=s->

prio)

r=p;

p=p->

else

break;

}//找到要插入的位置

s->

next=p;

r->

next=s;

voidprior_init(charchose)/*进程优先级法初始化

将进程按优先级插入到就绪队列里*/

PCB*p;

inti,time;

charna[10];

ready=NULL;

finish=NULL;

run=NULL;

输入进程的个数N:

%d"

N);

for(i=0;

i<

N;

i++)

p=(PCB*)malloc(sizeof(PCB));

输入第%d个进程名\n"

i+1);

scanf("

%s"

na);

完成进程需要的时间片数\n"

time);

strcpy(p->

name,na);

p->

cputime=0;

needtime=time;

prio=50-time;

//设置进程优先值初值

if(ready==NULL)

ready=p;

ready->

insert_prio(p);

当前就绪队列的进程的信息\n"

print(chose);

%d个进程已按优先级从高到低进到就绪队列中\n"

N);

printf("

按回车键开始模拟优先级算法.....\n"

fflush(stdin);

getchar();

firstin();

voidpriority(charchose)//进程优先级算法总函数

inti=1;

while(run!

cputime+=1;

needtime-=1;

prio-=1;

if(run->

needtime==0)

next=finish;

finish=run;

prio=0;

firstin();

if((ready!

=NULL)&

(run->

prio<

prio))

run->

insert_prio(run);

run=NULL;

firstin();

print(chose);

getchar();

voidinsert_rr(PCB*q)//在轮转法中,将执行了一个时间片单位(为2),

//但尚未完成的进程的PCB,插到就绪队列的队尾;

tail->

next=q;

tail=q;

q->

voidroundrun_init(charchose)/*循环轮转法初始化

将就绪队列保存为FIFO队列*/

inti,time;

charna[10];

ready=NULL;

finish=NULL;

run=NULL;

\t\t循环轮转算法模拟全过程\n\n"

scanf("

count=0;

round=2;

if(ready!

insert_rr(p);

p->

tail=p;

%d个进程已按FIFO进到就绪队列中\n"

按回车键开始模循环轮转算法.....\n"

run=ready;

ready=ready->

run->

voidroundrun(charchose)//循环轮转法总算法

count+=1;

}

if(run->

count==run->

round)

{

insert_rr(run);

实验二源代码

#defineMAX_SIZE32767

typedefstructnode//定义分区描述器的结构

intid;

//编号

intadr;

//分区首地址

intsize;

//分区大小

//指向下一个分区的指针

}Node;

Node*head1,*head2,*back1,*back2,*assign;

/*head--空闲区队列首指针

back--指向释放区Node结构的指针

assign-指向申请的内存分区Node结构的指针*/

intrequest;

//用户申请存储区的大小(由用户输入)

intcheck(intadd,intsiz,charc)//用于检查指定的释放块(由用户键入)的合法性

Node*p,*head;

intcheck=1;

if(add<

0||siz<

0)

check=0;

/*地址和大小不能为负*/

if(c=='

f'

||c=='

head=head1;

head=head2;

p=head->

while((p!

check)/*地址不能和空闲区表中结点出现重叠*/

if(((add<

adr)&

(add+siz>

adr))||((add>

=p->

(add<

adr+p->

size)))

check=0;

if(check==0)

\t输入释放区地址或大小有错误\n"

returncheck;

/*返回检查结果*/

voidinit()//初始化,生成两个带头节点的空闲队列指针,

{//head1指向first-fit的空闲队列头,head2指向best-fit的空闲队列头

Node*p;

head1=(Node*)malloc(sizeof(Node));

head2=(Node*)malloc(sizeof(Node));

p=(Node*)malloc(sizeof(Node));

head1->

next=

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

当前位置:首页 > 高中教育 > 高考

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

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