os实验指导书

更新时间:2024-05-03 06:38:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

大庆石油学院

实验课指导书

单 位 实 验 室 实验名称 主讲教师 职 称

计算机信息与技术学院 计算机信息与技术专业实验室

操作系统(英)

郭玲玲 讲师

2006年08 月20 日

实验一 Simulation of random occurrence(随机事件模拟)

一、实验名称

Simulation of random occurrence(随机事件模拟) 二、实验目的

以银行业务处理为例,理解随机事件的发生、处理过程及处理的一般原则,为处理操作系统中的随机事件做准备。 三、实验内容

模拟银行的业务处理过程,银行有三个窗口,每天8点开门,12点关门,银行业务主要包括两种:存钱和取钱,每件业务的处理时间为3-5分钟。 四、实验要求

要求给出模拟的形象直观效果。 五、实验学时及环境

4学时,Turbo C、Visual C++、Visual Basic、Delphi均可。 六、实验思路

1.如果程序开始运行时产生的随机时间在8-12点之间,则运行该程序,否则提示银行已关门;

2.程序开始运行时,随机产生当时银行存在的人数,及三个窗口的排列情况,并按其先后顺序排序1,2,3……;

3.随机产生每个窗口正在办理业务的情况,包括存钱和取钱,及其每个窗口正在办理业务所剩余的时间,并表示出来;

4.程序运行中随机产生每个时刻进来的人数,并进行排列; 5.假如第一个人处理完业务,则队列依次前移; 6.假如到了12点,系统提示银行停止办理业务。 七、主要程序代码

如果使用C语言进行设计,程序涉及的头文件主要有:stdlib.h, stdio.h, time.h;程序使用的主要函数有:srand(), rand(), time(), sleep()。

以下是用C语言开发的代码示例:

/********************************************/ /* ----银行客流模拟系统---- */ /* ---2004/10/16 */

/********************************************/ #include \#include \#include \#include \#include \#include \main() {

int i,j,l,m,n,p,q,r,u,v; int aa,bb,cc; int za,zb,zc;

int numa,numb,numc; int a[80],b[80],c[80]; int x[80]; int k=1; int mini,tim; time_t t;

srand((unsigned) time(&t));

l=0;m=0;n=0; p=0;q=0; r=0; u=0; v=0;

numa=0;numb=0;numc=0; aa=0;bb=0;cc=0; /* time start */ mini=rand()`; tim=rand()$; if(tim>=8&&tim<12) { while(1)

{ clrscr();

window(1,1,80,25); textbackground(1); textcolor(YELLOW); clrscr();

printf(\ printf(\ ------银行窗口模拟系统------ ****\ printf(\ 制作人:刘佳宁 刘茜 ****\ printf(\ 高遵富 梁舒 ****\ printf(\ if(mini==60)

{

tim++;

if(tim==12)

{printf(\ 现在时间 12:00\\n\

printf(\ 银行已经停止营业!\\n\ sleep(2);

printf(\ 正在注销系统...\\n\ sleep(2);

printf(\ 正在关闭系统...\\n\ printf(\ sleep(4);

break;

}

mini=0; }

printf(\ \ if(tim<10) printf(\ printf(\ if(mini<10) printf(\

printf(\ 营业时间: 8:00-12:00 *********************************\ mini++; /* time over */

p=rand()%2; /* main start */

if(p==0) q=0; else

q=rand()%3+1; for(i=0;i

for(i=0;i

if(numa<=numb&&numa<=numc) { a[l]=x[i]; l++; numa++; } else

if(numb<=numa&&numb<=numc) {

b[m]=x[i]; m++; numb++;

} else {

c[n]=x[i]; n++; numc++;

}

/* printf A array */

printf(\ 窗口 1:\\n \printf(\状态:\if(numa>0) { if(r==0)

{

r=rand()%3+3; za=rand()%2; } if(za==0) printf(\取款\ else

printf(\存款\ printf(\ 剩余时间:\ for(i=0;i

for(i=aa;i

printf(\空闲\ printf(\ }

printf(\-----\/* printf B array */

printf(\ 窗口 2:\\n \printf(\状态:\if(numb>0) { if(u==0) {

u=rand()%3+3; zb=rand()%2; } if(zb==0) printf(\取款\ else

printf(\存款\ printf(\ 剩余时间:\ for(i=0;i

for(i=bb;i

printf(\空闲\ printf(\ }

printf(\

/* printf C array */

printf(\ 窗口 3:\\n \printf(\状态:\if(numc>0) { if(v==0) {

v=rand()%3+3; zc=rand()%2; } if(zc==0) printf(\取款\ else

printf(\存款\ printf(\ 剩余时间:\ for(i=0;i

for(i=cc;i

printf(\空闲\ printf(\ }

printf(\printf(\ 本分钟有%d位顾客进入银行!\printf(\

if(tim==11&&mini>51) {

i=61-mini;

printf(\ 银行将在%d分钟后停止营业!\\n\ } else

printf(\

printf(\/* main over */ sleep(2); } } else { clrscr();

window(1,1,80,25); textbackground(1); textcolor(YELLOW);

printf(\printf(\ ------银行窗口模拟系统------ ****\printf(\ 制作人:刘佳宁 刘茜 ****\printf(\ 高遵富 梁舒 ****\printf(\printf(\

printf(\ 现在时间 \if(tim<10) printf(\printf(\if(mini<10) printf(\printf(\

printf(\ 银行尚未营业!\

printf(\sleep(3); clrscr(); } }

实验二 Single producer consumer problem(单个生产者消费者问题)

一、实验名称

Single producer consumer problem(单个生产者消费者问题) 二、实验目的

以单个生产者—消费者问题为例,理解进程调度算法。 三、实验内容

生产者——消费者问题是最著名的进程同步问题。它描述一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。同时,每个进程都互斥的占用CPU。

假定生产者和消费者是互相等效的,只要缓冲区未满,生产者就可以把产品送入缓冲区,类似的,只要缓冲区未空,消费者便可以从缓冲区中取走产品并消费它。生产者—消费者的同步关系将禁止生产者向已满的缓冲区中放入产品,也禁止消费者从空的缓冲区中获取产品。 四、实验要求

模拟一个生产者,一个消费者,共享一个缓冲区的情形。 模拟一个生产者,一个消费者,共享多个缓冲区的情形。 五、实验学时及环境

4学时,Turbo C、Visual C++、Visual Basic、Delphi均可。 六、实验思路

1.随机产生每个生产者生产一个产品的时间和每个消费者消费一个产品的时间,并体现出来;

2.随着时间的推移,体现生产者生产一个产品的过程和消费者消费一个产品的过程,并统计出生产产品的总数与消费产品的总数;

3.限制缓冲区的容量,比如只能容纳N个产品。当缓冲区已满时,要能够体现出生产者处于等待的情形;当缓冲区为空时,要能够体现出消费者处于等待的情形;

4.当存在多个生产者或消费者进程时,随着产生占用某个CPU时间片的单个进程。

七、主要程序代码

如果使用C语言进行设计,程序涉及的头文件主要有:conio.h, stdio.h, time.h;程序使用的主要函数有:srand(), rand(), time(), sleep()。

以下是用C语言开发的代码示例:

/***************************************/ /* 生产者与消费者 */ /***************************************/

#define count 10 #define lie 14

#include \#include \#include \ int k; int a[count]; int hour,mini; int s; int pdone; int b[180]; int r=0;

int ptim1=0,pttim1=0; int ptim2=0,pttim2=0; int pover1=1,pover2=1; int p;

int vtim1=0,vttim1=0; int vtim2=0,vttim2=0; int vover1=1,vover2=1; int q=0;

int p1_ok=0,v1_ok=0; int p2_ok=0,v2_ok=0;

void tim()

{window(lie,3,lie+8,3); textbackground(5); clrscr();

printf(\ 0%d:\

if(mini<10) printf(\ printf(\ if(mini==0) { hour--; mini=60; } mini--; }

void num0_1() {int i; i=rand(); if(a[i]==1) num0_1(); a[i]=1; }

void num1_0() {int i; i=rand(); if(a[i]==0) num1_0(); a[i]=0; }

void pshow(ptim,pttim,x) int ptim,pttim,x;

{window(lie,2*x+5,ptim+lie-1,2*x+5); textbackground(7); clrscr();

window(lie,2*x+5,pttim+lie-1,2*x+5); if(pdone==1) textbackground(7);

else

textbackground(2); clrscr(); pdone=0;

printf(\}

void sheng(pover,ptim,pttim,x) int pover,ptim,pttim,x; {if(pover==1) {if(ptim==pttim) {ptim=rand()%4+5; pttim=0; } pttim++; }

if(pttim==ptim) {if(k!=count) {if(p==count) p=0; /*a[p]=1;*/ num0_1(); k++; p++; pover=1; pdone=1; } else pover=0; }

pshow(ptim,pttim,x); if(s==0) {ptim1=ptim; pttim1=pttim; pover1=pover;

} else

{ptim2=ptim; pttim2=pttim; pover2=pover; } }

void vshow(vtim,vttim,x) int vtim,vttim,x;

{window(lie,2*x+5,vtim+lie-1,2*x+5); textbackground(7); clrscr(); if(vttim!=0)

{window(lie,2*x+5,lie+vttim-1,2*x+5); textbackground(4); clrscr(); }

printf(\}

void xiao(vover,vtim,vttim,x) int vover,vtim,vttim,x; {

if(vttim==0) {if(k!=0) {/*a[q]=0;*/ num1_0(); q++; k--; if(q==count)

q=0;

vover=1; } else

{vover=0;

vshow(vtim,vttim,x); } } if(vover==1) {if(vttim==0) {vtim=rand()%4+5; vttim=vtim; } vttim--;

vshow(vtim,vttim,x); } if(s==2) {vtim1=vtim; vttim1=vttim; vover1=vover; } else

{vtim2=vtim; vttim2=vttim; vover2=vover; } }

void memshow() { int i;

for(i=0;i

{window(lie+4*i,13,lie+4*i+1,13); if(a[i]==1)

textbackground(2); else

textbackground(4); clrscr(); }

}

void cputime() {int i; int m,h; for(i=0;i

window(lie+2*i-h,15+m,lie+2*i+2-h,15+m); switch(b[i])

{case 0: {textbackground(2);

clrscr(); cprintf(\break;

}

case 1: {textbackground(2);

clrscr(); cprintf(\break;

}

case 2: {textbackground(4);

clrscr(); cprintf(\break;

}

case 3: {textbackground(4);

clrscr(); cprintf(\break;

} } } }

main() { int i; time_t t;

srand((unsigned) time(&t)); hour=3; mini=0;

for(i=0;i

k=rand()%(count+1); p=k;

for(i=0;i

{window(1,1,80,25); textbackground(1); clrscr();

textcolor(YELLOW); clrscr();

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ if(hour==0&&mini==0) {window(1,1,80,25); textbackground(1); clrscr();

cprintf(\ getch(); return; }

Press any key to exit!\ tim(); s=rand()%4; b[r]=s; r++; switch(s) {

case 0:{p1_ok=1;

sheng(pover1,ptim1,pttim1,0); if(p2_ok==1) {if(ptim2==pttim2) pdone=1;

pshow(ptim2,pttim2,1);

}

if(v1_ok==1)

vshow(vtim1,vttim1,2); if(v2_ok==1)

vshow(vtim2,vttim2,3); break; }

case 1:{if(p1_ok==1)

{if(ptim1==pttim1) pdone=1;

pshow(ptim1,pttim1,0); } p2_ok=1;

sheng(pover2,ptim2,pttim2,1); if(v1_ok==1)

vshow(vtim1,vttim1,2); if(v2_ok==1)

vshow(vtim2,vttim2,3); break; }

case 2:{if(p1_ok==1)

{if(ptim1==pttim1)

pdone=1;

pshow(ptim1,pttim1,0); } if(p2_ok==1) {if(ptim2==pttim2) pdone=1;

pshow(ptim2,pttim2,1); } v1_ok=1;

xiao(vover1,vtim1,vttim1,2); if(v2_ok==1)

vshow(vtim2,vttim2,3); break; }

case 3:{if(p1_ok==1) {if(ptim1==pttim1) pdone=1;

pshow(ptim1,pttim1,0); }

if(p2_ok==1) {if(ptim2==pttim2) pdone=1;

pshow(ptim2,pttim2,1); }

if(v1_ok==1)

vshow(vtim1,vttim1,2); v2_ok=1;

xiao(vover2,vtim2,vttim2,3); break; } } memshow(); cputime(); sleep(1); } }

实验三 Banker algorithm(银行家算法)

一、实验名称

Banker algorithm(银行家算法) 二、实验目的

在了解和掌握银行家算法的基础上,能熟练的处理课本例题中所给状态的安全性问题,能编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。 三、实验内容

设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源数量分别为10,5,7。

进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。 四、实验要求:

本实验要求用高级语言编写和调试一个简单的银行家算法程序。用银行家算法实现资源分配。 五、实验学时及环境

4学时,Turbo C、Visual C++、Visual Basic、Delphi均可。 六、实验思路:

设requesti为进程p[i]的请求向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。当系统发出请求后,系统按下述步骤开始检查:

1.如果requesti[j]<=need[i][j],转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。

2.如果requesti[j]<=available[j],转向步骤3;否则报告出错,尚无足够的资源。 3.系统试探着把资源分配给p[i],并修改下列数据结构中的值: available[j]=available[j]-request[j] allocation[i][j]=allocation[i][j]+request[j] need[i][j]=need[i][j]-request[j]

4.系统进行安全性算法,检查此次分配后,系统是否还处于安全状态,若安全,把资源分配给进程p[i];否则,恢复原来的资源分配状态,让进程p[i]等待。 安全性算法:

1.设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE 2.从进程集合中找到一个满足下述条件的进程:

FINISH[i]=FALSE NEED<=WORK

如找到,执行3;否则,执行4。

3.设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2

4.如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

七、主要程序代码

如果使用C语言进行设计,程序涉及的头文件主要有:stdio.h。 以下是用C语言开发的代码示例:

#include #define TRUE 1 #define FALSE 0 #define M 5 #define N 3

int available[N]={3,3,2};

int max[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; int allocation[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int need[M][N],p[M]; void init(){ int i,j;

for(i=0;i

need[i][j]=max[i][j]-allocation[i][j]; } } }

void output(){ int i,j;

printf(\

for(i=0;i

printf(\ } } }

int compare(int need[],int work[]){ int j;

for(j=0;jwork[j]){ return FALSE; } }

return TRUE; }

int isSecurity(int available[],int need[][N],int allocation[][N]){ int i,j,k=0,flag,finish[M],work[N]; for(i=0;i

for(j=0;j

while(TRUE){ flag=FALSE; for(i=0;i

if(finish[i]==FALSE&&compare(need[i],work)==TRUE){ for(j=0;j

finish[i]=TRUE; p[k++]=i; flag=TRUE; break;

} }

if(flag==FALSE){ for(i=0;i

if(finish[i]==FALSE) return FALSE; }

return TRUE; } } }

void operate(){

int i,j,flag,f1,request[N];

printf(\ printf(\ while(TRUE){ f1=FALSE;

printf(\ scanf(\ if(i>=M){

printf(\ continue; } getchar(); if(i<0) break;

printf(\ for(j=0;j

for(j=0;jneed[i][j]){

printf(\ output();

printf(\

f1=TRUE; break; } }

for(j=0;javailable[j]){

printf(\ output();

printf(\ f1=TRUE; break; } }

if(f1==TRUE) continue; for(j=0;j

flag=isSecurity(available,need,allocation); if(flag==TRUE){

printf(\ printf(\ for(i=0;i

i==4 ? printf(\ } output();

printf(\ } else{

printf(\ printf(\ for(j=0;j

available[j]-=request[j]; allocation[i][j]+=request[j]; need[i][j]-=request[j]; } output();

printf(\ } } }

void main(){ clrscr(); init(); operate(); }

八、实验结果分析

由于安全的路径并不一定唯一,所以输出的结果并不是和书上的一样,很正常,原因在于安全路径的找法上。

实验四 Paging Memory Management(分页式存储管理)

一、实验名称

Paging Memory Management(分页式存储管理) 二、实验目的

理解分页式存储管理的原理。 三、实验内容

在分页系统中,把每个作业(进程)的地址空间划分成一些大小相等的片,称之为页面或页。同样地,把内存的存储空间也分成与页相同大小的存储块,称为物理块或页框。分页系统允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面所对应的物理块,系统为每个进程建立一张页面映射表,即页表,图1所示。页表的作用是实现从页号到物理块号的地址映射。

四、实验要求

模拟多个作业分页式存储管理的全过程。 五、实验学时及环境

4学时,Turbo C、Visual C++、Visual Basic、Delphi均可。 六、实验思路

1.划分出一块内存空间,并为其编号;

2.初始化若干个作业,并为每个作业随机分配物理块号,每个作业包括标识号、页数、运行时间和物理块号四部分;

3.随着时间的推移,描述每个作业的开始、运行与结束过程; 4.在每个时间点,随机产生若干个新的作业。 七、主要程序代码

如果使用C语言进行设计,程序涉及的头文件主要有:stdio.h, dos.h, time.h, conio.h。

以下是用C语言开发的代码示例:

#include #include #include #include

struct page {char ch; int count; int page[4]; int tim; }aa[100]; int num=0;

struct mem {int x; int ch; }frame[30]; int a=48; int sum=0;

void first() {int i;

for(i=0;i<30;i++) {frame[i].ch=0; frame[i].x=0;

} }

void ttim() {struct time t; gettime(&t);

printf(\ .ti_sec); } num0_1() {int i; i=rand()0; if(frame[i].x==1) num0_1(); else return i; }

void fenpei() {int i;

aa[num].ch=a; a++; if(a==58) a=65; if(a==91) a=97;

aa[num].tim=rand()%4+5; aa[num].count=rand()%4+1; for(i=0;i

frame[aa[num].page[i]].ch=aa[num].ch; }

-:d:d\\n\ }

void check() {int i,j;

for(i=0;i

for(j=0;j

frame[aa[i].page[j]].ch=0;

} } }

void putout() {int i,j;

printf(\ \ for(i=0;i<30;i++) {printf(\ if(i==14)

printf(\ \ }

for(i=0;i<=14;i++)

{window(11+i*4,5,12+i*4,5); if(frame[i].x==1)

textbackground(RED);

else

textbackground(GREEN);

clrscr();

cprintf(\ }

for(i=0;i<=14;i++)

{window(11+i*4,8,12+4*i,8); if(frame[i+15].x==1)

textbackground(RED);

else

textbackground(GREEN);

clrscr();

cprintf(\ }

window(25,10,55,23); textbackground(8); clrscr();

printf(\ Size Time Mem\ window(25,11,55,23); textbackground(6); clrscr(); sum=0;

for(i=0;i0)

{printf(\ printf(\ \ for(j=0;j

printf(\

printf(\ \ sum++; } } }

void work() {int cishu=60; int k; int i; while(cishu--) {clrscr();

window(1,1,80,25); textbackground(BLUE); clrscr();

textcolor(YELLOW);

clrscr(); ttim(); k=rand()%2; if(k==1)

{k=rand()%3+1; if((sum+k)>13)

k=0;

for(i=0;i

num++;

}

}

check(); putout(); sleep(1); } } main() {time_t t;

srand((unsigned) time(&t)); clrscr(); first(); work();

window(1,1,80,25); textbackground(BLUE); clrscr();

printf(\ getch(); }

Press Any Key to Exit !\

clrscr(); ttim(); k=rand()%2; if(k==1)

{k=rand()%3+1; if((sum+k)>13)

k=0;

for(i=0;i

num++;

}

}

check(); putout(); sleep(1); } } main() {time_t t;

srand((unsigned) time(&t)); clrscr(); first(); work();

window(1,1,80,25); textbackground(BLUE); clrscr();

printf(\ getch(); }

Press Any Key to Exit !\

本文来源:https://www.bwwdw.com/article/2pmg.html

Top