操作系统课程设计实验一进程管理一、实验目的1.开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。2.开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。二、需求分析用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。三、实验环境Windows操作系统、VC++6.0C语言(C-free5.0)四、详细设计程序流程图数据结构:算法设计:state=0杀死state=1就绪state=2等待state=3运行(1)进程控制块信息structjincheng_type{intpid;intyouxian;intdaxiao;intstate;intmessage;};(2)进程信息初始化structjincheng_typeneicun[20];intshumu=0,pid_l;intmax=0;intnumber=0;(3)创建进程的算法voidcreate()/*创建一个进程的示例*/{if(shumu=20){printf(\n内存已满,请先结束或换出进程\n);}else{printf(\n请输入新进程的pid\n);scanf(%d,&neicun[shumu].pid);printf(\n请输入新进程的优先级\n);scanf(%d,&neicun[shumu].youxian);printf(\n请输入新进程的大小\n);scanf(%d,&neicun[shumu].daxiao);printf(\n创建进程时令其状态为就绪\n);scanf(%d,&neicun[shumu+1].daxiao);printf(\n创建进程信息\n);scanf(%d,&neicun[shumu+1].message);neicun[shumu].state=1;shumu++;}}(4)查看运行进程算法voidrun(){intmax=0;intvpid;for(inti=0;ishumu;i++){if((neicun[i].flag==1)&&(neicun[i].youxian=neicun[max].youxian))max=i;}neicun[max].flag=3;printf(\n当前运行进程程序名:\n%d,neicun[max].pid);printf(\n该进程的优先级:\n%d,neicun[max].youxian);printf(\n该进程的运行时间:\n%d,neicun[max].daxiao);printf(\n该进程的状态:\n%d,neicun[max].flag);printf(\n该进程的信息是:\n%d,neicun[max].message);vpid=getch();}(5)换出进程算法voidhuanchu(){inti,k,d;for(inti=0;ishumu;i++){if((neicun[i].flag==1)&&(neicun[i].youxian=neicun[max].youxian))max=i;}neicun[max].flag=3;if(max==shumu-1)printf(没有处于等待序列的进程);else{for(k=max+1;kshumu;k++)neicun[k].flag=2;printf(\n处于等待序列的进程有:);for(k=max+1;kshumu;k++)printf(\n%d,neicun[k].pid);printf(\n请选择要唤醒的进程:);scanf(%d,&k);i=max;while(neicun[i].pid!=k)i++;neicun[i].flag=1;printf(\n%d进程已被唤醒,k);d=getche();}}(6)杀死进程算法voidkill()/*杀死某个进程*/{inti=0,k,b;printf(\n请输入要杀死的进程:);scanf(%d,&k);while(neicun[i].pid!=k)i++;neicun[i].daxiao=0;neicun[i].pid=0;neicun[i].youxian=0;neicun[i].flag=0;if(i==(shumu-1))shumu--;else{for(intj=i+1;jshumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].youxian=neicun[j].youxian;neicun[j-1].daxiao=neicun[j].daxiao;neicun[j-1].flag=neicun[j].flag;}shumu--;}printf(\n进程%d已被杀死,k);b=getche();(7)进程通信算法inttongxun(){inttpid1,tpid2;intbuffer;intd;printf(\n请输入通信源进程pid\n);scanf(%d,&tpid1);printf(\n请输入通信目的进程pid\n);scanf(%d,&tpid2);if(tpid10&&tpid120&&neicun[tpid1].state==1){buffer=neicun[tpid1].message;neicun[tpid1].message=neicun[tpid2].message;neicun[tpid2].message=buffer;printf(\n源进程的消息是:%d\n,neicun[tpid1].message);printf(\n目的进程的消息是:%d\n,neicun[tpid2].message);}else{printf(\n所查看运行进程不存在\n);}printf(\n请按回车退出进程通信\n);d=getche();}五、程序测试过程(截图)初始化界面,选择1-6实现功能:创建进程1:创建进程3:查看运行进程:选择唤醒处于等待态的进程:杀死某个进程:进程之间通信:退出系统:六、测试结果分析选择功能1创建进程,然后选择功能2查看进程以检测进程是否创建成功;选择功能3以唤醒处于等待序列中的进程;功能4将进程杀死;选择功能5进行进程之间的通信,将两个进程的消息进行交换。实验二:进程调度一、实验目的设计一个有N个进程共行的进程调度程序。进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。二、需求分析每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪1、运行3、或完成0三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。三、实验环境Windows操作系统、VC++6.0C语言(C-free5.0)四、详细设计程序流程图模块划分:1.定义进程控制块PCBstructpcb{/*定义进程控制块PCB*/charname[10];charstate;intsuper;intntime;intrtime;structpcb*link;}*ready=NULL,*p;typedefstructpcbPCB;2.建立进程优先级排列函数sort()/*建立对进程进行优先级排列函数*/{PCB*first,*second;intinsert=0;}3.优先级最大者采用先来先服务插入队首,优先级最低的插入队尾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;}}4.建立进程控制块,进程撤销函数,进程就绪函数disp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/check()/*建立进程查看函数*/destroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/running()/*建立进程就绪函数(进程运行时间到,置就绪状态*/五、程序测试过程(截图)输入总共要输入的进程数:输入进程1的信息:输入进程2的信息第一个时间片:将优先级最高的3投入运行,其他处于等待状态:第二个时间片:将3的优先级减一,将优先级第二的2进程投入运行其他处于等待状态:第三个时间片:将进程2的优先级减一,将优先级第一的进程3投入运行,其他处于等待状态:第四个时间片:将进程3的优先级减一,将队列首元进程1投入运行,其他处于等待状态:第五个时间片:将队列首元进程2投入运行,进程3处于等待状态:第六个时间片:将进程3投入运行,此时无等待进程:完成,安任意键退出:实验三存储管理一、实验目的:设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。(1)先进先出的算法(FIFO)(2)最近最少使用算法(LRU)(3)最佳淘汰算法(OPT)(4)最少访问页面算法(LFU)(5)最近最不经常使用算法(NUR)(6)时钟算法(CLOCK)命中率=(1一页面失效次数)/页地址流长度二、需求分析〈程序设计〉本实验的程序设计基本上按照实验内容进行。即首先用Srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。相关定义如下:1.数据结构(1)页面类型typedefstruct{intpn,pfn,counter,time;}pl_type;其中pn为页号,pfn为面号,counter为一个周期内访问该页面次数,time为访问时间。(2)页面控制结构structpfc_struct{intpn,pfn;structpfc_struct*next;};typedefstructpfc_structpfc_type;pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;其中pfc[total_vp]定义用户进程虚页控制结构,*freepf_head为空页面头的指针,*busypf_head为忙页面头的指针,*busypf_tail为忙页面尾的指针。2.函数定义(1)voidinitializd():初始化函数,给每个相关的页面赋值。(2)voidFIFO():计算使用FIFO算法时的命中率。(3)voidLRU():计算使用LRU算法时的命中率。(4)voidOPT():计算使用OPT算法时的命中率。(5)voidLFU():计算使用LFU算法时的命中率。(6)voi