操作系统实验指导书.docx

上传人:b****7 文档编号:25109436 上传时间:2023-06-05 格式:DOCX 页数:25 大小:59.79KB
下载 相关 举报
操作系统实验指导书.docx_第1页
第1页 / 共25页
操作系统实验指导书.docx_第2页
第2页 / 共25页
操作系统实验指导书.docx_第3页
第3页 / 共25页
操作系统实验指导书.docx_第4页
第4页 / 共25页
操作系统实验指导书.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

操作系统实验指导书.docx

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

操作系统实验指导书.docx

操作系统实验指导书

操作系统

 

河南科技大学计算机实验教学中心

目录

实验一进程控制与处理机调度综合实验1

实验二 存储管理与页面置换算法6

实验三文件系统11

实验一进程控制与处理机调度综合实验

一、实验目的

通过模拟进程控制方法及单处理机系统的进程调度,了解进程的结构,进程的创建与撤消,进程的组织及进程的状态及其转换,掌握进程调度策略。

二、实验环境

基本编程环境为VC++。

三、实验内容

本实验为单机模拟进程调度算法,在程序设计时不需真正地建立线程或者进程。

实验模拟创建若干进程(人为输入或随机数产生),选择一种或几种单处理机的进程调度算法,如FCFS(先来先服务),SPF(短进程优先),RR(时间片轮转法),优先级算法等,模拟进行进程调度。

每进行一次调度,都打印一次运行进程、就绪队列、以及各个进程的PCB,并能在进程完成后及时撤消该进程。

四、算法描述

1进程及进程的运行状态

进程是现代计算机中的基本要素,是系统分配资源和调度的基本单位。

进程与程序不同,进程是系统中动态的实体,有它的创建、运行和撤销的过程。

PCB块是系统感知进程存在的唯一实体。

进程的创建必须首先创建进程的PCB块,而进程的运行也伴随着PCB块的变化,进城撤销也要同时撤销它的PCB块。

所以本实验的任务就是通过模拟调度进程的PCB块来调度进程。

进程的PCB块包含以下四方面的内容:

a)进程标示符

b)处理及状态信息

c)进程调度信息

d)进程控制信息

进程在运行中存在三种基本状态,分别是运行状态、就绪状态和阻塞状态。

2进程调度

一个运行进程的时间片用完或发生阻塞时,系统就会选择一个就绪进程调度执行。

进程的调度算法有很多,如FCFS、SPF、优先级调度和时间片轮转方法。

进程调度算法模拟实验就是通过调度进程的PCB块来模拟调度进程。

在系统中PCB块就表现为一个结构体,PCB块之间的连接方式存在两种,一种是链接方式,一种是索引方式。

本实验中可选择任意一种连接方式。

3例程

设计一个有N个进程共行的进程调度程序。

进程调度算法:

采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)。

每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:

进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

调度算法的流程图如下:

图1-1流程图

五、参考程序

#include"stdio.h"

#include

#include

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

#defineNULL0

structpcb{/*定义进程控制块PCB*/

charname[10];

charstate;

intsuper;

intntime;

intrtime;

structpcb*link;

}*ready=NULL,*p;

typedefstructpcbPCB;

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

{

pcb*first,*second;

intinsert=0;

if((ready==NULL)||((p->super)>(ready->super)))//优先级最大者,插入队首

{

p->link=ready;

ready=p;

}

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

{

first=ready;

second=first->link;

while(second!

=NULL)

{

if((p->super)>(second->super))//若插入进程比当前进程优先数大

{

p->link=second;

first->link=p;

second=NULL;

insert=1;//插入到当前进程前面

}

else

{

first=first->link;

second=second->link;

}

}

if(insert==0)

first->link=p;

}

}

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

{

inti,num;

printf("\n请输入进程数量?

");

scanf("%d",&num);

for(i=0;i

{

printf("\n进程号No.%d:

\n",i);

p=getpch(PCB);

printf("\n输入进程名:

");

scanf("%s",p->name);

printf("\n输入进程优先数:

");

scanf("%d",&p->super);

printf("\n输入进程运行时间:

");

scanf("%d",&p->ntime);

printf("\n");

p->rtime=0;p->state='w';

p->link=NULL;

sort();/*调用sort函数*/

}

}

intspace()

{

intl=0;PCB*pr=ready;

while(pr!

=NULL)

{

l++;

pr=pr->link;

}

return(l);

}

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

{

printf("\nqname\tstate\tsuper\tndtime\truntime\n");

printf("|%s\t",pr->name);

printf("|%c\t",pr->state);

printf("|%d\t",pr->super);

printf("|%d\t",pr->ntime);

printf("|%d\t",pr->rtime);

printf("\n");

}

voidcheck()/*建立进程查看函数*/

{

PCB*pr;

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

%s",p->name);/*显示当前运行进程*/

disp(p);

pr=ready;

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

\n");/*显示就绪队列状态*/

while(pr!

=NULL)

{

disp(pr);

pr=pr->link;

}

}

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

{

printf("\n进程[%s]已完成.\n",p->name);

free(p);

}

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

{

(p->rtime)++;

if(p->rtime==p->ntime)

destroy();/*调用destroy函数*/

else

{

(p->super)--;

p->state='w';

sort();/*调用sort函数*/

}

}

voidmain()/*主函数*/

{

intlen,h=0;

charch;

input();

len=space();

while((len!

=0)&&(ready!

=NULL))

{

ch=getchar();

h++;

printf("\nTheexecutenumber:

%d\n",h);

p=ready;

ready=p->link;

p->link=NULL;

p->state='R';

check();

running();

printf("\n按任一键继续......");

ch=getchar();

}

printf("\n\n进程已经完成.\n");

ch=getchar();

}

完成上述实验示例程序,按照优先级算法补充出sort()子程序的内容。

若修改优先数时增加下列原则:

进程等待的时间超过某一时限时增加其优先数,参考上述例程,写出程序。

六、选做题

完成FCFS或SPF算法。

七、思考题

编写一个多道程序系统的作业调度模拟程序,可采用任一调度算法。

对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

八、实验报告要求

实验报告应包含以下内容:

(1)实验题目

(2)实验目的

(3)实验环境

(4)算法描述

(5)程序源代码

(6)出现的问题

(7)对问题的解决方案

(8)实验结果与结果分析

(9)实验思考(学生对本次实验的收获的总结)

实验二 存储管理与页面置换算法

一、实验目的

通过模拟页式虚拟存储管理中地址转换和页面置换,了解页式虚拟存储管理的思想,掌握页式地址转换过程和缺页中断处理过程。

二、实验环境

基本编程环境为VC++

三、实验内容

单机模拟页式虚拟存储管理中地址转换和页面置换过程。

首先对页表进行初始化;输入要访问的逻辑地址(可为16进制或10进制),程序分离出逻辑地址的页号,查找页表,根据页表完成地址转换,输出转换后的地址;若缺页则提示中断发生,按某种页面置换算法(FIFO,LRU)进行页面置换,并修改和输出页表,输出绝对地址。

最后输出置换情况和缺页次数。

四、算法描述

1内存的分配和管理方案

在进程创建时必须为它分配一定的内存资源,内存资源的分配与管理有很多方法,从动态性分有静态的和动态的分配方法,从连续性上分有连续的和不连续的分配方案。

连续的分配方案是程序的执行速度加快但会使内存出现碎片而不能得到应用,而不连续的分配方案可以使内存碎片得到充分的应用,但由于访问内存次数的增多使程序执行的速度下降。

2内存的分配的过程

在作业执行前,向系统提供内存的请求表,在系统为作业创建进程时,要为进程分配内存资源。

以分页系统为例,系统首先确定进程需要的页面数量,然后顺序查找位图(系统为每一个页面分配一位内存中的各个页面组成一个数组,如果该位为1说明该位所指示的页正在被使用,如果该位为0说明该位指示的页面空闲)若存在所需要的空闲页面则此次分配成功,否则分配失败,若分配成功系统首先把分配出去的页面所属的位置为1,然后形成进程所需的页表。

3算法思想

本程序有两个功能:

一是地址转换;二是模拟页面置换情况。

(1)地址转换:

add_tran

将逻辑地址中的页号分离出来,查找页表,将查找到的块号与逻辑地址中的页内偏移量合成实际地址,若查找不到则产生缺页中断,按FIFO的方法置换页面。

(a)数据结构:

array[max][2]为页表,其中array[n][0]为页号,array[n][1]为块号,size_PT表示系统分配给进程的块数,即页表中的页数。

(b)地址转换算法思想

首先初始化页表:

输入分配的块数(页表的大小),然后输入初始页表中的页号和相对应的块号,初始化完成后程序输出初始化后的页表。

然后是地址转换:

输入16进制逻辑地址,程序分离出逻辑地址的页号,然后查找页表,若缺页则提示中断发生,并修改页表,然后输出转换后的地址,输出页表。

(c)执行情况

程序提示“pleaseinputsizeofthepagetable:

”,要求输入分配的块数s_PT,即页表的大小。

然后根据size_PT,循环输入初始化页表里的页号和对应的块号。

用j来表示下一个将会被置换的页面存放位置,初始指向页表中最后一个页面,按照(j+1)%size_PT循环。

然后程序输出页表情况:

页号和对应的块号。

至此初始化完成。

程序提示“inputtheaddersswantedtobetranslated(0exit):

”,要求输入要转换的逻辑地址。

程序分离出页号后查找页表,查找到则直接输出转换后的地址。

否则提示“intermittenceoccurred,pageAhasbeenreplacedwithpageB”。

(A代表被置换的页号,B代表置换后的页号。

)然后再输出转换后的地址(16进制)。

输出转换后的地址后,程序还把转换后的页表显示出来,可以清楚地了解页表是否被置换和置换情况。

(d)结果举例

设size_PT为3,初始化页表为Page:

1block:

2,page:

3block:

5,page:

6block:

3。

输入逻辑地址4ff(程序假设页面大小为1k即1024)。

则其页号为1,查找页表,不产生缺页中断,块号为2,则输出转换后的地址为8FF,页表不变。

输入逻辑地址81a,则其页号为2,查找页表,产生缺页中断,此时j指向page6,将page6置换为page2,块号为3。

则输出转换后的地址为c1a,页表变为Page:

1block:

2,page:

3,block:

5.page:

2block:

3。

置换后j变成(2+1)%size_PT:

0,指向页表中第一项page1。

(2)页面置换模拟:

page_si

(a)算法思想

输入页面序列,缺页时按FIFO的策略进行页面置换,输出置换情况和缺页次数。

假设页表大小不超过max,输入的页面数不超过max*lO。

(b)数据结构

arrayl[max]表示简化了的页表,只包含页号,array2[max*lO]存放页面序列。

size_PT表示分配给该进程的块数,size2表示页面序列长度。

page_rep指向下一个将被置换的页面,初始为O,指向页表的第一项。

Sum_int用来计算中断次数。

(c)程序执行流程

初始化:

输入分配的块数size_PT,然后对页表共size_PT项赋值-1,表示空。

输入页面序列,存放于数组array2中。

按照size2循环,依次查找页面是否存在于页表中,不存在则置换页面,page_rep初始为0,变化同上。

格式化依次输出访问下一个页面后的页表,然后输出缺页中断总次数。

(d)执行结果举例

输入size_PT为2

输入页面序列为1,3,5,4,5,-1(-1表示输入结束)

输出为1

13

53

54

54

therehasbeen4intermittencesoccurred

表示有4次中断发生

五、参考程序

#include“stdio.h”

#definemax100/*定义页面数组大小的上限*/

#definesize_pa1024

voidadd_tran()

{

intarray[max][2];/*页表,其中array[n][0]为页号,array[n][1]为块号*/

intsize_PT;

intno_page,no_block;/*no_page,no_block分别是页号和块号*/

intif_quit1;/*if_quit1退出子程序标志*/

inti,j;/*j表示下一个将被置换的页面位置*/

intadd_logic,add_sys;/*逻辑地址和绝对地址*/

intif_page;/*中断标志*/

if_quit1=0;/*退出标志*/

/*初始化页表*/

printf(“\npleaseinputsizeofthepagetable:

”);

scanf(“%d”,&size_PT);

j=size_PT-1;

printf(“\nnowinitializethepagetable,pleaseinputpagenumberandblocknumber\n”);

for(i=0;I=size_PT;i++){

printf(“pagenumber:

”)

scanf(“%d”,&no_page);

printf(“blocknumber:

”)

scanf(“%d”,&no_block);

array[i][0]=no_page;

array[i][1]=no_block;

}

printf(“initializingcomplete”);

/*输出初始化页表*/

printf(“\nPagetable:

\n”);

for(i=0;i

printf(“page:

%5d”,array[i][0]);

printf(“block:

%5d”,array[i][1]);

printf(“\n”);

}

printf(“\n”);

/*地址变换*/

{}

 

}

/*页面置换模拟:

输入页面序列,缺页时按FIFO的策略进行页面置换。

*/

/*输出置换情况,和缺页次数*/

/*假设页表大小不超过max,输入的页面数不超过max*1O*/,

/*程序执行流程:

*/

/*初始化:

输入分配的块数,输入页面序列*/

/*输出依次访问一个页面后的页表,然后输出缺页中断总次数*/

voidpage_si()

{

}

/**********主程序*************/

voidmain()

{

intif_quitO;/*if-quit0退出主程序标志*/

intn_func;

if_quit0=0;

while(if_quit0==0)

{

printf(“\npleaseinputnumberofthefunotionyouwanttoexecute\n”);

printf(“l--addresstranslating,2--pagesimulating,0--exit,”);

scanf(“%d”,&n_func);

if(n_func==1)add_tran();

if(n.func==2)page_si();

if(n_func==0)if_quitO=l;

}

}

按以上程序完善add_tran()函数中的地址变换过程,并补充完成页面置换算法的page_si()子程序。

六、选做题

编写一个段式存储管理的地址转换的模拟程序。

七、思考题

(1)怎样用LRU算法进行页面置换?

(2)在段页式存储管理中,如何实现地址转换?

八、实验报告要求

实验报告应包含以下内容:

(1)实验题目

(2)实验目的

(3)实验环境

(4)算法描述

(5)程序源代码

(6)出现的问题

(7)对问题的解决方案

(8)实验结果与结果分析

(9)实验思考(学生对本次实验的收获的总结)

实验三文件系统

一、实验目的

通过模拟文件系统的基本功能,掌握文件的物理结构和逻辑结构、目录结构。

二、实验环境

基本编程环境为VC++

三、实验内容

实验要求模拟建立一个文件系统,实现几种基本的文件命令:

查看目录中的所有文件,查看指定文件中的内容,删除某个文件,创建一个文件等。

程序使用单级目录结构形式,文件的组织方式使用顺序方式。

四、算法描述

1文件系统的分配和管理方案

文件系统的结构分为物理结构和逻辑结构,物理结构是文件中数据在磁盘中的组织方式,逻辑结构是文件系统在用户面前的表现形式。

系统中的文件分为两种,一个是目录文件一个是数据文件。

目录文件是一种有结构的文件,他的结构形式有操作系统规定,而数据文件在现在的操作系统中(UNIX或windows)都把它看作无结构的流式文件。

文件的逻辑结构有四种分别是顺序结构、索引结构、索引顺序结构和直接文件。

对于文件的物理结构有顺序结构,链式结构和索引结构。

2内存的分配过程

在文件进行分配时先在目录文件中填写相应的表项,然后把数据写入到磁盘中再把数据的位置交给相应的目录表项。

删除一个文件时也是先删除文件的数据把磁盘空间归还给系统,再删除相应的目录表项。

3 程序结构框图

本实验实现四种命令:

ls查看目录中的所有文件,cat+文件名查看指定文件中的内容,rm+文件名删除某个文件,create+文件名,创建一个文件。

其程序结构框图如下:

图3-1程序结构框图

我们可以建立两个文件,一个是目录文件,一个是数据文件,目录文件是有结构的文件,数据文件无结构的流式文件。

目录是由目录项组成,每个目录项就是一个记录;其中一个目录项可以定义如下:

typedefstruct_directory{

charname[20];/*文件名最长20个字符*/

intbegin;/*开始位置*/

intlength;/*文件长度*/

charowner[10];/*文件的所有者*/

}Directory;

五、参考程序

#include"stdio.h"

#include"string.h"

typedefstruct_directory{

charname[20];

intbegin;

intlength;

charowner[10];

}Directory;

FILE*dir,*file;

voidls(){

intcount=10;

Directorydirs;

fseek(dir,0,0);/*把文件指针放到文件的开头*/

while(count>0){

count=fread(&dirs,sizeof(Directory),1,dir);/*读目录文件*/

if(count>0)

printf("%s\n",dirs.name);

}

}

voidcat(charname[])

{

intcount=10,begin,length;

charcontent[100];/*文件的最大长度是100个字符*/

Directorydirs;

fseek(dir,0,0);

while((count>0)&&(strcmp(dirs.name,name)!

=0))

{/*查目录*/

count=fread(&dirs,sizeof(Directory),1,dir);

}

if(count==0){

printf("nosuchfile!

");

r

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

当前位置:首页 > 医药卫生 > 基础医学

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

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