ImageVerifierCode 换一换
格式:DOCX , 页数:62 ,大小:705.85KB ,
资源ID:10305665      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10305665.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验报告+进程调度+作业调度等.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验报告+进程调度+作业调度等.docx

1、操作系统实验报告+进程调度+作业调度等操作系统实验报告 1、进程调度2、作业调度3、主存空间的分配与回收4、文件系统学生学院_计算机学院_专业班级_网络工程(3)班_学 号_*62_学生姓名_张菲_ _指导教师_胡欣如 _2009 年 12 月 20 日 计算机 学院 网络工程 专业 3 班_组、学号 *62 姓名 张菲 协作者 无 教师评定_实验题目 进程调度 一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二、实验内容和要求编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。每个进程有一个进程控制块( PCB)表示

2、。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已运行时间、进程状态等等。 进程的到达时间及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)两种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用运行时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程

3、,并将它插入就绪队列队尾。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。三、实验主要仪器设备和材料硬件环境:IBM-PC或兼容机软件环境:C语言编程环境四、实验原理及设计方案1、进程调度算法:采用多级反馈队列调度算法。其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。2、实验步骤:(1)按先来先

4、服务算法将进程排成就绪队列。(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。(5)重复步骤(2)、(3)、(4),直到就绪队列为空。五、流程图 是 是六、结果过程及截图初始化队列输入所有进程后的进程信息如下:按Y键继续运行进程:按Y键继续运行进程:运行若干次后的状态:添加新的进程:七、所遇困难的解决以及心得体会在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每

5、个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。虽然实验原理很简单,但是在编写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。七、思考题1、分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。答:动态有限权算法:动态优先权是指在创建进程

6、时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。时间片的轮转法:系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。每运行一次,进程的需要时间减1,直到就绪队列为空!八、源代码#include#include#include#define getpch(type) (type*)malloc(sizeof(type)#def

7、ine NULL 0#define TIME 2/时间片长度typedef struct pcb/进程管理块 char name10;/进程名字 char state; /进程状态 int queue; /进程所在的队列 int ntime; /进程需要运行的时间 int rtime; /进程已经运行的时间 int etime; /进程在本队列可运行的时间片 struct pcb *link;PCB;PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; /就绪队列,进程插入位置的变量int geti() /使用户仅能输入整数 c

8、har ch; int i = 0; fflush(stdin); ch = getchar(); while(ch = n) printf(tf输入不能为空.请重新输入n); fflush(stdin); ch = getchar(); while(ch != n) if(ch 9 | ch link | (ps- link-queue - ps-queue) 1) pinsert = ps; else while (ps-link & ps -link-queue != (pfend -queue +2) ps = ps-link; pinsert = ps; void insert()/

9、插入进程 if(!ready ) ready = p; pfend = p; pinsert = p; else if(ready -queue = 1)/第一队列存在 p-link = pfend-link; pfend-link = p; pfend = p; findpos(); else p-link = ready; ready = p; findpos(); void input()/*建立进程控制块函数*/ int i,num; printf(n请输入进程的个数?); num = geti(); for(i=0; i name); printf(n输入进程运行时间:); p -n

10、time = geti(); printf(n); p-rtime=0; p-state=w; p-queue =1; p-etime = TIME; p-link=NULL; insert();/*调用insert函数*/ void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/ printf(nnamet statet queuet ntimet rtimet在队列可停留时间t n); printf(|%st,pr-name); printf( |%ct,pr-state); printf( |%dt,pr-queue); printf( |%dt,pr-ntime)

11、; printf( |%dt,pr-rtime); printf( |%dt,pr-etime); printf(n);void check()/*建立进程查看函数*/ PCB *pr; printf(n *当前正在运行的进程是:%s,ready-name);/*显示当前运行的进程*/ disp(ready); pr= ready -link; printf(n*当前就绪队列状态为:n);/*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void sort()/调整进程队列 if(!ready-link |ready-queue link-q

12、ueue) return; p = ready -link; ready -link = pinsert -link; pinsert -link = ready; pinsert = ready; ready = p; if (ready & ready - queue = pinsert -queue) findpos(); void addnew()/添加新的进程 if(ready -queue != 1) (ready - queue)+; ready-etime *= 2; ready - state=w; sort();/*调用sort函数*/ input(); else inpu

13、t(); void destroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/ printf(n进程%s已完成.n,ready-name); p = ready; ready = ready-link; free(p); if (ready & ready - queue = pinsert -queue) findpos();void running()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/ (ready - rtime)+; ready -etime -; if(ready-rtime = ready-ntime) destroy(); return; else

14、if(ready -etime = 0) int time = 2; (ready - queue)+; for(int i = 2; i != ready-queue; +i) time *= 2; ready-etime = time; ready - state=w; sort();/*调用sort函数*/ void main() char ch; input(); while(ready != NULL) printf(nThe execute name:%sn,ready -name); ready -state = R; check(); running(); printf(n按i

15、键添加新进程.按其他任意键继续运行.); fflush(stdin); ch = getchar(); if (ch = i| ch=I) addnew(); printf(nn 进程已经完成n); getchar(); 计算机 学院 网络工程 专业 3 班_组、学号 3107007062 姓名 张菲 协作者 无 教师评定_实验题目 作业调度 一、实验目的本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。二、实验内容和要求1、编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服

16、务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。三、实验主要仪器设备和材料 硬件环境:IBM-PC或兼容机软件环境:C语言编程环境四、实验原理及设计方案采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。采用先来先服务算法算法模拟设计作业调度程序。(1)、作业调度程序负责从输入井选择若干个作业进入主

17、存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2) 假定某系统可供用户使用的主存空间共100k,并有5台磁带机。3)流程图: 五、结果过程及截图 读取文件jobs.txt来初始化主存,磁

18、带机的个数,并打印出来。初始时间是9:00:按Y运行5分钟:按Y运行5分钟:按Y运行5分钟:多次运行后最后状态:六、所遇困难的解决以及心得体会这个实验是花的时间最多的一个实验,第一次做的时候由于理解有些问题,所以做错了。之后重新做了一遍,收获还是很多的,遇到了很多的细节问题,例如像是时间化成浮点数和浮点数化成时间等一些问题,从中也暴露了自己的编程能力欠缺,之后要多多的写程序。七、思考题1、 写出每种算法的调度策略,最后比较各种算法的优缺点。答:先来先服务算法是根据作业的进入时间来排序,到达时间短的先运行,优点是实现简单,缺点是运行时间慢。短作业优先算法是根椐作业的估计运行时间来排序,估计运行时

19、间短的先运行,优点是运行时间快,缺点是实现起来比较复杂。2、 选择调度算法的依据是什么?答:如果作业要求的速度不高,而且作业比较小型,那就最好用先来先服务算法。如果作业要求的速度高,作业流程复杂,那就最好用短作业优先算法。八、源代码#include#include#include#include#define getjcb() (JCB*)malloc(sizeof(JCB)typedef struct /资源的总量 int memory; int tape;RESOURCE;typedef struct JCB /作业控制块 char username20;/用户名 char jobname

20、10;/作业名 char state;/作业状态 char atime5;/到达时间 float rtime;/运行时间 RESOURCE resource;/资源数量 struct JCB*link;JCB;RESOURCE source = 100,5;JCB *pjcb =getjcb();/作业链表头char nowtime5;/现在时间,初始时间为9:00FILE* ignore(FILE *fp)/忽略文件中的空白符 if(feof(fp) return fp; char ch = fgetc(fp); while (!feof(fp) & (ch = | ch = ) ch =

21、fgetc(fp); /if(!feof(fp) return fp; fseek(fp, -1, SEEK_CUR); return fp; FILE* findchar(FILE *fp,char c)/在文件中找到一个字符的位置(读取文件时用) if(feof(fp) return fp; char ch = fgetc(fp); while (!feof(fp) & (ch != c) ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;void destory()/释放链表所占的内存 JCB *p = pjcb-link; while

22、(pjcb) free(pjcb); pjcb = p; if(p) p = p-link; float stof(char *time)/把时间转化为浮点型数 float h = 0, m = 0; int i = 0; while(timei != :) h = h*10 + timei - 0; i+; i+; while(timei != 0) m = m*10 + timei - 0; i+; return (h + m/60);char* ftos(double ftime)/把浮点型数值转化为时间 int h,m; h = int(ftime); m = int(ftime-h)

23、*60); sprintf(nowtime,%c:%c%c,h+0,int(m/10)+0,int(m%10)+0); return nowtime;float timesub(char *time1, char *time2)/两个时间相减,得到时间差 return stof(time1) - stof(time2);void print()/打印输出 JCB *p = pjcb-link; printf(现在时间是%sn,nowtime); printf(现在资源的数量%dtt%dn,source.memory,source.tape); printf(ttttttt 资源要求n); pr

24、intf(用户名t作业名t状态t到达时间t运行时间(小时)t主存(K)t磁带机n); while(p) printf(%st%st%ct%sttt%.2ft%dt%dn, p-username, p-jobname, p-state, p-atime, p-rtime, p-resource.memory,p-resource.tape); p = p-link; void sendsource()/为作业分配资源 JCB *p; p = pjcb-link; while(p)/为到达的作业调度 if(p-state = W & source.memory - p-resource.memor

25、y =0 & source.tape - p-resource.tape =0) p-state = R; source.memory -= p-resource.memory; source.tape -= p-resource.tape; printf(n%st%s被调入内存n, p-username, p-jobname); p = p-link; void init()/初始化,读取文件中的作业信息 FILE *fp; JCB *p= NULL,*q = pjcb ; if(fp = fopen(jobs.txt, r) = NULL) printf(Cannot open the f

26、ile!); exit(1); rewind(fp); fp = findchar(fp, A); while (!feof(fp) p = getjcb(); fscanf(fp, %s,p-username); fp = ignore(fp); fscanf(fp, %s,p-jobname); fp = ignore(fp); fscanf(fp, %c,&p-state); fp = ignore(fp); fscanf(fp, %s,p-atime); fp = ignore(fp); p-rtime = 0;/不初始化则会发生错误, fscanf(fp, %f,&(p-rtime); fp = ignore(fp); fscanf(fp, %d,&p-resource.memory); fp = ignore(fp); fscanf(fp, %d,&p-resource.tape); fp = ignore(fp); q-link = p; q = p; p -link = NULL; sendsource()

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1