广东工业大学操作技巧系统-实验报告-4份全.doc

收藏

编号:2604350    类型:共享资源    大小:565.02KB    格式:DOC    上传时间:2020-04-23
10
金币
关 键 词:
广东工业大学 操作 技巧 技能 系统 实验 试验 报告 讲演 呈文
资源描述:
^. 操作系统实验报告 学生学院____ 计算机学院______ 专业班级_10级计算机科学与技术5班 学 号__3210006071__________ 学生姓名___陈丹飞_____________ 指导教师________孙为军_______ 2013年 1 月 10 日 目录 1 实验一 进程调度………………………………………………………………1 2 实验二 作业调度……………………………………………………………… 3 实验三 可变式分区分配……………………………………………………… 4 实验四 简单文件系统………………………………………………………… 试验一 进程调度 一、实验目的: 编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容:以两种典型算法为例说明实现的算法 (一)、最高优先数优先的调度算法 1、实验原理 进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所有进程都完成为止。 2、源代码: #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 struct pcb { /* 定义进程控制块PCB */ char name[10]; /*定义进程名称*/ char state; /*进程状态*/ int super; /*优先数*/ int ntime; /*需要运行的时间*/ int rtime; /*已占用的CPU时间*/ struct pcb* link; }*ready=NULL,*p; typedef struct pcb PCB; /*pcb表*/ sort() /* 建立对进程进行优先级排列函数*/ { PCB *first, *second; int insert=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; } } input() /* 建立进程控制块函数*/ { int i,num; clrscr(); /*清屏*/ 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->link=NULL; sort(); /* 调用sort函数*/ } } int space() { int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l); } disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ { printf("\n qname \t state \t super \t ndtime \t runtime \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); printf("\n"); } check() /* 建立进程查看函数,检查等待队列的进程是否进入就绪队列*/ { PCB* pr; printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p); pr=ready; printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } } destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ { printf("\n 进程 [%s] 已完成.\n",p->name); free(p); } running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else { (p->super)--; p->state=w; sort(); /*调用sort函数*/ } } main() /*主函数*/ { int len, h=0; char ch; input(); len=space(); while((len!=0)&&(ready!=NULL)) { ch=getchar(); h++; printf("\n The execute number:%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(); } 3、运行结果: 请输入进程号?5 进程号No.0: 输入进程名:A 输入进程优先数:2 输入进程运行时间:1 进程号No.1: 输入进程名:B 输入进程优先数:3 输入进程运行时间:1 进程号No.2: 输入进程名:C 输入进程优先数:1 输入进程运行时间:1 进程号No.3: 输入进程名:D 输入进程优先数:4 输入进程运行时间:1 进程号No.4: 输入进程名:E 输入进程优先数:5 输入进程运行时间:1 The execute number:1 ****当前正在运行的进程是:E Qname state super ndtime runtime E R 5 1 0 ****当前就绪队列状态为: Qname state super ndtime runtime D w 4 1 0 B w 3 1 0 A w 2 1 0 C w 1 1 0 进程[E]已完成 按任一键继续…… The execute number:2 ****当前正在运行的进程是:D Qname state super ndtime runtime D R 4 1 0 ****当前就绪队列状态为: Qname state super ndtime runtime B w 3 1 0 A w 2 1 0 C w 1 1 0 进程[D]已完成 按任一键继续…… The execute number:3 ****当前正在运行的进程是:B Qname state super ndtime runtime B R 3 1 0 ****当前就绪队列状态为: Qname state super ndtime runtime A w 2 1 0 C w 1 1 0 进程[B]已完成 按任一键继续…… The execute number:4 ****当前正在运行的进程是:A Qname state super ndtime runtime A R 2 1 0 ****当前就绪队列状态为: Qname state super ndtime runtime C w 1 1 0 进程[A]已完成 按任一键继续…… The execute number:5 ****当前正在运行的进程是:c Qname state super ndtime runtime c R 1 1 0 ****当前就绪队列状态为: 进程[C]已完成 按任一键继续…… 进程已经完成 (二)、简单轮转法 1、实验原理 在分时系统中,都毫无例外采用时间片轮转法。在一种简单的轮转法中,系统将所有就绪进程按FIFO规则排成一个队列,把CPU分配给队首进程,并规定它执行一给定的时间如100ms,称此时间间隔为时间片。当时间片完成时,系统产生一个时钟中断,剥夺该进程的执行,将它送至就绪队列的末尾,并把处理机分配给就绪队列的新队首进程,同样也让它执行一个时间片。这样,就绪队列中的所有进程均可获得一个时间片的处理机而运行。就绪队列中的进程在依次执行时,可能发生以下三种情况:(1)进程未用完一个时间片就结束,这时系统应提前调度;(2)进程在执行过程中提出I/O请求而阻塞,系统应将它放入相应的阻塞队列并引起调度;(3)进程完成一个时间片后尚未完成,系统应将它重新放到就绪队列的末尾,等待下次执行。由于在分时系统中,键盘命令的执行时间较短,大多能在一个时间片内执行完毕,因此分时系统的实际响应时间将比Nq(N是同时性用户数,q是时间片大小)小。 2、源代码: #include /*定义一个pcb的结构体*/ struct pcb { char name; /*进程名*/ int time; /*进程执行时间*/ }; void main() { int n,i,j,flag=1; struct pcb a[100]; /*最多可以有100个进程*/ printf("输入进程 个数:"); scanf("%d",&n); getchar();/*接收回车*/ for(i=0;i0) /*若进程数为空,结束程序*/ { if(a[i].time!=0) /*就绪队列是否为空*/ { printf("%c",a[i].name); /*进程执行一次,打印出该进程*/ a[i].time--; /*使该进程占用的时间片减1*/ } for(j=0;jname,&p->ts,&p->ntime); p->state=W; p->link=NULL; if(head==NULL) head=q=p; else{ q->link=p; q=p; } }} void print(JCB *pr,int m){ JCB *p; printf("\ntime=%d",time); if(m==3){ printf("\n作业名\t状态\t到达时间\t服务时间\t优先权\t\t完成时间\t周转时间\t带权周转时间\n"); printf("%s\t%c\t%d\t%d\t%4.2f\t%d\t%4.2f\t%4.2f\n", pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->tc,pr->ti,pr->wi); } else { printf("\n作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间\n"); printf("%s\t%c\t%d\t%d\t%d\t%4.2f\t%4.2f\n", pr->name,pr->state,pr->ts,pr->ntime,pr->tc,pr->ti,pr->wi); } p=head; do{ if(p->state==W) if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\n", p->name,p->state,p->ts,p->ntime,p->super); } else{ printf("%s\t%c\t%d\t%d\n", p->name,p->state,p->ts,p->ntime); } p=p->link; }while(p!=NULL); p=head; do{ if(p->state==F) if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\t%d\t%4.2f\t%4.2f\n", p->name,p->state,p->ts,p->ntime,p->super,p->tc,p->ti,p->wi); } else{printf("%s\t%c\t%d\t%d\t%d\t%4.2f\t%4.2f\n", p->name,p->state,p->ts,p->ntime,p->tc,p->ti,p->wi); } p=p->link; }while(p!=NULL); } void last(){eti/=n;ewi/=n; printf("\n平均周转时间=%7.3f\n平均带权周转时间=%7.3f\n",eti,ewi); } super(){JCB *padv; padv=head; do{ if(padv->state==W&&padv->ts<=time) padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime; padv=padv->link; }while(padv!=NULL); } void hrn(m){JCB *min; int i,iden; for(i=0;istate==W&&p->ts<=time) if(iden){ min=p;iden=0;} else if(p->super>min->super) min=p; p=p->link; }while(p!=NULL); if(iden) {i--;time++;printf("\ntime=%d",time); if(time>1000){printf("\nruntime is too long...error...");getch();} } else{ running(min,m); } }} void sjf(int m){ JCB *min; int i,iden; for(i=0;istate==W&&p->ts<=time) if(iden){ min=p;iden=0; } else if(p->ntimentime) min=p; p=p->link; }while(p!=NULL) ; if(iden) {i--;printf("\ntime=%d",time);time++; if(time>100){printf("\nruntime is too long...error");getch();} } else{running(min,m);} }} fcfs(int m){ int i,iden; for(i=0;istate==W&&p->ts<=time) iden=0; if(iden)p=p->link; }while(p!=NULL&&iden) ; if(iden) { i--;printf("\ntime=%d",time);time++; if(time>100){printf("\nruntime is too long...error");getch();} } else{ running(p,m); } }} running(JCB *p,int m){ p->tb=time;p->state=R; p->tc=p->tb+p->ntime; p->ti=(float)(p->tc-p->ts); p->wi=(float)(p->ti/p->ntime); eti+=p->ti; ewi+=p->wi; print(p,m); time+=p->ntime; p->state=F; printf("\n作业%s已经完成!\npress any key to continue...\n",p->name); getch(); } void runjcb(int m){ printf("\n\n作业开始运行"); switch(m){case 1:fcfs(m);break; case 2:sjf(m);break; case 3:hrn(m);break; default:printf("\n运行错误!\n");exit(); }} start(){ int m; char str[100]="\n选择调度算法:\n1.先来先服务FCFS\n2.最短作业优先SJF\n3.响应比高者优先HRN\n" ; printf("%s",str); m=getch()-48; inital(); if(1<=m&&m<=3) runjcb(m); else { printf("\n选择错误,请重新选择!\n"); start(); } last(); } main(){start(); printf("\n所有作业完成!"); getch(); } 运行结果: 1、选择先来先服务FCFS 选择调度算法: 1.先来先服务FCFS 2.最短作业优先SJF 3.响应比高者优先HRN 输入作业数: 5 输入: 作业名 到达时间 服务时间 A 0 4 B 1 3 C 2 5 D 3 2 E 4 4 作业开始运行 Time=0 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 A R 0 4 4 4.00 1.00 B W 1 3 C W 2 5 D W 3 2 E W 4 4 作业A已经完成 Press any key to continue… Time=4 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 B R 1 3 7 6.00 2.00 C W 2 5 D W 3 2 E W 4 4 A F 0 4 4 4.00 1.00 作业B已经完成 Press any key to continue… Time=7 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 C R 2 5 12 10.00 2.00 D W 3 2 E W 4 4 A F 0 4 4 4.00 1.00 B F 1 3 7 6.00 2.00 作业C已经完成 Press any key to continue… Time=12 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 D R 3 2 14 11.00 5.50 E W 4 4 A F 0 4 4 4.00 1.00 B F 1 3 7 6.00 2.00 C F 2 5 12 10.00 2.00 作业D已经完成 Press any key to continue… Time=14 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 E R 4 4 18 14.00 3.50 A F 0 4 4 4.00 1.00 B F 1 3 7 6.00 2.00 C F 2 5 12 10.00 2.00 D F 3 2 14 11.00 5.50 作业E已经完成 Press any key to continue… 平均周转时间=9.000 平均带权周转时间=2.800 所有作业完成! 2、选择最短作业优先SJF(简要过程) … … 作业开始运行 Time=0 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 A R 0 4 4 4.00 1.00 B W 1 3 C W 2 5 D W 3 2 E W 4 4 作业A已经完成 Press any key to continue… Time=4 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 D R 3 2 6 3.00 1.50 B W 1 3 C W 2 5 E W 4 4 A F 0 4 4 4.00 1.00 作业D已经完成 Press any key to continue… Time=6 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 B r 1 3 9 8.00 2.67 C W 2 5 E W 4 4 A F 0 4 4 4.00 1.00 D F 3 2 6 3.00 1.50 作业B已经完成 Press any key to continue… Time=9 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 E R 4 4 13 9.00 2.25 C W 2 5 A F 0 4 4 4.00 1.00 B F 1 3 9 8.00 2.67 D F 3 2 6 3.00 1.50 作业E已经完成 Press any key to continue… Time=13 作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间 C R 2 5 18 16.00 3.20 A F 0 4 4 4.00 1.00 B F 1
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:广东工业大学操作技巧系统-实验报告-4份全.doc
链接地址:https://www.taowenge.com/p-2604350.html
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

收起
展开