操作系统实验报告(共28页).doc
精选优质文档-倾情为你奉上学号: 操作系统实验报告20 20 学年 春季 学期学 院: 专业班级: 姓 名: 实验成绩: 评阅教师: 评阅日期: 实验1 进程调度模拟实验一实验目的1.理解进程的概念,熟悉进程的组成;2.用高级语言编写和调试一个进程调度程序,以加深对进程调度算法的理解。二实验准备1.几种进程调度算法l 短进程优先调度算法l 高优先权优先调度算法l 先来先服务调度算法l 基于时间片的轮转调度算法2 进程的组成l 进程控制块(PCB)l 程序段l 数据段3 进程的基本状态l 就绪W(Wait)l 执行R(Run)l 阻塞B(Block)三实验内容l 编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。l 算法流程图: 四源代码:#include "stdio.h" #include <stdlib.h> #include <conio.h> #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void 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; void input() /* 建立进程控制块函数*/ int i; system("cls"); /*清屏*/ printf("n 请输入五个进程信息:n"); for(i=0;i<5;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); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf("n qname t state t super t ndtime t runtime n"); printf("|%st",pr->name); printf("|%ct",pr->state); printf("|%dt",pr->super); printf("|%dt",pr->ntime); printf("|%dt",pr->rtime); printf("n"); void check() /* 建立进程查看函数 */ PCB* pr; printf("n * 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p); pr=ready; printf("n *当前就绪队列状态为:n"); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr->link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf("n 进程 %s 已完成.n",p->name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p->rtime)+; if(p->rtime=p->ntime) destroy(); /* 调用 destroy 函数*/ else (p->super)-; p->state='w' sort(); /*调用 sort 函数*/ void youxian() int len,h=0; char ch; system("cls"); input(); / 高优先级优先算法的程序入口 len=space(); while(len!=0)&&(ready!=NULL) ch=getchar(); h+; printf("n The execute number:%d n",h); p=ready; ready=p->link; p->link=NULL; p->state='R' check(); running(); printf("n 按任一键继续."); printf("nn 进程已经完成.n"); ch=getchar(); /菜单 void menu() int m; system("cls"); printf("tttt 进程调度n"); printf("nnnttt1.演示最高优先数优先算法."); printf("nttt0.退出程序."); printf("nntttt 选择进程调度方法:"); scanf("%d",&m); switch(m) case 1: youxian(); /高优先级优先算法的程序入口 system("cls"); menu(); break; case 0: system("cls"); break; default:system("cls"); menu(); main() /*主函数*/ menu(); 五运行截图:实验2 银行家算法模拟实验一实验目的1.理解死锁的概念;2.用高级语言编写和调试一个银行家算法程序,以加深对死锁的理解。二实验准备1 产生死锁的原因l 竞争资源引起的死锁l 进程推进顺序不当引起死锁2产生死锁的必要条件l 互斥条件l 请求和保持条件l 不剥夺条件l 环路等待条件3处理死锁的基本方法l 预防死锁l 避免死锁l 检测死锁l 解除死锁三实验内容设计五个进程a,b,c,d,e共享三类资源A,B,C的系统,A,B,C的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。四源代码#include <iostream.h>#include <string.h>#define M 3 /资源的种类数#define N 5 /进程的个数void output(int iMaxNM,int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN); /统一的输出格式bool safety(int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN);bool banker(int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN);void main()int i,j;/当前可用每类资源的资源数int iAvailableM=3,3,2;/系统中N个进程中的每一个进程对M类资源的最大需求int iMaxNM=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3;/iNeedNM每一个进程尚需的各类资源数/iAllocationNM为系统中每一类资源当前已分配给每一进程的资源数int iNeedNM,iAllocationNM=0,1,1,2,0,0,3,0,2,2,1,1,0,0,2;/进程名char cNameN='a','b','c','d','e'bool bExitFlag=true; /退出标记char ch; /接收选择是否继续提出申请时传进来的值bool bSafe; /存放安全与否的标志/计算iNeedNM的值for(i=0;i<N;i+)for(j=0;j<M;j+)iNeedij=iMaxij-iAllocationij;/输出初始值output(iMax,iAllocation,iNeed,iAvailable,cName);/判断当前状态是否安全bSafe=safety(iAllocation,iNeed,iAvailable,cName);/是否继续提出申请while(bExitFlag)cout<<"n"<<"继续提出申请?ny为是;n为否。n"cin>>ch;switch(ch) case 'y': /cout<<"调用银行家算法"bSafe=banker(iAllocation,iNeed,iAvailable,cName);if (bSafe) /安全,则输出变化后的数据output(iMax,iAllocation,iNeed,iAvailable,cName);break; case 'n': cout<<"退出。n" bExitFlag=false; break; default: cout<<"输入有误,请重新输入:n"/输出void output(int iMaxNM,int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN)int i,j;cout<<"nt Max tAllocationt Need t Available"<<endl;cout<<"tA B CtA B CtA B Ct A B C"<<endl;for(i=0;i<N;i+)cout<<cNamei<<"t"for(j=0;j<M;j+)cout<<iMaxij<<" "cout<<"t"for(j=0;j<M;j+)cout<<iAllocationij<<" "cout<<"t"for(j=0;j<M;j+)cout<<iNeedij<<" "cout<<"t"cout<<" "/Available只需要输出一次if (i=0)for(j=0;j<M;j+)cout<<iAvailablej<<" "cout<<endl;/安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示;bool safety(int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN)int i,j,flag,x=0;char NameN;int WorkM;bool FinishN; for(j=0;j<M;j+)Workj=iAvailablej; for(i=0;i<N;i+) Finishi=false;while(true) flag=0; for(i=0;i<N;i+) if(Finishi=false && Work0>=iNeedi0 && Work1>=iNeedi1 && Work2>=iNeedi2) for(j=0;j<M;j+)Workj+= iAllocationij ; Finishi=true; flag+; Namex+=cNamei; for(i=0;i<N;i+) if(Finishi=false)i=i; break;if(i=5) cout<<"n"cout<<"安全序列为:"for(x=0;x<N;x+)cout<<Namex<<" "cout<<"n"return true;if(flag=0)cout<<"无安全序列" return false; return true;/安全返回true,不安全返回falsebool banker(int iAllocationNM,int iNeedNM,int iAvailableM,char cNameN)int iMaxNM=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3;int i,j,RequestM,checkM;bool f=true;char x; while(f) cout<<"请输入进程名:" cin>>x; for(i=0;i<N;i+) if (cNamei=x) i=i; break; if (i=5) cout<<"n您输入的进程名有误!请重新输入" else f=false; cout<<"请输入各资源数量:" for(j=0;j<M;j+)cin>>Requestj;for(j=0;j<M;j+) checkj=Requestj+iAllocationij;for(j=0;j<M;j+) if(iMaxij-checkj)<0) cout<<"n资源申请超过最大需求量!n" return false; for(j=0;j<M;j+) if(iAvailablej-Requestj)<0) cout<<"n不能满足进程!n" return false; for(j=0;j<M;j+) iAvailablej-=Requestj; iAllocationij+=Requestj; iNeedij-=Requestj; safety(iAllocation,iNeed,iAvailable,cName); return true;五 屏幕截图 实验3 存储器管理模拟实验一 实验目的1 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解;2 熟悉虚存管理的各种页面淘汰算法;3 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二 实验准备1虚拟存储器的管理方式l 段式管理l 页式管理l 段页式管理2页面置换算法l 先进先出置换算法l 最近最久未使用置换算法l Clock置换算法l 其他置换算法三 实验内容1 实验题目设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50的指令是顺序执行的。25的指令均匀地散布在前地址部分,25的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。2 具体做法产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。四 源代码#include <iostream.h>#define Bsize 3#define Psize 12struct pageInfor int content;/页面号 int timer;/被访问标记; class Fifo_replacepublic: Fifo_replace(void); /构造函数 Fifo_replace(void); /析构函数 int findSpace(void); /查找是否有空闲内存 int findExist(int curpage); /查找内存中是否有该页面 int findReplace(void); /查找应予置换的页面 void display(void); /显示 void FIFO(void); /FIFO算法void BlockClear(void); /BLOCK恢复 pageInfor *block; /物理块 pageInfor *page; /页面号串 int memory_stateBsizePsize; int s; /缺页统计private:; Fifo_replace:Fifo_replace(void) int QString12=4,3,2,1,4,3,5,4,3,2,1,5; s=0; block = new pageInforBsize; for(int i=0; i<Bsize; i+) /初始化Block blocki.content = -1; blocki.timer = 0; page = new pageInforPsize; for(i=0; i<Psize; i+) pagei.content = QStringi; pagei.timer = 0; Fifo_replace:Fifo_replace() s=0; int Fifo_replace:findSpace(void) for(int i=0; i<Bsize; i+) if(blocki.content = -1) return i;/找到空闲内存, return -1; int Fifo_replace:findExist(int curpage) for(int i=0; i<Bsize; i+) if(blocki.content = pagecurpage.content) return i;/找到内存中有该页面,返回BLOCK中位置 return -1; int Fifo_replace:findReplace(void) int pos = 0; for(int i=0; i<Bsize; i+) if(blocki.timer >= blockpos.timer) pos = i;/找到应予置换页面,返回BLOCK中位置 return pos; void Fifo_replace:display(void) for(int i=0; i<Bsize; i+) if(blocki.content != -1) cout<<blocki.content<<" " cout<<endl; void Fifo_replace:FIFO(void) int exist,space,position ; for(int i=0; i<Psize; i+) exist = findExist(i); if(exist != -1) for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; s+; /cout<<"不缺页"<<endl; else space = findSpace(); if(space != -1) for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; blockspace = pagei; memory_statespacei=blockspace.content; if(space=1) memory_state10=0; memory_state20=0; else memory_state21=0; /display(); else for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; position = findReplace(); blockposition = pagei; memory_statepositioni=blockposition.content; /display(); for(int j=0; j<Bsize; j+) blockj.timer+;/BLOCK中所有页面TIMER+ void Fifo_replace:BlockClear(void) for(int i=0; i<Bsize; i+) blocki.content = -1; blocki.timer = 0; 五 屏幕截图实验4 文件操作的模拟实验一 实验目的1 了解文件系统的原理;2 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二 实验准备文件的逻辑结构l 顺序文件l 索引文件l 索引顺序文件l 直接文件和哈希文件2外存分配方式l 连续分配l 链接分配l 索引分配三 实验内容1 实验要求要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。2 实验题目l 设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。l 程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。l 为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。四 源代码 #include"stdio.h"typedef struct afd char filename10;int pcode;int length;*linkt; typedef struct mfdchar username10; linkt next;*linkf;typedef struct ufdchar filename10;int opening;struct ufd *next;*link;linkf mfd5,p1,q1;linkt ufd,p2,q2;char x10;link afd,p3,q3;int t,r,l,i,k,n,s,m,j,il;void print( )for(i=0;i<n;i+)printf("%s",mfdi->username);p2=mfdi->next;while(p2)printf("%s",ufd->filename);printf("%s%d%d",p2->filename,p2->pcode,p2->length);p2=p2->next;if(i>0)p3=afd;while(p3)printf("%s%d",afd->filename,afd->opening);printf("%s%d",p3->filename,p3->opening);p3=p3->next;void pcreat()printf("create name:n");scanf("%s",x);q2=ufd;while(q2->next)&&(q2->filename!=x)q2=q2->next;if(q2->next=NULL)q2->next=p2;p2->filename=x;printf("create code=n");scanf("%d",&m);p2->pcode=m;printf("create length=n");scanf("%d",&s);p2->length=s;p2->next=NULL;else printf("the file is existn");void popen( )p2=ufd;printf("input filename=n");scanf("%s",x);while(p2->next)&&(p2->filename!=x)p2=p2->next;if(p2->filename=x)if(i) q3=q3->next;if(q3->filename=x)printf("the file is on the afdn"); elseif(i=0) p3=afd;else q3->next=p3;i+;p3->filename=x;p3->opening=i;p3->next=NULL;printf("file number=%dn",i);else printf("error");print();void pdelete()printf("the filename to delete:");scanf("%s",x);printf("n");p3=afd;q3=afd;if(p3->filename!=x)q3=p3;p3=p3->next;else q3->next=p3->next;free(p3);p2=ufd;q2=ufd;if(p2->filename!=x)while(p2->next)q2=p2;p2=p2->next;elseq2->next=p2->next;free(p2);printf("the file is deletedn"); print(); void pclose()