您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统实习研究报告
实习一处理器调度一、实习内容选择一个调度算法,实现处理器调度。二、实习目的在采用多道程序设计的系统中,往往若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占有处理器。本实习模拟在单处理器情况下的处理器调度,加深了解处理器调度的工作。三、实习题目设计一个按优先数调度算法实现处理器调度的程序。[提示]:(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的格式为:进程名、指针、要求运行时间、优先数、状态。进程名——P1~P5。指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。要求运行时间——假设进程需要运行的单位时间数。优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态——假设两种状态,就绪,用R表示,和结束,用E表示。初始状态都为就绪状态。(2)每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3)处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。(4)进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。(5)若就绪队列为空,结束,否则,重复(3)。四、数据结构及符号说明进程的定义:structpcb{/*定义进程控制块PCB*/charname[10];/*进程名*/charstate;/*进程状态,就绪或者完成*/intsuper;/*进程优先级*/intneedtime;/*进程所需时间*/intruntime;/*进程已完成时间*/structpcb*link;/*指向下一进程*/}函数说明:1.voidinsert()功能:进程优先级排列函数,比较进程优先级,将其插入适当的位置。参数:super,依据进程优先级super来确定进程的插入位置。调用:被进程控制块函数和进程就绪函数调用。2.voidinput()功能:进程控制块函数参数:num,i,name,super,needtime调用:主函数main()调用3.voiddisp(PCB*pr)功能:进程显示函数,用于显示当前进程。参数:name,state,super,needtime,runtime调用:被进程查看函数check()调用4.voidcheck()功能:进程查看函数,用于显示当前运行进程和就绪队列状态。参数:PCB*prpr=ready调用:被主函数main()调用5.voiddestroy()功能:进程撤消函数,用于当进程运行结束时,撤消进程。参数:p-name调用:被进程就绪函数running()调用6.voidrunning()功能:进程就绪函数,当进程运行时间到,置进程就绪状态。参数:p-runtime调用:被主函数main()调用7.main()功能:主函数五、程序流程图六、实验源程序#includestdio.h#includestdlib.h#includeconio.h#definegetpch(type)(type*)malloc(sizeof(type))structpcb{/*定义进程控制块PCB*/charname[10];charstate;intsuper;intneedtime;intruntime;structpcb*link;}*ready=NULL,*p;typedefstructpcbPCB;voidsort()/*建立对进程进行优先级排列函数*/{PCB*first,*second;intinsert=0;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;}}intinput()/*建立进程控制块函数*/{inti,num;printf(\n请输入进程数?);scanf(%d,&num);for(i=0;inum;i++){printf(\n进程号P%d:\n,i);p=getpch(PCB);printf(\n输入进程名:);scanf(%s,p-name);printf(\n输入进程优先数:);scanf(%d,&p-super);printf(\n输入进程运行时间:);scanf(%d,&p-needtime);printf(\n);p-runtime=0;p-state='w';p-link=NULL;sort();/*调用sort函数*/}returnnum;}voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/{printf(\nqname\tstate\tsuper\tndtime\truneedtime\n);printf(|%s\t,pr-name);printf(|%c\t,pr-state);printf(|%d\t,pr-super);printf(|%d\t,pr-needtime);printf(|%d\t,pr-runtime);printf(\n);}voidcheck()/*建立进程查看函数*/{PCB*pr;printf(\n****当前正在运行的进程是:%s,p-name);/*显示当前运行进程*/disp(p);pr=ready;printf(\n****当前就绪队列状态为:\n);/*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr-link;}}voiddestroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/{printf(\n进程[%s]已完成.\n,p-name);free(p);}voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态*/{(p-runtime)++;if(p-runtime==p-needtime)destroy();/*调用destroy函数*/else{(p-super)--;p-state='w';sort();/*调用sort函数*/}}main()/*主函数*/{intlen,h=0;charch;len=input();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf(\nTheexecutenumber:%d\n,h);p=ready;ready=p-link;p-link=NULL;p-state='R';check();running();printf(\n按任一键继续......);ch=getchar();}printf(\n\n进程已经完成.\n);ch=getchar();}实习二主存空间的分配和回收一、实习内容主存储器空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。三、实习题目第一题:在可变分区管理方式下采用首次适应算法实现主存分配和回收。[提示]:(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。假定内存大小为128K,初始状态见右图。空闲区说明表格式为:起始地址——指出空闲区的起始地址;长度——一个连续空闲区的长度;状态——有两种状态,一种是“未分配”状态,另一种是“空表目”状态。(2)采用首次适应算法分配。运行时,输入一系列分配请求和回收请求。四、程序流程为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:起址长度状态第一栏14K12K未分配第二栏32K96K未分配空表目空表目其中:起址——指出一个空闲区的主存起始地址。长度——指出从起始地址开始的一个连续空闲的长度。状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的分配算法流程图:回收算法流程图:六、实验源程序#includestdio.h#includestdlib.h#includeconio.h#definen10/*假定系统允许的最大作业为,假定模拟实验中n值为10*/#definem10/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/#defineminisize100struct{floataddress;/*已分分区起始地址*/floatlength;/*已分分区长度,单位为字节*/intflag;/*已分配区表登记栏标志,用0表示空栏目*/}used_table[n];/*已分配区表*/struct{floataddress;/*空闲区起始地址*/floatlength;/*空闲区长度,单位为字节*/intflag;/*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/}free_table[m];/*空闲区表*/voidallocate(charJ,floatx)/*采用首次适应算法分配x大小的空间*/{inti,k;floatad;k=-1;for(i=0;im;i++)/*寻找空间大于xk的最小空闲区登记项k*/if(free_table[i].length=x&&free_table[i].flag==1)if(k==-1||free_table[i].lengthfree_table[k].length)k=i;if(k==-1)/*未找到可用空闲区,返回*/{printf(无可用空闲区\n);return;}/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/if(free_table[k].length-x=minisize){free_table[k].flag=0;ad=free_table[k].address;x=free_table[k].length;}else{free_table[k].length=free_table[k].length-x;ad=free_table[k].address+free_table[k].length;}/*修改已分配区表*/i=0;while(used_table[i].flag!=0&&in)/*寻找空表目*/i++;if(i=n)/*无表目填写已分分区*/{printf(无表目填写已分分区,错误\n);/*修正空闲区表*/if(free_table[k].flag==0)/*前面找到的是整个空闲分区*/free_table[k].flag=1;else{/*前面找到的是某个空闲分区的一部分*/free_table[k].length=free_table[k].length+x;return;}}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=x;used_table[i].flag=J;}return;}/*主存分配函数结束*/voidreclaim(charJ)/*回收作业名为J的作业所占主存空间*/{inti,k,j,s,t;floatS,L;/*寻找已分配表中对应登记项*/s=0;while((used_t
本文标题:操作系统实习研究报告
链接地址:https://www.777doc.com/doc-1721752 .html