2024年操作系统实验报告_第1页
2024年操作系统实验报告_第2页
2024年操作系统实验报告_第3页
2024年操作系统实验报告_第4页
2024年操作系统实验报告_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

院系:计算机科學學院专业:计算机科學与技术年级:課程名称:操作系统指导教師:艾勇6月1曰年级

专业计算机科學与技术

班级

1小班组号01试验室9-206曰期

.6.1试验名称

操作系统试验实验内容分项内容试验级别试验一操作系统试验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)操作系统使用级试验二進程控制操作系统观测级,原码阅讀与系统编程级试验三進程同步与通信管理原码阅讀与系统编程级试验四虚拟内存管理操作系统观测级,算法仿真实現级试验五文献系统与磁盘管理操作系统管理级小组成员姓名學号组内分工自我评分教師评分李延珍10061001试验1,2,3,4,5

秦婷10061002试验1,2,3,4,5

刘梦雲10061003试验1,2,3,4,5

金柏统10061023试验1,2,3,4,5

許文君10061029试验1,2,3,4,5

小组成绩评定教師签名:年月曰试验分项1操作系统试验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)实验目的

熟悉操作系统试验环境实验要求详细題目Linux常用命令的使用(操作系统使用级)Linux系统基本操作(启動与退出、文献和目录操作、文档备份与压缩、联机协助等)Vi/Emacs等编辑软件的使用(操作系统使用级)cc、gcc、g++、gdb命令的使用(開发调试环境)(操作系统使用级)系统平台:Linux实验原理步骤(算法流程)login1.作用login的作用是登录系统,它的使用权限是所有顾客。2.格式login[name][-p][-h主机名称]3.重要参数-p:告知login保持目前的环境参数。-h:用来向遠程登录的之间传播顾客名。mkdir

[options]

目录名

1.[options]重要参数

-m,

--mode=模式:设定权限<模式>,与chmod类似。

-p,

--parents:需要時创立上层目录;假如目录早已存在,则不妥作錯误。

-v,

--verbose:每次创立新目录都显示信息。

--version:显示版本信息後离開。

$

mkdir

-m

777

tsk

grep

1.作用

grep命令可以指定文献中搜索特定的内容,并将具有這些内容的行原则输出。grep全称是Global

Regular

Expression

Print,表达全局正则体現式版本,它的使用权限是所有顾客。

2.格式

grep

[options]

find1.作用

find命令的作用是在目录中搜索文献,它的使用权限是所有顾客。2.格式

find

[path][options][expression]

path指定目录途径,系统從這裏開始沿著目录树向下查找文献。它是一种途径列表,互相用空格分离,假如不写path,那么默认為目前目录。

find命令查找文献的几种措施:

(1)根据文献名查找

例如,我們想要查找一种文献名是lilo.conf的文献,可以使用如下命令:

find

/

-name

lilo.conf

find命令後的“/”表达搜索整個硬盘。

(3)根据部分文献名查找措施

find

/

-name

'*abvd*'

(4)

使用混合查找方式查找文献

find

/etc

-size

+500000c

-and

-mtime

+1

mv

1.作用

mv命令用来為文献或目录更名,或者将文献由一种目录移入另一种目录中,它的使用权限是所有顾客。该命令如同DOS命令中的ren和move的组合。

2.格式

mv[options]

源文献或目录

目的文献或目录

3.[options]重要参数

-i:交互方式操作。假如mv操作将导致對已存在的目的文献的覆盖,此時系统問询与否重写,规定顾客回答“y”或“n”,這样可以防止误覆盖文献。

-f:严禁交互操作。mv操作要覆盖某個已經有的目的文献時不給任何指示,指定此参数後i参数将不再起作用。

ls

1.作用

ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有顾客。

2.格式

ls

[options][filename]

cat

1.作用

cat(“concatenate”的缩写)命令用于连接并显示指定的一种和多种文献的有关信息,它的使用权限是所有顾客。

2.格式

cat

[options]

文献1

文献2……

3.[options]重要参数

-n:由第一行開始對所有输出的行数编号。

-b:和-n相似,只不過對于空白行不编号。

-s:當碰到有持续两行以上的空白行時,就代换為一行的空白行。

$

cat

-b

/etc/named.conf

实验結果及分析Linux常用命令的使用在字符界面使用login登录系统,顾客名niceboy:ls–f用在每個文献名的背面或者前面添加一种特定的後缀字符的措施指出它的类型:pwd查看目前所在目录的绝對路經:mkdir目录名,创立一种目录。如在目前目录下面创立目录secrest:

file检测文献的目录的属性和内容属性,如检测文献1.txt的文献的目录属性和内容属性:cp1.txtabc将temp下面的1.txt复制到abc下面:rmdir空目录名,删除一种空目录如,执行命令後secrest被删除了:cat显示文献的内容:把test1(包括1.doc)、test2备份到backup文献夹中追加2.doc和3.doc到backup文献夹中解压backup压缩包中的test2文献夹创立了以abc開頭的文献,然後压缩成mytar.tar:解压mytar.tar,如下所示:使用man進入在线协助:使用rpm指令安装软件包:在目录/dev中搜索文献名中含字符串sda的文献:使用shutdown指令关闭系统:Vi编辑软件的使用cc、gcc、g++、gdb命令的使用心得体會通過本次试验,我基本上掌握了怎样使用Linux系统進行简朴的操作,學會了某些基本的linux操作命令,懂得怎样在linux下编写、编译并运行C語言程序;理解了VI的基本命令,插入,粘贴,复制等命令。理解了linux下文献目录的基本构造,文献的属性,顾客的属性,可以较纯熟的操作图形界面。為此後的學习奠定了基础。试验分项2進程控制实验目的

熟悉linux和windows下進程的管理,包括创立,睡眠,销毁等。实验要求详细題目Linux系统常用進程管理命令的使用(操作系统观测级)Linux系统常用進程创立与管理的系统调用(原码阅讀与系统编程级)Windows平台常用進线程控制API(原码阅讀与系统编程级)系统平台LinuxWindows实验原理步骤(算法流程)fork()函数创立子進程需要将父進程的资源复制一种副本;當调用fork()执行成功時,调用1次却返回2次,该调用向父進程返回子進程的ID,向子進程返回0。wait()函数進程一旦调用了wait,就立即阻塞了自已,由wait自動分析与否目前進程的某個子進程已經退出,假如让它找到了這样一种已經变成僵尸的子進程,wait就會搜集這個子進程的信息,并把它彻底销毁後返回;假如没有找到這样的一种子進程,wait就會一直阻塞在這裏,直到一种出現為止。参数status用来保留被搜集的進程退出時的某些状态,它是一种指向int类型的指针sleep()函数该函数使得進程挂起一种指定的時间,直到懂得時间用完或收到信号;假如挂起時间到了,就返回0;假如该函数被信号打断,则返回剩余挂起的時间数。实验結果及分析Linux系统常用進程管理命令的使用使用ps命令重要查看系统中進程的状态:使用kill命令终止一种進程:Linux系统常用進程创立与管理的系统调用fork()函数创立子進程需要将父進程的资源复制一种副本;當调用fork()执行成功時,调用1次却返回2次,该调用向父進程返回子進程的ID,向子進程返回0。wait()函数進程一旦调用了wait,就立即阻塞了自已,由wait自動分析与否目前進程的某個子進程已經退出,假如让它找到了這样一种已經变成僵尸的子進程,wait就會搜集這個子進程的信息,并把它彻底销毁後返回;假如没有找到這样的一种子進程,wait就會一直阻塞在這裏,直到一种出現為止。参数status用来保留被搜集的進程退出時的某些状态,它是一种指向int类型的指针sleep()函数该函数使得進程挂起一种指定的時间,直到懂得時间用完或收到信号;假如挂起時间到了,就返回0;假如该函数被信号打断,则返回剩余挂起的時间数。Windows平台常用進线程控制API#include<windows.h>#include<iostream>#include<conio.h>#include<stdio.h>staticLPCSTRg_szMutexName="w2kdg.ProcTerm.mutex.Suicide";voidStartClone()//创立目前進程的克隆進程的简朴措施{ TCHARszFilename[MAX_PATH]; GetModuleFileName(NULL,szFilename,MAX_PATH);//获得目前可执行文献名TCHARszCmdLine[MAX_PATH]; sprintf(szCmdLine,"\"%s\"child",szFilename); STARTUPINFOsi; ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si)); si.cb=sizeof(si); PROCESS_INFORMATIONpi;//阐明一种返回的子進程信息构造 //运用同样的可执行文献名和命令行创立進程,并指明是一种返回進程 BOOLbCreateOk=CreateProcess( szFilename,//产生的应用程序的名称 szCmdLine,//指定创立一种子進程的符号標识 NULL,//默认的進程安全性 NULL,//默认的线程安全性 FALSE,//不继承句柄 CREATE_NEW_CONSOLE,//创立新窗口,使输出更直观 NULL,//新环境 NULL,//目前目录 &si,//启動信息构造 &pi);//返回進程信息 if(bCreateOk)//关闭子進程 { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }}voidParent(){HANDLEhMutexSuicide=CreateMutex( NULL,//默认的安全性 TRUE,//创立者是互斥体得最初拥有者 g_szMutexName);//為互斥体命名 if(hMutexSuicide!=NULL) { printf("Creatingthechildprocess.\n"); { StartClone();//创立一种子進程 printf("Tellingthechildprocesstoquit.\n"); printf("本来是子進程,請终止!\n"); Sleep(6000);//暂停5秒 } printf("我也結束了!\n"); ReleaseMutex(hMutexSuicide);//告知子進程杀掉自身 CloseHandle(hMutexSuicide);//消除互斥体句柄 }}voidChild(){//打開“自杀”互斥体 HANDLEhMutexSuicide=OpenMutex( SYNCHRONIZE,//打開用于同步 FALSE,//不需要向下传递 g_szMutexName);//互斥体名称 if(hMutexSuicide!=NULL) { printf("Childwaitingforsuicideinstuctions.\n"); WaitForSingleObject(hMutexSuicide,INFINITE); //等待子進程释放互斥体 //准备好终止,清除句柄 printf("收到命令,本子進程立即终止請等10秒钟\n"); printf("Childquiting"); Sleep(6000); CloseHandle(hMutexSuicide); }}intmain(intargc,char*argv[]){ //决定其行為是父進程還是子進程 if(argc>1&&strcmp(argv[1],"child")==0) { Child(); } else { Parent(); Sleep(); } return0;}程序运行成果如下:心得体會通過本次试验,對父進程和子進程之间的关系也有了比较清晰的认识,可以在linux下用c語言创立進程,子進程,销毁進程等。理解了linux下進程控制块的基本构造,對linux的進程和线程的区别和联络有個比较清晰的认识,可以在终端管理進程。對進程的同步互斥有一定的理解。Windos下和linux下的進程在构造上也有相似的地方。试验分项3

進程同步与通信管理实验目的

熟悉掌握進程的通信管理实验要求详细題目進程同步与互斥控制(讀者写者、一家人吃苹果桔子、哲學家吃饭)简朴進程通信(管道、消息缓冲、邮件槽等)(原码阅讀与系统编程级)系统平台Linux平台windows平台实验原理步骤(算法流程)一家人吃苹果桔子問題算法设计如下:父亲進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Apple;hSem_Apple=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Apple");inti;for(i=0;i<20;i++){cout<<"试图放入苹果"<<endl;cin.get();WaitForSingleObject(hSem_Empty_Plate,INFINITE);//申請信号量hSem_Empty_Plate/*************************************//************详细操作*****************//*************************************/cout<<"成功放入苹果,并准备通告儿子"<<endl;cin.get();ReleaseSemaphore(hSem_Apple,1,NULL);//释放信号量hSem_Applecout<<"通告完毕,准备削苹果"<<endl;cin.get();}cin.get();return0;}母亲進程和父亲進程类似:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Orange;hSem_Orange=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Orange");inti;for(i=0;i<20;i++){cout<<"试图放入桔子"<<endl;cin.get();WaitForSingleObject(hSem_Empty_Plate,INFINITE);/*************************************//************详细操作*****************//*************************************/cout<<"成功放入桔子,并准备通告女儿"<<endl;cin.get();ReleaseSemaphore(hSem_Orange,1,NULL);cout<<"通告完毕,准备剥桔子"<<endl;cin.get();}cin.get();return0;}儿子進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Apple;hSem_Apple=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Apple");inti;for(i=0;i<20;i++){cout<<"试图取出苹果"<<endl;cin.get();WaitForSingleObject(hSem_Apple,INFINITE);/*************************************//************详细操作*****************//*************************************/cout<<"成功取出苹果,并准备通告老爹老媽"<<endl;cin.get();ReleaseSemaphore(hSem_Empty_Plate,1,NULL);cout<<"通告完毕,正在吃苹果"<<endl;cin.get();}cin.get();return0;}女儿進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Orange;hSem_Orange=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Orange");inti;for(i=0;i<20;i++){cout<<"试图取出桔子"<<endl;cin.get();WaitForSingleObject(hSem_Orange,INFINITE);/*************************************//************详细操作*****************//*************************************/cout<<"成功取出桔子,并准备通告老媽老爹"<<endl;cin.get();ReleaseSemaphore(hSem_Empty_Plate,1,NULL);cout<<"通告完毕,正在吃桔子"<<endl;cin.get();}cin.get();return0;}实验原理步骤(算法流程)讀者写者問題算法设计如下:讀者:#include<vcl.h>#pragmahdrstop#include"iostream.h"//---------------------------------------------------------------------------#pragmaargsusedintmain(intargc,char*argv[]){intcount=0;//记录正在讀的讀者数inti=0;HANDLErMutex;rMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"rMutex");//打開rWutex互斥体HANDLEwMutex;wMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"wMutex");//打開wWutex互斥体cout<<"如下用讀者進程循环方式模拟多种讀者進程。"<<endl;while(i<5){WaitForSingleObject(rMutex,INFINITE);if(count==0)//假如還没有讀者,開始,并阻塞後来的写者{WaitForSingleObject(wMutex,INFINITE);}count=count+1;ReleaseMutex(rMutex);cout<<i;cout<<"号讀者正在讀数据!"<<endl;Sleep(1000);WaitForSingleObject(rMutex,INFINITE);count=count-1;if(count==0)//假如没有讀者了,唤醒也許阻塞的写者{ReleaseMutex(wMutex);}ReleaseMutex(rMutex);i++;Sleep();}//目前模拟一口气有多种讀者几乎同步到i=0;//i清零while(i<4){WaitForSingleObject(rMutex,INFINITE);if(count==0)//假如還没有讀者,開始,并阻塞後来的写者{WaitForSingleObject(wMutex,INFINITE);}count=count+1;ReleaseMutex(rMutex);cout<<i;cout<<"号讀者正在讀数据!目前count值為";cout<<count<<endl;Sleep(100);i++;}i=0;while(i<4){WaitForSingleObject(rMutex,INFINITE);count=count-1;cout<<"目前count值為";cout<<count<<endl;if(count==0)//假如没有讀者了,唤醒也許阻塞的写者{ReleaseMutex(wMutex);}ReleaseMutex(rMutex);Sleep(3000);i++;}cin.get();return0;}写者:#include<vcl.h>#pragmahdrstop#include"iostream.h"//---------------------------------------------------------------------------#pragmaargsusedintmain(intargc,char*argv[]){inti=0;HANDLEwMutex;wMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"wMutex");//打開wWutex互斥体cout<<"如下用写者進程循环方式模拟多种写者進程。"<<endl;while(true){WaitForSingleObject(wMutex,INFINITE);cout<<i;cout<<"号写者正在写数据!需時1秒。"<<endl;Sleep(1000);ReleaseMutex(wMutex);i++;Sleep(1000);}return0;}哲學家問題:send(i):第i個哲學家要吃饭BeginIfimod2==0then//第偶数個哲學家{P(c[i]);//申請左边的筷子P(c[i+1]mod5));//申請右边的筷子eat;V(c[i]);//释放左边的筷子V(c[i+1mod5]);//释放右边的筷子}Else{

P(c[i+1mod5]);//申請右边的筷子P(c[i]);//申請左边的筷子EatV(c[i+1mod5]);//释放右边的筷子V(c[i]);//释放左边的筷子}EndLinux系统常用進程创立与管理的系统调用#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<stdio.h>

intmain(){pid_tret;intstatus,i,role=-1;ret=fork();if(ret>0){printf("Parent:thisistheparentprocess(pid%d)\n",getpid());for(i=0;i<6;i++){printf("Parent:Atcount%d\n",i);sleep(2);}ret=wait(&status);role=0;}elseif(ret==0){printf("Child:thisistheChildprocess(pid%d)\n",getpid());for(i=0;i<6;i++){printf("Child:Atcount%d\n",i);sleep(2);}role=1;}else{printf("Parent:Errortryingtofork()(%d)\n",errno);}printf("%s:Exiting...\n",((role==0)?"Parent":"Child"));return0;}fork()创立子進程需要将父進程的资源复制一种副本;當调用fork()执行成功時,调用1次却返回2次,该调用向父進程返回子進程的ID,向子進程返回0。实验結果及分析一家人吃苹果桔子問題算法设计如下:设三個個信号量hSem_Empty_Plate=2hSem_Apple=0hSem_Orange=0父亲進程:父亲先申請盘子的位子,假如申請不到,那么等待盘子有位子可以放入水果時,才可以放入苹果。當放完苹果後,释放信号量苹果,這時候女儿可以吃苹果了母亲進程:母亲先申請盘子的位子,假如申請不到,那么等待盘子有位子可以放入水果時,才可以放入桔子。當放完桔子後,释放信号量桔子,這時候儿子可以吃桔子了女儿進程:女儿先申請盘子的桔子,假如申請不到,那么等待盘子裏面有桔子,才可以申請成功,然後吃桔子。吃完桔子释放信号量hSem_Empty_Plate,這样母亲或者父亲可以放入水果到盘子裏面了儿子進程:儿子先申請盘子的苹果,假如申請不到,那么等待盘子裏面有苹果,才可以申請成功,然後吃苹果。吃完苹果释放信号量hSem_Empty_Plate,這样母亲或者父亲可以放入水果到盘子裏面了讀者写者問題设信号量rMutex=1wMutex=1;count初始值為0,以来记录目前讀者的個数讀者進程:先申請rMutex,假如此時是第一种讀者,那么先申請wMutex,然後count加1,加完1之後释放rMutex(实际上count也是临界资源,用rMutex互斥体来控制讀者對count的修改,防止count的值出錯),開始讀数据,讀完数据後修改count的值,使count減1,同样的,也要先申請rMutex才能使count減1;當count=0的時候,此時阐明讀者已經所有讀完了,那么释放wMutex,写者可以申請到wMutex,進行写操作了。写者進程:先申請wMutex,假如申請不到资源,将处在等待状态,若申請到wMutex,進行写操作,這個時候讀者申請不到wMutex,也就是写的時候不能有讀者讀。當写者写完後,释放wMutex,此時讀者可以申請到wMutex,進而進行讀操作了。哲學家問題让奇数号的哲學家先取右手边的筷子,让偶数号的哲學家先取左手边的筷子.這样,任何一种哲學家拿到一只筷子之後,就已經制止了他邻座的一种哲學家吃饭的企图,除非某個哲學家一直吃下去,否则不會有人會饿死.心得体會通過本次试验對進程同步互斥深入理解,對進程通信中其中的三种方式管道,消息缓冲,共享内存的机制有一定理解,熟悉了Linux系统常用進程创立与管理的系统调用。對苹果桔子問題,哲學家吃饭問題以及讀者写者問題更深入理解。理解linux下实現進程通行的机制和對应的数据构造等试验分项4虚拟内存管理实验目的

熟悉操作系统的内存构造和页置换過程实验要求详细題目局部性原理演示(数组清零)(操作系统观测级)页面置换算法模拟演示(算法仿真实現级)实际系统内存分派演示(Linux,Windows平台)(操作系统观测级)系统平台Windows平台Linux平台实验原理步骤(算法流程)程序的局部性原理指程序在执行時展現出局部性规律,即在一段時间内,整個程序的执行仅限于程序中的某一部分。對应地,执行所访問的存储空间也局限于某個内存区域。局部性原理又体現為:時间局部性和空间局部性。時间局部性是指假如程序中的某条指令一旦执行,则很快之後该指令也許再次被执行;假如某数据被访問,则很快之後该数据也許再次被访問。空间局部性是指一旦程序访問了某個存储單元,则很快之後。其附近的存储單元也将被访問。此外,根据程序的局部性理论,Denning提出了工作集理论。所谓工作集是指進程运行時被频繁访問的页面集合。显然我們懂得只要使程序的工作集所有集中在内存中,就可以大大減少進程的缺页次数;否则會使進程在运行過程中频繁出現缺页中断,從而出現频繁的页面调入/调出現象,导致系统性能的下降,甚至出現“抖動”。划分工作集可以按定長時间或定長页面两种措施進行划分。當颠簸現象发生時,阐明系统的负荷過大,一般采用处理器均衡调度。另一种是控制缺页率,當缺页率到达上限時,则增長内存分派量;當缺页率到达下限時,就減少内存的分派量。#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intconstrow=10240;longarray[row][1024];intmain(){inti,j;TTimesystime;systime=Time();cout<<"行清零開始時间(放大了10倍):"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;inttemp;for(temp=0;temp<10;temp++)//将行清零時间放大10倍for(i=0;i<row;i++)for(j=0;j<1024;j++)array[i][j]=0;systime=Time();cout<<"行清零結束時间(放大了10倍):"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;systime=Time();cout<<"列清零開始時间:"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;for(j=0;j<1024;j++)for(i=0;i<row;i++)array[i][j]=0;systime=Time();cout<<"列清零結束時间:"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;cin.get();return0;}页面置换算法模拟演示#include"iostream.h"constintDataMax=100;constintBlockNum=10;intDataShow[BlockNum][DataMax];//用于存储要显示的数组boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据与否需要显示//intData[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1};//测试数据//intN=20;//输入页面個数intData[DataMax];//保留数据intBlock[BlockNum];//物理块intcount[BlockNum];//计数器intN;//页面個数intM;//最小物理块数intChangeTimes;voidDataInput();//输入数据的函数voidDataOutput();voidFIFO();//FIFO函数voidOptimal();//Optimal函数voidLRU();//LRU函数///*voidmain(intargc,char*argv[]){DataInput();//DataInput();//FIFO();//Optimal();//LRU();//return0;intmenu; while(true) { cout<<endl; cout<<"*菜單项选择择*"<<endl; cout<<"*******************************************************"<<endl; cout<<"*1-FIFO*"<<endl; cout<<"*2-Optimal*"<<endl; cout<<"*3-LRU*"<<endl; cout<<"*0-EXIT*"<<endl; cout<<"*******************************************************"<<endl; cin>>menu;switch(menu) { case1:FIFO();break; case2:Optimal();break; case3:LRU();break; default:break; } if(menu!=1&&menu!=2&&menu!=3)break; }}voidDataInput(){cout<<"請输入最小物理块数:";cin>>M;while(M>BlockNum)//不小于数据個数{cout<<"物理块数超過预定值,請重新输入:";cin>>M;}cout<<"請输入页面的個数:";cin>>N;while(N>DataMax)//不小于数据個数{cout<<"页面個数超過预定值,請重新输入:";cin>>N;}cout<<"請输入页面访問序列:"<<endl;for(inti=0;i<N;i++)cin>>Data[i];}voidDataOutput(){inti,j;for(i=0;i<N;i++)//對所有数据操作{cout<<Data[i]<<"";}cout<<endl;for(j=0;j<M;j++){cout<<"";for(i=0;i<N;i++)//對所有数据操作{if(DataShowEnable[j][i])cout<<DataShow[j][i]<<"";elsecout<<"";}cout<<endl;}cout<<"缺页次数:"<<ChangeTimes<<endl;cout<<"缺页率:"<<ChangeTimes*100/N<<"%"<<endl;}voidFIFO(){inti,j;boolfind;intpoint;inttemp;//临時变量ChangeTimes=0;for(j=0;j<M;j++)for(i=0;i<N;i++)DataShowEnable[j][i]=false;//初始化為false,表达没有要显示的数据for(i=0;i<M;i++){count[i]=0;//不小于等于BlockNum,表达块中没有数据,或需被替代掉//因此經這样初始化(321),每次替代>=3的块,替代後计数值置1,//同步其他的块计数值加1,成了(132),見下面先進先出程序段}for(i=0;i<N;i++)//對有所数据操作{//增長countfor(j=0;j<M;j++)count[j]++;find=false;//表达块中有無该数据for(j=0;j<M;j++){if(Block[j]==Data[i]){find=true;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论