《操作系统报告概要》由会员分享,可在线阅读,更多相关《操作系统报告概要(46页珍藏版)》请在金锄头文库上搜索。
1、沈阳建筑大学上机实验报告课程:操作系统题目:进程调度模拟实验学号:1306410106班级:计算机1301班姓名:周砚豪【实验目的】1.理解进程的概念,熟悉进程的组成;2.用高级语言编写和调试一个进程调度程序,以加深对进程调度算法的理解。【实验准备】1 几种进程调度算法l 短进程优先调度算法l 高优先权优先调度算法l 先来先服务调度算法l 基于时间片的轮转调度算法2 进程的组成l 进程控制块(PCB)l 程序段l 数据段3 进程的基本状态l 就绪W(Wait)l 执行R(Run)l 阻塞B(Block)【实验内容】1 例题设计一个有 N个进程共行的进程调度程序。进程调度算法:采用最高优先数优先
2、的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,
3、如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。2 调度算法的流程图【源程序代码】#include #include #define getpch(type) (type*)malloc(sizeof(type) typedef struct pcb char name10; char state; int super; int ntime; int rti
4、me; struct pcb* next; PCB; PCB *ready=NULL;PCB *p;void sort() PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) p-next=ready; ready=p; else first=ready; second=first-next; while(second!=NULL) if(p-super)(second-super) p-next=second; first-next=p; second=NULL; insert=1; else fi
5、rst=first-next; second=second-next; if(insert=0) first-next=p; void input() int i,num; printf(n 请输入进程数:); scanf(%d,&num); for(i=0;iname); printf(n 输入进程优先数:); scanf(%d,&p-super); printf(n 输入进程运行时间?:); scanf(%d,&p-ntime); printf(n); p-rtime=0;p-state=w; p-next=NULL; sort(); int space() int l=0; PCB* p
6、r=ready; while(pr!=NULL) l+; pr=pr-next; 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-n
7、ame); disp(p); pr=ready; printf(n *当前就绪队列状态为:n);while(pr!=NULL) disp(pr); pr=pr-next; void destroy() printf(n 进程%s已完成n,p-name); free(p); void running() (p-rtime)+; if(p-rtime=p-ntime) destroy(); else (p-super)-; p-state=w; sort(); int main() int len,h=0; char ch; input(); len=space(); while(len!=0)&
8、(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-next; p-next=NULL; p-state=R; check(); running(); printf(n 按任一键继续?.); ch=getchar(); printf(nn 进程已经完成n); ch=getchar();return 0; 【实验截图】【实验体会】通过本次实验,我理解了进程的概念,熟悉了进程的组成,并且使用高级语言编写并调试通过了一个进程调度程序,由此我加深了对进程调度算法的理解。并在编程的过程
9、中复习了以往学过的知识。沈阳建筑大学上机实验报告课程:操作系统题目:银行家算法模拟实验学号:1306410106班级:计算机1301班姓名:周砚豪【实验目的】1.理解死锁的概念;2.用高级语言编写和调试一个银行家算法程序,以加深对死锁的理解。【实验准备】1 产生死锁的原因l 竞争资源引起的死锁l 进程推进顺序不当引起死锁2产生死锁的必要条件l 互斥条件l 请求和保持条件l 不剥夺条件l 环路等待条件3处理死锁的基本方法l 预防死锁l 避免死锁l 检测死锁l 解除死锁【实验内容】1 实验原理银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再
10、进而检查下一个能完成工作的客户。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。与预防死锁的几种方法相比较,限制条件少,资源利用程度提高了。缺点:该算法要求客户数保持固定不变,这在多道程序系统中是难以做到的;该算法保证所有客户在有限的时间内得到满足,但实时客户要求快速响应,所以要考虑这个因素;由于要寻找一个安全序列,实际上增加了系统的开销.Banker algorithm 最重要的一点是:保证操作系统的安全状态!这也是操作系统判断是否分配给一个进程资源的标准!那什么是安全状态?举个小例子,进程P 需要申请8个资源(假设都是一样的),已经申请了5个资源,还差3个资源。若这个时候操
11、作系统还剩下2个资源。很显然,这个时候操作系统无论如何都不能再分配资源给进程P了,因为即使全部给了他也不够,还很可能会造成死锁。若这个时候操作系统还有3个资源,无论P这一次申请几个资源,操作系统都可以满足他,因为操作系统可以保证P不死锁,只要他不把剩余的资源分配给别人,进程P就一定能顺利完成任务。2实验题目设计五个进程P0,P1,P2,P3,P4共享三类资源A,B,C的系统,A,B,C的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资
12、源后的有关资源数据。3算法描述我们引入了两个向量:Resourse(资源总量)、Available(剩余资源量) 以及两个矩阵:Claim(每个进程的最大需求量)、Allocation(已为每个进程分配的数量)。它们共同构成了任一时刻系统对资源的分配状态。向量模型: R1R2R3矩阵模型:R1R2P1P2P3这里,我们设置另外一个矩阵:各个进程尚需资源量(Need),可以看出Need = Claim Allocation因此,我们可以这样描述银行家算法:设Requesti是进程Pi的请求向量。如果Requesti , j=k,表示Pi需k个Rj类资源。当Pi发出资源请求后,系统按下述步骤进行检查:(1) if (Requesti=Needi) goto (2);else error(“over request”);(2) if (Requesti=Availablei) goto (3);else wait();(3) 系统试探性把要求资源分给Pi(类似回溯算法)。并根据分配修改下面数据结构中的值。Availablei = Availablei Requesti ;Allocationi = Allocationi + Request