一.课程设计的目的和意义目的:1. 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容。
2. 通过调试典型例题或习题积累调试程序的经验。
3. 通过完成辅导教材中的编程题,逐渐培养学生的编程能力,用计算机解决实际问题的能力。
意义:1. 有助于加深我们对操作系统这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。
通过课程设计,我们可以真正理解其内涵。
2. 有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题能力。
即使是一个简单的程序,依然需要学生有条不理的构思。
3. 有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或细心,那么可能就导致语法错误,从而无法得出运行结果。
那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。
二进程调度算法模拟1 . 设计目的通过动态优先权算法的模拟加深进程概念和进程调度过程的理解。
2 . 设计要求写出带有完整标注的程序代码(可以用Java或C/C++实现,要求每个语句都要有标注)。
3 . 使用动态优先权的进程调度算法的模拟3.1算法思路分析动态优先权是指在创建进程时所赋予的优先权,可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能.若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法.因此,通过c程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模块,构造一个PCB结构体即进程控制块结构体,用来记录当前进程的的相关状态信息,包括进程标识符、处理机状态、进程调度信息、进程控制信息。
并通过C语言模拟计算机的动态优先调度算法,对构建的PCB进程进行模拟调度和运行,从而实现用计算机对进程的调度过程进行过程模拟。
主要要构建的函数有:进程控制块函数input:输入各进程的基本信息进程优先级排列函数sort:用于对进程的优先级进行排列当前进程显示函数disp:用于显示当前进程进程查看函数check:检查等待队列的进程是否进入就绪队列进程就绪函数running:进程运行时间到,置就绪状态系统将所有就绪队列按优先级高低排成一个队列,每次调度时,将CPU分配给优先级最高的进程,并令其执行一个时间片,而后中断,寻找并运行下一个优先级最高的进程。
而所有进程的优先权在随进程的推进或随其等待时间的增加而增加,而被调度之后的程序则降低一定的优先级,从而使所有进程都有运行的机会,从而保证系统能在给定的时间内响应所有用户的请求。
优先权的变化规律可描述为:由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比RP,即优先权=等待时间+要求服务时间要求服务时间。
被运行过的进程优先权减一。
3.2算法流程图主流程图3.3主要数据结构设计1.包含PCB信息的结构体(1)进程标识数ID。
(2)进程优先级PRIORITY,并规定优先级越大的进程,其优先权越高。
(3)进程已占用的CPU时间CPUTIME。
(4)进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0 (5)进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
(6)进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
(7)进程状态STATE。
(8)队列指针NEXT,用来将PCB排成队列。
用算法描述为struct pcb { // 定义进程控制块PCBchar name[10]; //定义进程名称char state; //进程状态int super; //优先数int ntime; //需要运行的时间int rtime; //已占用的CPU时间struct pcb* link; //指向进程的下一个进程的指针}*ready=NULL,*p;2.用队列结构存储进程序列3.4算法代码实现1.建立对进程进行优先级排列函数void sort() // 建立对进程进行优先级排列函数{ PCB *first, *second; //定义指向当前进程和插入进程的指针int insert=0;//各进程按优先数大小从大到小排列if((ready==NULL)||((p->super)>(ready->super))) //优先级最大者,插入队首{p->link=ready; //p进程的下一个进程为原队首进程ready=p; //队首进程为优先级最大者}else //进程比较优先级,插入适当的位置中{ first=ready;//队首进程不变second=first->link; //第二个进程则在当前进程后面while(second!=NULL)//while循环,各进程比较优先级{ if((p->super)>(second->super)) //若插入进程比当前进程优先数大{ //插入到当前进程前面p->link=second; //当前进程赋给插入进程的后面那个进程first->link=p;//插入进程在放在当前进程所在位置second=NULL;//当前进程为空insert=1; //进程的排列与各优先数不对应}else //插入进程优先数最低,则插入到队尾{ first=first->link; //将第一个进程的下一进程赋给firstsecond=second->link;//将第二个进程的下一进程赋给second}}if(insert==0) first->link=p; //若插入进程比当前进程优先数小,则插入到当前进程后面}}2.建立进程控制块函数void input() //建立进程控制块函数{ int i,num; //定义进程号以及进程个数system("cls"); //清屏printf("\n 请输入进程号:"); //输出输入提示scanf("%d",&num); //输入进程号for(i=0;i<num;i++) //若进程号不超过进程个数{ printf("\n 进程号No.%d:\n",i);//输出进程号p=getpch(PCB); //p进程的pcb结构printf("\n 输入进程名:"); //输出输入进程名提示scanf("%s",p->name); //输入进程名printf("\n 输入进程优先数:");//输出输入进程优先数提示scanf("%d",&p->super); //输入进程优先数printf("\n 输入进程运行时间:");// 输出输入进程运行时间提示scanf("%d",&p->ntime);//输入进程运行时间printf("\n");//换行p->rtime=0;//已占用cpu时间为0p->state='w';//进程状态为就绪p->link=NULL;//当前进程的下一个进程为sort(); // 调用sort函数}}建立进程显示函数,用于显示当前进程void disp(PCB * pr) //建立进程显示函数,用于显示当前进程{ printf("\n qname \t state \t super \t ntime \t rtime \n");printf("%s\t",pr->name);//显示进程名printf("%c\t",pr->state); //显示进程状态printf("%d\t",pr->super);//显示进程优先级printf("%d\t",pr->ntime); //显示进程需要运行的时间printf("%d\t",pr->rtime);//显示进程占用CPU时间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 running() // 建立进程就绪函数(进程运行时间到,置就绪状态{(p->rtime)++;(p->super)--;//进程优先权减1p->state='w';//进程状态为就绪sort(); //调用sort函数}3.5算法运行分析初始界面。