《操作系统》实验指导书

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《操作系统》实验指导书(适用于计科、网络工程、软件工程、信计专业)

计算机科学与技术学院

2010-5

目录

前言 (3)

实验一、进程管理与进程同步 (4)

实验二、存储器管理 (11)

实验三、磁盘调度算法的设计 (12)

实验四、文件系统原理与模拟实现 (13)

前言

本课程将系统学习操作系统的基本概念和常用算法以及其发展情况和应用情况。通过本课程的学习,学生应达到如下要求:1、加深理解操作系统原理。2、熟悉操作系统的常用算法并完成算法的程序设计。3、理解当前操作系统的应用前景和新的进展。

本课程主要讲解操作系统的实现原理,如进程管理、进程同步、存储器管理、设备管理和文件系统等。要求学生理解操作系统的基本原理并完成其中多种典型的操作系统的算法的模拟序设计。

学生可以采用任何一种自己熟悉的编程语言完成算法的程序设计,如C/C++、Delphi、VB、VC、C#等。

实验一、进程管理

实验目的:

理解和掌握进程管理中死锁处理和进程同步的方法。

实验内容:

实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。

实验步骤:

●理解安全性算法和银行家算法的核心机制:

针对3类资源、5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况;

编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申请,调用安全性函数,实现银行家算法;

测试:输入可分配和不可分配的请求,测试系统的正确性。

●理解进程的三状态调度过程,及各状态间的转换关系;

模拟若干个进程的运行过程,将其存入进程文件中。如:进程1:运行5秒后有3秒的I/O操作,之后有10秒的运行,结束。可以写成:”p1:r5,io3,r3 e;”;

编程实现调度算法函数,定义时间片大小和并发进程个数,不断从进程文件中读出进程信息,模拟进程的运行及调度过程;

测试:针对进程文件里面的数据为正常、缺项、格式不正确等各种情况,检测程序的执行结果。

●设计读者--写者问题的写者优先算法;

学习Windows平台下信号量的API函数的使用;编制读写进程的模拟信息文件,里面包含多个读写进程的运行描述:编制读者--写者问题的写者优先算法,从进程模拟信息文件中取出进程信息,按要求启动对应的进程模拟程序,决定出读者/写者进程的运行次序。

实验结果:

银行家算法程序提供一个用户界面,可以在上边发出资源申请命令,系统应能给出是否可以接受申请,并且有结论输出;

进程调度模拟程序根据一个进程调度文件,模拟进程的各种调度过程,用适合的表达方式表示出来。

写者优先同步控制程序根据一个读写进程模拟信息文件,按照写者优先同步控制过程,用适合的表达方式表示出各读写进程的执行次序。

进程调度模拟程序:

jingchendiaodu.cpp #include "stdio.h" #include

#include

#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0

struct pcb { /* 定义进程控制块

PCB */ char name[10]; char state; int super; int nti me; int rtime;

struct pcb* link;

}*ready=NULL,*p; typedef struct pcb PCB;

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

PCB *first, *second; int insert=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; } }

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

int i,num;

clrscr(); /*清屏*/

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函数*/ } }

int space() {

int l=0; PCB* pr=ready; while(pr!=NULL) { l++;

pr=pr->link; }

return(l); }

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

*/ {

printf("\n qname \t state \t super \t ndtime \t runt ime \n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state);

printf("|%d\t",pr->super); printf("|%d\t",pr->ntime); print f("|%d\t",pr->rtime); printf("\n"); }

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

PCB* pr;

相关文档
最新文档