操作系统系统实验指导书.docx

上传人:b****0 文档编号:18332641 上传时间:2023-08-15 格式:DOCX 页数:57 大小:39.03KB
下载 相关 举报
操作系统系统实验指导书.docx_第1页
第1页 / 共57页
操作系统系统实验指导书.docx_第2页
第2页 / 共57页
操作系统系统实验指导书.docx_第3页
第3页 / 共57页
操作系统系统实验指导书.docx_第4页
第4页 / 共57页
操作系统系统实验指导书.docx_第5页
第5页 / 共57页
操作系统系统实验指导书.docx_第6页
第6页 / 共57页
操作系统系统实验指导书.docx_第7页
第7页 / 共57页
操作系统系统实验指导书.docx_第8页
第8页 / 共57页
操作系统系统实验指导书.docx_第9页
第9页 / 共57页
操作系统系统实验指导书.docx_第10页
第10页 / 共57页
操作系统系统实验指导书.docx_第11页
第11页 / 共57页
操作系统系统实验指导书.docx_第12页
第12页 / 共57页
操作系统系统实验指导书.docx_第13页
第13页 / 共57页
操作系统系统实验指导书.docx_第14页
第14页 / 共57页
操作系统系统实验指导书.docx_第15页
第15页 / 共57页
操作系统系统实验指导书.docx_第16页
第16页 / 共57页
操作系统系统实验指导书.docx_第17页
第17页 / 共57页
操作系统系统实验指导书.docx_第18页
第18页 / 共57页
操作系统系统实验指导书.docx_第19页
第19页 / 共57页
操作系统系统实验指导书.docx_第20页
第20页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统系统实验指导书.docx

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

操作系统系统实验指导书.docx

操作系统系统实验指导书

《计算机操作系统》

实验指导书

计算机科学与软件学院

实验一Windows任务管理器的进程管理练习

一、预备知识

Windows操作系统的相关知识。

二、目的

1.使学生熟悉1或2种操作系统的接口,能熟练地在1或2种操作系统环境下工作,主动而有效地使用计算机。

2.通过在Windows任务管理器中对程序和进程进行响应的管理操作,熟悉操作系统进程管理的概念。

三、要求

1.要求学生了解各种操作的命令、系统调用及实用程序的功能,掌握它们的用法,利用操作系统提供的各种手段完成多项上机任务,而且要尽可能多地使用操作系统各种接口功能的操作命令。

2.任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位,学习观察操作系统运行的动态性能。

四、实验内容

启动并进入Windows环境,打开“任务管理器”窗口,查看正在运行的进程状态。

1.使用任务管理器终止程序。

2.显示其他进程计数器。

3.更改正在运行的进程的优先级。

4.使用多个参数评估正在运行的进程的活动。

5.查看CPU和内存使用情况的图形和数据。

(终止进程时要小心,有可能导致不希望发生的结果,包括数据丢失和系统不稳定等。

实验二批处理系统的作业调度

一、目的

1.加深对作业概念的理解。

2.深入了解批处理系统如何组织作业、管理作业和调度作业。

二.要求

1.掌握批处理系统作用调度中主要数据结构的设计。

2.熟悉先来先服务算法、短作业优先算法、高响应比优先等算法的实施过程。

三、实验内容

编写程序完成批处理系统中的作业调度。

设计具体包括:

(1)确定作业控制块的内容和组成方式;

(2)完成作业调度功能(可选择其中一种算法);

(3)编写代码对所做工作进行测试。

实验三进程调度模拟程序

本实验可采用优先数调度算法或时间片轮转算法或两者相结合进行模拟程序的设计。

一、预备知识

1.进程管理。

2.优先数调度算法、时间片轮转算法。

二、目的

1.加深对进程、进程控制块及进程队列等概念的理解。

2.了解优先数和时间片轮转调度算法的具体实施办法,加深对进程管理各部分内容的理解。

三.要求

1.掌握进程管理中主要数据结构的设计。

2.熟悉进程调度算法、进程控制机构、同步机构、通讯机构的实施。

四、实验内容(可按实际情况选择以下列出的1个题目)

1.设计一个采用优先数调度算法的模拟进程调度程序。

2.设计一个采用时间片轮转调度算法的模拟进程调度程序。

3.进程调度模拟程序的设计(包括至少2种调度算法)。

要求如下:

(1)设计进程控制块PCB表结构,分别适用于优先权调度算法和时间片轮转调度算法。

PCB结构包括以下信息:

进程名、进程优先数(或轮转时间片),进程所占用的CPU时间,进程的状态,当前队列指针等。

根据调度算法的不同,PCB结构的内容可以作适当的增删。

(2)建立进程就绪队列。

对两种不同算法编制入链子程序。

(3)设计的程序中能显示或打印进程控制块的动态变化过程。

实验四生产者――消费者问题算法的实现

一、预备知识

1.进程管理。

2.信号量的有关知识。

二、目的

1.了解信号量的使用。

2.加深对信号量机制的理解。

三、要求

1.理解生产者与消费者问题模型,掌握解决该问题的算法思想。

2.掌握正确使用同步机制的方法。

四、实验内容

1.问题描述:

一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。

假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池,只要缓冲池未空,消费者可从缓冲池取走一个消息。

2.功能要求:

根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。

实验五银行家算法的实现

一、预备知识

1.死锁的相关知识。

2.银行家算法。

3.系统安全性检查。

二、目的

1.加深了解有关资源申请、避免死锁等概念。

2.体会和了解死锁和避免死锁的具体实施方法。

三、要求

1.理解死锁的概念以及产生死锁的原因。

2.了解检测状态安全性的方法。

3.掌握利用银行家算法避免死锁的做法。

四、实验内容

银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。

1.设计进程对各类资源最大申请表示及初值的确定。

2.设定系统提供资源的初始状况。

3.设定每次某个进程对各类资源的申请表示。

4.编制程序,依据银行家算法,决定其资源申请是否得到满足。

5.显示资源申请和分配时的变化情况。

实验六采用可变分区存贮器管理方案的模拟系统

一、预备知识

1.存储管理的相关知识。

2.存贮器分配算法的相关知识。

二、目的

1.熟悉存贮器管理系统的设计方法。

2.加深对所学各种存贮器管理方案的了解。

三、要求

1.要求采用一些常用的存贮器分配算法,设计一个存贮器管理模拟系统并调试运行。

2.模拟环境应尽量接近真实。

四、实验内容

1.问题描述

该系统模拟可变分区存贮器管理方案,存贮分配算法采用首次适应法,用“拼接”和“搬家”技术来处理存贮器碎片。

2.数据结构

(1)自由链与区头。

内存空区采用自由链结构。

链首由指针freep指向,链中各空区按地址递增次序排列。

初启时整个用户内存区为一个大空区。

在每个空区首部设置一个区头(freearea)结构。

区头信息包括:

size空区大小(以字节计),包括区头所占空间;

next前向链指针,指向下一个空区;

back反向链指针,指向上一个空区;

address本空区首地址。

(2)内存分配表MAT。

系统设置一个MAT,每个运行作业都在MAT中占有一个表目,回收分区时清除相应表目。

表目信息包括:

name用户作业名;

length作业区大小:

addr作业区首地址。

3.算法

(1)存贮分配算法采用首次适应(FF)法。

根据指针freep查找自由链,当找到第一块可满足分配请求的空区时便分配之。

当某空区被分配后的剩余空闲空间大于规定的碎片最小容量min时,则形成一个较小的空区留在自由链中。

(2)回收时,根据MAT将指定分区链入自由链。

若该分区有前邻或后邻分区,则将它们拼接成一块较大的空区。

(3)当某个分配请求不能被满足,但此时系统中所有碎片总容量满足分配请求的容量时,系统立即进行内存“搬家”以消除碎片。

即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连续的作业区,而在用户内存区的上部形成一块较大的空区。

然后再进行分配。

实验七页式虚拟存储管理中地址转换和缺页中断的实现

一、预备知识

1.深入了解页式存储管理如何实现地址转换。

2.进一步认识页式虚拟存储管理中如何处理缺页中断。

二、目的

1.页式存储管理中地址转换的方法。

2.页式虚拟存储的缺页中断处理方法。

三、要求

1.采用页式虚拟存储管理常用的算法,设计一个虚拟存贮器管理模拟系统。

2.模拟环境应尽量接近真实。

四、实验内容

编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。

设计具体包括:

①对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理;

②进行地址转换;

③编写代码对所做工作进行测试。

实验八采用二级目录结构的文件系统模型的实现

一、预备知识

1.文件的操作。

2.文件的逻辑结构和物理结构。

3.磁盘空间的管理。

4.磁盘目录结构。

二、目的

全面理解文件系统的体系结构、文件目录结构以及文件的基本操作。

通过本设计,掌握文件系统的基本思想和实现方法。

三、要求

设计和调试一个简单的文件系统,采用二级或以上的多级文件目录管理,系统的外部特性应尽可能接近真实系统。

四、实验内容

l.问题描述

设计一个支持多个(如5个)用户的文件系统。

每个用户可保存多个文件,系统采用二级文件目录,设置主文件目录(MFD)和用户文件目录(UPD),并为打开文件设置活动文件目录(AFD)。

系统允许同时打开多个(如5个)文件。

文件操作命令设置有:

建立文件、打开文件、关闭文件、撤销文件、查询目录等。

2.数据结构

主要的文件管理数据结构有:

(1)主文件目录MFD,目录项内容有:

username用户名(≤6个字符);

link用户文件目录指针。

(2)用户文件目录UFD,目录项内容有:

filename文件名(≤6个字符),

pcode存取控制保护码;

length文件长度;

addr文件空间首地址;

next指向本UFD的下一个目录项的指针。

(3)活动文件目录AFD,目录项内容有:

filename打开文件名;

pcode存取控制保护码;

rpointer读指针,指向当前的读位置;

wpointer写指针,指向当前的写位置;

addr文件空间首地址;

next指针,指向AFD的下一个目录项。

其中,pcode=p1p2p3为3位代码,分别对应允许读、允许写及允许执行。

pi=1为允许,pi=0为不允许。

3.算法

文件目录检索采用简单的线性搜索。

可采用二级目录结构,但为实现起来简单,对文件的访问可以不用严格按路径名进行,要求不同用户的文件不能重名。

 

部分程序范例

范例1批处理系统的作业调度

一、实验内容

编写程序完成批处理系统中的作业调度,采用响应比高者优先的作业调度算法。

设计具体包括:

(1)确定作业控制块的内容和组成方式。

(2)完成作业调度功能。

二、设计思想、设计分析及数据结构模型

本设计只是一个简单的模拟过程,重点考虑进程(或称作业)的调度问题。

对于进程信息的保存使用了以下结构体:

structJOB{

intname;//进程唯一ID或名称,程度模拟中使用大写字母A~Z

intcomeTime;//进程到达的时间

intserverTime;//进程要求的服务时间

intwaitTime;//进程已等待的时间

};

由于是作简单的模拟,程序只使用以下语句定义的100个进程数据。

#defineMAX100

JOBjob[MAX];

对进程状态的初始化,程序使用了从文件(job.txt)读入的方式。

格式为每组两个int变量,第一个为进程到太时刻,第二个为要求服务时间!

其中一个测试文件(job.txt)内容为:

04

1100

15

3100

200300

1507

测试数据简单说明:

1时刻进入两个作业,要求服务时间不分别为100与5,用于测试短服务优先;150时刻的进程来比较慢,在此之处理机已空闲,故无需等待时间。

三、参考程序

#include

#include

#include

staticchars_name='A';

structJOB{

intname;

intcomeTime;

intserverTime;

intwaitTime;

intlevel;

job(){//结构体初始化函数

name=-1;

comeTime=0;

serverTime=0;

waitTime=0;

}

};

#defineMAX100///一百个进程单位,可适量增加

JOBjob[MAX];

///排序函数,其为作业调度函数。

///参数:

为两个JOB指针

///功能:

该比较函数提供给快速排序使用,排序后按响应比值低到高排好序

intmyCmp(constvoid*a,constvoid*b)

{

JOB*p1=(JOB*)a;

JOB*p2=(JOB*)b;

doublepower1=(double)(p1->serverTime+p1->waitTime)/p1->serverTime;

doublepower2=(double)(p2->serverTime+p2->waitTime)/p2->serverTime;//响应级比值

if(power1>power2)return1;

if(power1

if(p1->comeTime>p2->comeTime)return-1;//响应级比值相同的情况下

if(p1->comeTimecomeTime)return1;//先来先服务排序

if(p1->serverTime>p2->serverTime)return-1;//响应级比值相同且同时到来情况

if(p1->serverTimeserverTime)return1;//短服务优先

return0;

}

////打印进程队列状态

voidprint(intn,inttimer)

{

printf("On%dtime,RunningJobIDis%c,ithaswaitted%dtimes.\n",timer,job[n].name,job[n].waitTime);

printf("thestatsofalljobsintheqeueuewiibe:

\n");

cout<<"____________________________________"<

printf("︱JobID︱Come︱Server︱Waitted\n");

for(inti=n;i>=0;i--)

{

printf("︱%c\t︱%d\t︱%d\t︱%d\t\n",job[i].name,job[i].comeTime,job[i].serverTime,job[i].waitTime);

}

cout<<" ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<

system("PAUSE");cout<

}

 

///主函数

intmain()

{

ifstreamin("job.txt");

intn=0;

inttimer=0;

while(!

in.eof())

{

in>>job[n].comeTime>>job[n].serverTime;

job[n].name=s_name+n++;

}

qsort(job,n,sizeof(JOB),myCmp);

timer=job[n-1].comeTime;

while(n--)

{

for(inti=0;i

{

if(job[n].serverTime+timer>job[i].comeTime)

job[i].waitTime=job[n].serverTime+timer-job[i].comeTime;

}

print(n,timer);

qsort(job,n,sizeof(JOB),myCmp);

timer+=job[n].serverTime;

}

return0;

}///endmain

 

范例2进程调度模拟程序

一、实验内容

1.选用优先数算法/轮转法对五个进程进行调度,每个进程可有三种状态:

R——运行状态(RUN);W——就绪状态(READY)和F——完成状态(FINISH)。

并假定初始状态为就绪状态。

2.进程控制块结构如下:

设计进程控制块PCB表结构,分别适用于优先权调度算法和时间片轮转调度算法。

PCB结构包括以下信息:

进程名、进程优先数(或轮转时间片),进程所占用的CPU时间,进程的状态,当前队列指针等。

根据调度算法的不同,PCB结构的内容可以作适当的增删。

PCB结构:

NAME——进程标识符;

PRIO——进程优先数;

CPUTIME——进程占用CPU时间;

NEEDTIME——进程到完成还需要的CPU时间;

STATE——进程的状态;

NEXT——链指针。

3.在每次运行调度程序之前,为每个进程任意确定它的“优先数”和“需要运行的时间数”,五个进程按给定的优先数从大到小连成队列,调度总是选队首进程运行。

4.采用动态改变优先数的办法。

本实验是模拟进程调度程序,被选中的进程并不实际启动运行,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。

在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排到就绪队列的尾上。

5.被选中运行的进程,进程状态置为“R”,进程运行一次后,若需要运行时间≠0,进程从运行状态变为就绪状态,状态置为“W”,并按优先数大小插入到队列中,若需要运行时间=0,则把它的状态置为完成状态(F)。

6.若“就绪”状态的进程队列不为空,则重复上面的(4)、(5)执行步骤,直到所有进程运行完毕(都为“完成”状态)。

7.设计的程序中能显示或打印进程控制块的动态变化过程。

二、源程序

#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;/*进程数*/

/*将就绪队列中的第一个进程投入运行*/

voidfirstin()

{

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)/*进程PCB输出*/

{

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();/*按任意键继续*/

}

voidinsert1(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;

}

}

voidinsert2(PCB*p2)/*轮转法插入函数*/

{

tail->next=p2;/*将新的PCB插入在当前就绪队列的尾*/

tail=p2;

p2->next=NULL;

}

voidcreate1(charalg)/*优先数创建初始PCB信息*/

{

PCB*p;

inti,time;

charna[10];

ready=NULL;/*就绪队列头指针*/

finish=NULL;/*完成队列头指针*/

run=NULL;/*运行队列指针*/

printf("Enternameandtimeofprocess\n");/*输入进程标识和所需时间创建PCB*/

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

{

p=(PCB*)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*/

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

当前位置:首页 > 总结汇报

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

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