《操作系统》实验指导书 3.pdf
操作系统实 验 指 导 书绍兴文理学院计算机系名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 42 页 -前言1实验总体目标通过学生自己动手设计实验验证理论知识,使学生掌握操作系统特征和功能,掌握不同调度算法下进程的调度、进程控制、进程调度与死锁,并必须掌握作业管理、存储器管理、设备管理和文件管理的主要原理。加深对操作系统基本原理理解。适用专业计算机科学与技术 先修课程C语言程序设计、计算机组成原理、数据结构 实验课时分配序号实验名称学时实验要求实验类型1 分析操作系统所面临的操作需求2 必修验证2 进程管理4 必修设计3 存储管理4 必修设计4 设备管理2 必修设计5 文件管理4 必修设计 实验环境有 70 台中等配置的计算机组成的小型局域网的实验室环境。计算机的具体要求:(1)Pentium 133Hz 以上的 CPU;(2)建议至少 256MB 的内存;(3)建议硬盘至少2GB,并有 1GB空闲空间。(4)安装 Windows 操作系统及C语言编译程序或Linux 虚拟环境。实验总体要求培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。实验要求做到:1)详细描述实验设计思想、程序结构及各模块设计思路;2)详细描述程序所用数据结构及算法;3)明确给出测试用例和实验结果;4)为增加程序可读性,在程序中进行适当注释说明;5)认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6)实验报告撰写要求结构清晰、描述准确逻辑性强;7)实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 42 页 -本实验的重点、难点及教学方法建议重点:理解进程调度中PCB的设计,以实现对进程的调度。难点:进程调度程序的设计,设备管理程序的设计。教学方法建议:力争在本指导书的帮助下,独立设计程序以加深理解。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 42 页 -实验一分析操作系统所面临的操作需求(一)实验目的使学生理解操作系统所面临的操作需求,掌握操作系统中的进程管理、存储管理、设备管理和文件管理等功能。(二)实验内容1.分析操作系统所面临的操作需求;2.熟悉实验环境;3.资料搜集与整理,进行实验的前期准备。熟悉编程环境本课程中的实验题目既可以在windows 下用控制台应用程序实现,也可以在linux 下用全屏幕程序实现。这里我们首先介绍在windows 下用 vc+6.0 设计控制台应用程序的步骤,然后介绍在linux 下用 C 语言编写全屏幕程序的步骤。1.windows 的控制台应用程序图 1-1 图 1-2图 1-3 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 42 页 -步骤 1:开机,单击“开始”按钮,选择“程序-Microsoft Visual Studio 6.0-Microsoft Visual C+6.0”进入 Microsoft Visual C+6.0。见图1-1。步骤 2:在 Microsoft Visual C+6.0 中,单击“File”菜单,选择“New”菜单命令,见图 1-2。步骤 3:在“Files”选项卡中选择“C+Source File”,见图 1-3 2.linux的 vi 应用编程登录Linux 是一个多用户多任务操作系统,多个用户可以拥有自己独立的用户账号登录提示:Red Hat Linux release 6.0(Hedwing)Kernel 2.2.5-15 on an i686 Login:此时输入用户户名(账号)并键入回车,则系统显示“passward”。在输入密码和回车。登录后:roothawk/root#表示是按root 方式登录,$表示是普通用户。Linux 大小写敏感,用“-”加参数zlinux:#ls F HowTo/HowToMin/linux nag/sag/获取帮助:Linux 带有联机手册,可以用man 命令来阅读Zlinux:$man ls 虚拟终端Linux 可有多个用户登录到同一个计算机,但一般微机只有一个终端难以体现。可以使用多个虚拟终端,用Alt+F1、Alt+F2 等来切换。退出系统在停止使用系统时,要退出系统。具体方法:exit 或 logout,或 Ctrl+D 关机如果没有用户在使用系统,可以关机。但是不能直接关闭电源,而要按正常顺序关机。一般用户是不能关机的,只有root 用户可以关机。方法:可以使用halt 或 shutdown 命令,也可以同时键入Ctrl+Alt+Del。Windows 虚拟机环境:登录到系统点击桌面“VMware”图标 Vmware Workstation 窗口 Commands Start this virtual machine 进入 fedora 后,用户名:root 口令:123456 使用编辑器vi 编辑文件1.进入 linux 的文本模式之后,在命令行键入vi filename.c 然后回车。下面作一些简单的解释:首先 vi 命令是打开vi 编辑器。后面的 filename.c 是用户即将编辑的c 文件名字,注意扩展名字是.c;当然,vi 编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi 打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2.最基本的命令I:当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I 键(insert),插入的意思,就可以进入编辑模式了。如下图所示:名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 42 页 -3.a与 i 是相同的用法4.当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc 键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入!q(不带 w,机尾部保存)。如下图所示:5.退出 vi 编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc filename.c-o outputfilename,其中 gcc是 c 的编译器。参数:filename.c 是刚才编辑的 c 文件(当然也可以是以前编写好的c 文件);后面中括号里面的参数是可选的,它是一个输出文件。如果不选,默认的输出文件是a.out,选了之后输出文件就是outputfilename.out 6.最后一步是运行程序,方法如下:./outputfilename.out 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 42 页 -实验二进程管理(一)实验目的掌握临界区的概念及临界区的设计原则;掌握信号量的概念、PV 操作的含义以及应用PV 操作实现进程的同步与互斥;分析进程争用资源的现象,学习解决进程互斥的方法;掌握进程的状态及状态转换;掌握常用的进程调度算法。(二)实验内容1分析进程的同步与互斥现象,编程实现经典的进程同步问题生产者消费者问题的模拟;2 编写允许进程并行执行的进程调度程序,在常用的进程(作业)调度算法:先来先服务算法、短作业优先算法、最高响应比优先算法、高优先权优先算法等调度算法中至少选择三种调度算法进行模拟,并输出平均周转时间和平均带权周转时间。本实验涉及内容较多,可以在两个题目里选择一个完成。编程实现经典的进程同步问题生产者消费者问题的模拟模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语同步原语所组成。本实验要求模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。此次用到的数据结构知识如下:typedef struct Pcb char name10;/进程名char state10;/运行状态char reason10;/若阻塞,其原因int breakp;/断点保护struct Pcb*next;/阻塞时的顺序Pcb,*link;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 42 页 -进程控制块结构定义两个进程:link p1;/生产者进程,link c1;/消费者进程。pc 程序计数器和link ready;就绪队列,link b_s1;s1 阻塞队列,link b_s2;s2 阻塞队列。实验指导:a.h 头文件#include#include#include/*malloc()等*/#include/*INT_MAX等*/#include/*EOF(=Z 或 F6),NULL*/#include/*atoi()*/#include/*eof()*/#include/*floor(),ceil(),abs()*/#include/*exit()*/#include using namespace std;#include#define BUF 10/缓存的大小#define MAX 20/最大可以输入的字符b.h 头文件/数据结构的定义和全局变量typedef struct Pcb char name10;/进程名 char state10;/运行状态 char reason10;/若阻塞,其原因 int breakp;/断点保护 struct Pcb*next;/阻塞时的顺序Pcb,*link;int s1,s2;/信号量link p1;/生产者进程link c1;/消费者进程char strMAX;/输入的字符串char bufferBUF;/缓冲池int len;/输入长度int sp=0;/string的指针进程名状态等待原因断点后继进程名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 42 页 -int in=0;/生产者指针int out=0;/消费者指针char temp;/供打印的临时产品char rec_pMAX;/生产记录int rp1=0;/生产记录指针char rec_cMAX;/消费记录int rp2=0;/消费记录指针link ready;/就绪队列link b_s1;/s1 阻塞队列link b_s2;/s2 阻塞队列int pc;/程序计数器int count;/字符计数器int con_cnt;/消费计数器c.h 头文件void init();/初始化void p(int s);/P 操作void v(int s);/V 操作void block(int s);/阻塞函数void wakeup(int s);/唤醒函数void control();/处理机调度void processor();/处理机执行void print();/打印函数void init()/初始化 s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb);/建立新的结点,并初始化为生产者 strcpy(p1-name,Producer);strcpy(p1-state,Ready);strcpy(p1-reason,Null);p1-breakp=0;p1-next=NULL;c1=(link)malloc(sizeof(Pcb);/建立新的结点,并初始化为消费者 strcpy(c1-name,Consumer);strcpy(c1-state,Ready);strcpy(c1-reason,Null);c1-breakp=0;c1-next=NULL;ready=p1;ready-next=c1;/初始化为生产进程在前,消费进程在后 c1-next=NULL;名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 42 页 -b_s1=NULL;b_s2=NULL;/阻塞进程为NULL pc=0;con_cnt=0;/消费计数器 void p(int s)if(s=1)/p(s1)s1-;if(s1breakp=pc;/保存断点 else/p(s2)s2-;if(s2breakp=pc;/保存断点 void v(int s)if(s=1)/v(s1)s1+;if(s1breakp=pc;/保存断点 else/v(s2)s2+;if(s2breakp=pc;/保存断点 void block(int s)/阻塞函数的定义 link p;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 42 页 -int num1=0;int num2=0;if(s=1)/生产进程strcpy(p1-state,Block);/改变状态strcpy(p1-reason,S1);/说明原因p=b_s1;while(p)num1+;p=p-next;/p 的值为 NULL,表示队尾 if(!b_s1)b_s1=p1;else p=p1;p1-next=NULL;printf(t*p1生产进程阻塞了!n);ready-breakp=pc;/保存断点ready=ready-next;/在就绪队列中去掉,指向下一个num1+;else/消费进程strcpy(c1-state,Block);strcpy(c1-reason,S2);p=b_s2;while(p)num2+;p=p-next;/p 的值为 NULL,表示队尾 if(!b_s2)b_s2=c1;else p=c1;ready-breakp=pc;/保存断点ready=ready-next;/在就绪队列中去掉,指向下一个c1-next=NULL;printf(t*c1消费进程阻塞了!n);num2+;printf(t*阻塞的生产进程个数为:%dn,num1);printf(t*阻塞的消费进程个数为:%dn,num2);void wakeup(int s)/唤醒函数的定义 link p;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 42 页 -link q=ready;if(s=1)/唤醒 b_s1 队首进程,生产进程队列p=b_s1;b_s1=b_s1-next;/阻塞指针指向下一个阻塞进程strcpy(p-state,Ready);strcpy(p-reason,Null);while(q)/插入就绪队列q=q-next;q=p;p-next=NULL;printf(t*p1生产进程唤醒了!n);else/唤醒 b_s2 队首进程,消费进程队列p=b_s2;b_s2=b_s2-next;/阻塞指针指向下一个阻塞进程strcpy(p-state,Ready);strcpy(p-reason,Null);while(q-next)/插入就绪队列q=q-next;q-next=p;p-next=NULL;printf(t*c1消费进程唤醒了!n);void control()/处理器调度程序 int rd;int num=0;link p=ready;if(ready=NULL)/若无就绪进程,结束return;while(p)/统计就绪进程个数 num+;p=p-next;/最终 p 变为 NULL printf(t*就绪进程个数为:%dn,num);time_t t;srand(unsigned)time(&t);rd=rand()%num;/随机函数产生随机数名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 42 页 -if(rd=1)p=ready;ready=ready-next;ready-next=p;p-next=NULL;strcpy(ready-state,Run);strcpy(ready-next-state,Ready);else strcpy(ready-state,Run);pc=ready-breakp;void processor()/模拟处理器指令执行 if(strcmp(ready-name,Producer)=0)/当前进程为生产者switch(pc)case 0:/produce printf(t*生产者生产了字符%cn,strsp);rec_prp1=strsp;/添加到生产记录sp=(sp+1)%len;pc+;ready-breakp=pc;/保存断点break;case 1:/p(s1)pc+;p(1);break;case 2:/put bufferin=rec_prp1;/放到缓冲区printf(t*%c字符成功入驻空缓存!n,bufferin);rp1+;in=(in+1)%BUF;pc+;ready-breakp=pc;/保存断点break;case 3:/v(s2)pc+;printf(t*释放一个s2 信号 n);v(2);break;case 4:/goto01 printf(t*生产进程goto 0 操作 n);pc=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 42 页 -count-;/剩余字符个数减1 printf(t*剩余字符count=%d 个n,count);ready-breakp=pc;/保存断点if(countstate,Stop);strcpy(p1-reason,Null);ready-breakp=-1;ready=ready-next;/在就绪队列中去掉 else/当前进程为消费者switch(pc)case 0:/p(s2)pc+;p(2);break;case 1:/get printf(t*消费者取字符!n);temp=bufferout;out=(out+1)%BUF;pc+;ready-breakp=pc;/保存断点break;case 2:/v(s1)pc+;printf(t*释放一个s1n);v(1);break;case 3:/consume printf(t*消费了字符%cn,temp);rec_crp2=temp;/添加到消费记录rp2+;con_cnt+;if(con_cnt=len)strcpy(c1-state,Stop);/完成态c1-breakp=-1;return;pc+;ready-breakp=pc;/保存断点break;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 42 页 -case 4:/goto0 printf(t*消费进程goto 0 操作 n);pc=0;ready-breakp=pc;/保存断点 void print()int i,j;printf(-生产者消费者模拟-n);printf(*模拟过程的字符串为:t);printf(%sn,&str);printf(*已生产:);for(j=0;j=rp1;j+)printf(%c,rec_pj);printf(n*空缓存:);for(j=rp2;j=rp1;j+)printf(%c,bufferj);printf(n*已消费:);for(j=0;jname,p1-state,p1-reason,p1-breakp);printf(%st%st%stt%dn,c1-name,c1-state,c1-reason,c1-breakp);printf(-n);printf(1.继续0.退出 n);scanf(%d,&i);if(i=0)exit(0);主程序#include a.h#include b.h#include c.h void main()printf(*生产者消费者模拟n);printf(-n);printf(*请输入字符串:n);scanf(%s,str);/string 数组存放将要产生的字符len=strlen(str);count=len;/输入字符的个数名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 42 页 -init();/初始化while(con_cntlen)/消费完所有的字符为结束 system(cls);/清屏操作printf(-模拟指令流程-n);control();/处理器调度程序processor();/模拟处理器指令执行print();/输出显示各个信息 printf(n程序结束!n);名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 42 页 -进程调度算法模拟进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU 的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。设计一个按先来先服务、时间片轮转法、优先数调度算法实现处理器调度的程序。实验指导:#include#include#include#include typedef struct node char name10;/*进程标识符*/int prio;/*进程优先数*/int round;/*进程时间轮转时间片*/int cputime;/*进程占用CPU时间*/int needtime;/*进程到完成还要的时间*/int arrivetime;/*进程到达时间*/int starttime;/*进程开始时间*/int finishtime;/*进程完成时间*/int servicetime;/*进程服务时间*/float turnaroundtime;/*进程周转时间*/float weightedturnaroundtime;/*进程带权周转时间*/int count;/*计数器*/char state;/*进程的状态*/struct node*next;/*链指针*/PCB;PCB*finish,*ready,*tail,*run;/*队列指针*/int N;/*进程数*/*将就绪队列中的第一个进程投入运行*/void firstin()run=ready;/*就绪队列头指针赋值给运行头指针*/run-state=R;/*进程状态变为运行态*/ready=ready-next;/*就绪对列头指针后移到下一进程*/名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 42 页 -/*标题输出函数*/void prt1(char a)switch(a)case 1:/*优先数法*/printf(名字进程占用CPU 时间进程到完成还要的时间优先级数状态n);break;case 2:/*时间片算法*/printf(名字进程占用CPU 时间进程到完成还要的时间计数器时间片状态n);break;case 3:/*先来先服务算法*/printf(名字到达时间开始时间服务时间完成时间周转时间带权周转时间状态 n);break;default:break;/*进程 PCB输出*/void prt2(char a,PCB*q)switch(a)case 1:/*优先数法的输出*/printf(%-10st%-10dt%-10dt%-10dt%cn,q-name,q-cputime,q-needtime,q-prio,q-state);break;case 2:/*轮转法的输出*/printf(%-10s%-20d%-15d%-10d%-10d%-cn,q-name,q-cputime,q-needtime,q-count,q-round,q-state);break;case 3:/*先来先服务算法输出*/printf(%s%10d%10d%10d%10d%10.1f%10.2ftt%cn,q-name,q-arrivetime,q-starttime,q-servicetime,q-finishtime,q-turnaroundtime,q-weightedturnaroundtime,q-state);break;default:break;/*输出函数*/void prt(char algo)PCB*p;prt1(algo);/*输出标题*/if(run!=NULL)/*如果运行指针不空*/prt2(algo,run);/*输出当前正在运行的PCB*/p=ready;/*输出就绪队列PCB*/while(p!=NULL)名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 42 页 -prt2(algo,p);p=p-next;p=finish;/*输出完成队列的PCB*/while(p!=NULL)prt2(algo,p);p=p-next;getch();/*压任意键继续*/*优先数的插入算法*/void insert1(PCB*q)PCB*p1,*s,*r;int b;s=q;/*待插入的PCB指针*/p1=ready;/*就绪队列头指针*/r=p1;/*r 做 p1 的前驱指针*/b=1;while(p1!=NULL)&b)/*根据优先数确定插入位置*/if(p1-prio=s-prio)r=p1;p1=p1-next;else b=0;if(r!=p1)/*如果条件成立说明插入在r 与 p1 之间*/r-next=s;s-next=p1;else s-next=p1;/*否则插入在就绪队列的头*/ready=s;/*轮转法插入函数*/void insert2(PCB*p2)tail-next=p2;/*将新的 PCB插入在当前就绪队列的尾*/名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 42 页 -tail=p2;p2-next=NULL;/*先来先服务插入函数*/void insert3(PCB*q)PCB*p1,*s,*r;int b;s=q;/*指针 s 指向新要插入的进程*/p1=ready;/*指针 p1 指向原来的进程的对首*/r=p1;/*使用指针r 指向 p1 前面的进程*/b=1;while(p1!=NULL)&b)if(p1-arrivetimearrivetime)r=p1;p1=p1-next;else b=0;if(r!=p1)r-next=s;s-next=p1;else s-next=p1;ready=s;/*优先数创建初始PCB信息*/void create1(char alg)PCB*p;int i,time;char na10;ready=NULL;/*就绪队列头指针*/finish=NULL;/*完成队列头指针*/run=NULL;/*运行队列头指针*/printf(请输入进程的名字和运行所需要的时间n);/*输入进程标识和所需时间创建PCB*/for(i=1;iname,na);p-cputime=0;p-needtime=time;p-state=W;p-prio=50-time;if(ready!=NULL)/*就绪队列不空则调用插入函数插入*/insert1(p);else p-next=ready;/*创建就绪队列的第一个PCB*/ready=p;void clrscr(void);printf(优先级调度算法模拟输出结果:n);printf(*n);prt(alg);/*输出进程PCB信息*/run=ready;/*将就绪队列的第一个进程投入运行*/ready=ready-next;run-state=R;/*轮转法创建进程PCB*/void create2(char alg)PCB*p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL;printf(请输入进程的名字和运行所需要的时间n);for(i=1;iname,na);p-cputime=0;p-needtime=time;名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 42 页 -p-count=0;/*计数器*/p-state=W;p-round=2;/*时间片*/if(ready!=NULL)insert2(p);else p-next=ready;ready=p;tail=p;void clrscr(void);printf(时间片轮转法模拟输出结果:n);n);prt(alg);/*输出进程PCB信息*/run=ready;/*将就绪队列的第一个进程投入运行*/ready=ready-next;run-state=R;/*先来先服务算法创建PCB*/void create3(char alg)PCB*p;int i;ready=NULL;run=NULL;finish=NULL;printf(请输入进程的名字、到达时间和运行所需要的时间n);for(i=0;iname);scanf(%d,&p-arrivetime);scanf(%d,&p-servicetime);p-starttime=0;p-finishtime=0;p-turnaroundtime=0;p-weightedturnaroundtime=0;p-state=W;if(ready!=NULL)insert3(p);名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 42 页 -else p-next=ready;ready=p;void clrscr(void);printf(先来先服务算法模拟输出结果:n);printf(*n);prt(alg);run=ready;/*将就绪队列的第一个进程投入运行*/ready=ready-next;run-state=R;/*优先数调度算法*/void priority(char alg)while(run!=NULL)/*当运行队列不空时,有进程正在运行*/run-cputime=run-cputime+1;run-needtime=run-needtime-1;run-prio=run-prio-3;/*每运行一次优先数降低3 个单位*/if(run-needtime=0)/*如所需时间为0 将其插入完成队列*/run-next=finish;finish=run;run-state=F;/*置状态为完成态*/run=NULL;/*运行队列头指针为空*/if(ready!=NULL)/*如果就绪队列不空*/firstin();/*将就绪对列的第一个进程投入运行*/else/*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/if(ready!=NULL)&(run-prioprio)run-state=W;insert1(run);firstin();/*将就绪队列的第一个进程投入运行*/prt(alg);/*输出进程PCB信息*/*时间片轮转法*/名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 42 页 -void roundrun(char alg)while(run!=NULL)run-cputime=run-cputime+1;run-needtime=run-needtime-1;run-count=run-count+1;if(run-needtime=0)/*运行完将其变为完成态,插入完成队列*/run-next=finish;finish=run;run-state=F;run=NULL;if(ready!=NULL)firstin();/*就绪对列不空,将第一个进程投入运行*/else if(run-count=run-round)/*如果时间片到*/run-count=0;/*计数器置 0*/if(ready!=NULL)/*如就绪队列不空*/run-state=W;/*将进程插入到就绪队列中等待轮转*/insert2(run);firstin();/*将就绪对列的第一个进程投入运行*/prt(alg);/*输出进程信息*/*先来先服务调度算法*/void FIFO(char alg)int time;while(run!=NULL)time=run-arrivetimetime?run-arrivetime:time;run-starttime=time;time=time+run-servicetime;run-finishtime=time;run-turnaroundtime=run-finishtime-run-arrivetime;run-weightedturnaroundtime=run-turnaroundtime/run-servicetime;run-next=finish;finish=run;run-state=F;名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 42 页 -run=NULL;if(ready!=NULL)run=ready;run-state=R;ready=ready-next;prt(alg);/*主函数*/int main()char algo;/*算法标记*/void clrscr(void);char mainmenu;do system(cls);/*清屏*/printf(n温馨提示:为保证您的操作得到预期效果,请规范输入您的信息_n);printf(nn);printf(tt+n);printf(tt|欢迎进入进程调度算法模拟演示系统|n);printf(tt|n);printf(tt|n);printf(tt|1优先级算法演示|n);printf(tt|n);printf(tt|2时间片轮转算法演示|n);printf(tt|n);printf(tt|3先来先服务算法演示|n);printf(tt|n);printf(tt|4退出系统|n);printf(tt|n);printf(tt+n);printf(请输入您的选择:n);scanf(%d,&algo);/*输入字符确定算法*/switch(algo)case 1:printf(您选择的是优先级算法模拟进程调度nn);printf(请输入进程数目n);scanf(%d,&N);/*输入进程数*/create1(algo);/*优先数法*/名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 42 页 -priority(algo);break;case 2:printf(您选择的是时间片轮转算法模拟进程调度nn);printf(请输入进程数目n);scanf(%d,&N);/*输入进程数*/create2(algo);/*轮转法*/roundrun(algo);break;case 3:printf(您选择的是先来先服务算法模拟进程调度nn);printf(请输入进程数目n);scanf(%d,&N);/*输入进程数*/create3(algo);FIFO(algo);break;case 4:printf(欢迎您再次使用进程调度算法模拟系统!n);exit(4);break;default:printf(输入有误 n);break;printf(n是否继续操作(y/n)?);fflush(stdin);mainmenu=getchar();while(mainmenu=y|mainmenu=Y);return 0;名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 42 页 -实验三存储管理(一)实验目的掌握物理内存和虚拟内存的基本概念;掌握重定位的基本概念及其要点,理解逻辑地址与绝对地址;掌握各种存储管理的实现方法,包括基本原理、地址变换和缺