操作系统实验_第1页
操作系统实验_第2页
操作系统实验_第3页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、成成绩课程名称操作系统实验 学生学院计算机学院 专业班级16网络(3)班学号3116005002 学生姓名郭泽锋 指导教师重嘉 2019 年 1 月 4 日实验指导书每个同学必须提交的资料如下图所示:包括可运行的实验程序和源代码,以及实验报告. 课程的性质、目的和任务一门专业主干课和必修课。通过本课程的学习,使学生掌握操作系统的基本概念、设计原理及实施技术,具有分析操作系统和设计、实现、开发实际操作系统的能力。二. 实验的意义和目的操作系统是计算机教学中最重要的环节之一,也是计算机专业学生的一门好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。使学生更好地掌握操作系统的基本概念、基

2、本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。三.实验运行环境及上机前的准备实验运行环境: C上机前的准备工作包括:按实验指导书要求事先编好程序; 准备好需要输入的中间数据;估计可能出现的问题;预计可能得到的运行结果。四. 实验内容及安排实验一进程调度编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。以加深对进程的概念及进程调度算法的理解下面是采用动态优先数的调度程序,可作参考。 例题: 设计一个有 N(最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息: 进程名、优先数、到达时间

3、、需要运行时间、已用 CPU 时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 三种状态之一。就绪进程获得 CPUCPU1示。CPUCPU(即降低一级CPU。以便进行检查。重复以上过程,直到所要进程都完成为止。进程调度源程序如下:jingchendiaodu.cpp #include stdio.h #include #include #include #define getpch(type) (type*)malloc(sizeof(type) #defin

4、e NULL 0struct pcb /* 定义进程控制块PCB */ char name10;char state; int super; int ntime;struct pcb* link;*ready = NULL, *p; typedef struct pcb PCB;void sort() /* 建立对进程进行短程序排列函数*/PCB *first, *second; int insert = 0;if (ready = NULL) | (p-ntime)ntime)p-link = ready; ready = p;else /* 进程比较运行时间,插入适当的位置中*/first

5、 = ready;second = first-link; while (second != NULL)if (p-ntime)ntime) /*插入到当前进程前面*/ p-link = second; first-link = p; second = NULL; insert = 1;elsefirst = first-link; second = second-link;if (insert = 0) first-link = p;void input() /* 建立进程控制块函数*/int i, num; system(cls);/* 清 屏 */ printf(nscanf(%d&nu

6、m);for (i = 0;iname);printf(n 输入进程运行时间:); scanf(%d, &p-ntime);printf(n);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);void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/printf(n qname t state t super t t ntime t n); printf(|%

7、st, pr-name);printf(|%ct, pr-state);printf(|%dt, pr-super); printf(|%dt, pr-ntime);printf(n);void check() /* 建立进程查看函数 */PCB*pr;printf(n*:%sp-name);/*显示当前运行进程disp(p);pr = ready;printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while (pr != NULL)disp(pr);pr = pr-link;void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/printf(

8、n 进程 %s 已完成.n, p-name); free(p);void 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(); destroy();printf(n按任一键继续);ch = getchar();printf(n

9、n 进程已经完成.n); ch = getchar();流程图在已设置的三个进程中,由于进程2的运行时间最短,所以优先运行,运行完后到运行时间第二短的进程1运行完毕最后到进程三运行完成。结束在已设置的三个进程中,由于进程2的运行时间最短,所以优先运行,实验二 作业调度一、 实验目的:用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。二、 实验内容:写并调试一个单道处理系统的作业等待模拟程序。作业等待算法:分别采用先来先服务(FCFS、响应比高者优先(N的调度算法。到满足,它所占用的 CPUJCB,JCB提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作W

10、(Wait)R(Run)F(Finish)三种状态之W。对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时#includestdafx.h #include #include#includevoid SingleAccess();void start();/主调用函数void sort_FCFS();/插入排序先来先服务void sort_SJF();/插入排序短作业优先void sort_HRN();/void renew();/void input();void show();/void run();void clock();/struct JCBchar name10;flo

11、at timeSubmitted; float timeRequired;void * resourceRequired;/char * status;JCB * next;JCB * readyList;/作业就绪队列float sysTime;/定义系统时间int timePiece;/int sumOfJob;float totalRuntime;/总周转时间float totalRuntimeWithWeight;/总的带权周转时间;void SingleAccess()readyList = NULL;sysTime = 100;/系统时间初始化为100 timePiece = 1;

12、totalRuntime = 0;totalRuntimeWithWeight = 0;void input()int count;JCB* p;p = NULL;printf(当前系统时间:100n请输入作业数量:); scanf(%d, &count);sumOfJob = count;/获得作业数for (int i = 1;i name, &(p-timeSubmitted), &(p-timeRequired); p-status = wait;readyList = p; continue;printf(no.%d:, i);p-next = (JCB*)malloc(sizeof

13、(JCB); p = p-next;scanf(%s %f %f, p-name, &(p-timeSubmitted), &(p-timeRequired); p-status = wait;p-next = NULL;void sort_FCFS()JCB b, *pb, *p, *ph, *pt; pb = &b;/设置新链表头pb-next = NULL;for (ph = readyList;ph != NULL;ph = pt)pt = ph-next;/保留下一节点for (p = pb;p-next != NULL;p = p-next)if (p-next-timeSubmi

14、ttedph-timeSubmitted)break; ph-next = p-next;p-next = ph;readyList = pb-next;/把排好序的链表重新赋值给readyList;void sort_SJF()JCB b, *pb, *p, *ph, *pt; pb = &b;/设置新链表头pb-next = NULL;for (ph = readyList;ph != NULL;ph = pt)pt = ph-next;/保留下一节点for (p = pb;p-next != NULL;p = p-next)if (p-next-timeRequiredph-timeRe

15、quired)break;ph-next = p-next; p-next = ph;readyList = pb-next;/把排好序的链表重新赋值给readyList;void sort_HRN()JCB b, *pb, *p, *ph, *pt; pb = &b;/设置新链表头pb-next = NULL;for (ph = readyList;ph != NULL;ph = pt)pt = ph-next;/保留下一节点for (p = pb;p-next != NULL;p = p-next)if (sysTime - p-next-timeSubmitted) / p-timeRe

16、quired)timeSubmitted) / ph-timeRequired)break;ph-next = p-next; p-next = ph;readyList = pb-next;/把排好序的链表重新赋值给readyList;void renew()float startRuntime; startRuntime = for (int i = 0;itimeRequired;i += timePiece) clock();printf(n 【 作 业 :%s 已 经 完 成 】 n, readyList-name); totalRuntime += sysTime - readyL

17、ist-timeSubmitted; totalRuntimeWithWeight += (sysTime - readyList-timeSubmitted) readyList-timeRequired;printf(开始时间 t完成时间 t周转时间 t带权周转时间n); printf(%ft%ft%ft%fnn, readyList-timeSubmitted, sysTime, sysTime -readyList-timeSubmitted, (sysTime - readyList-timeSubmitted) / readyList-timeRequired);/删除该作业JCB

18、 *p;p = readyList;readyList = readyList-next; free(p); system(pause);void show()JCB *p;p = readyList;for (int i = 1;iname, p-timeSubmitted, p-timeRequired, p-status, sysTime);p = p-next;for (int i = 1;i80;i+) putchar(*);void clock()sysTime += timePiece;Sleep(timePiece * void run()int choice;/do prin

19、tf(n1:先来先服务n2:最小作业优先n3:响应比高者优先n请选择:); scanf(%d, &choice); while (choice4);while (readyList != NULL)if (choice = 1) sort_FCFS();else if (choice = 2) sort_SJF();elsesort_HRN();readyList-status = running; show();renew();for (int i = 1;i80;i+) putchar(*);printf(n这组作业:n平均周转时间:%ft平均带权周转时间:%fn, totalRuntim

20、e sumOfJob, totalRuntimeWithWeight / sumOfJob);void start()input();run();void main()int i;/SetConsoleTitle(作业调度);for (int i = 1;i = 40;i+)putchar(*);putchar(n); printf(作业调度模拟程序 n);for (i = 1;i = 40;i+)putchar(*);putchar(n); SingleAccess();start();先来先到服务响应比高者优先(HRN)思考:比较各种算法的优缺点。先来先服务算法:是按照作业进入输入井的先后

21、次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业,那么顺序挑选后面的作业。 FCFS 算法简单易行,但性能却不大好。(HRN)FCFSSJF综合平衡。FCFS 方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJFHRN响应比 R 定义如下: R =(W+T)/T = 1+W/TT,WRT也就随着增加,也就FCFSSJFSJFHRNSJF 法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。实验三 动态分区分配方式的模拟1、实验目的:了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现

22、过程的理解2、实验内容:C(表系统优先使用空闲区低端的空间。640KB,并有下列的请求序列:和回收后显示出空闲内存分区链的情况。1130KB260KB3260KB 4200KB31130KB 5140KB 660KB750KB860KB/ shiyan3.cpp : 定义控制台应用程序的入口点。/#include stdafx.h #include #include using namespace std;#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1/完成#define ERROR 0 /#define MAX_length 640

23、/最大内存空间为640KB typedef int Status;typedef struct freearea/定义一个空闲区说明表结构int ID;/分区号long size; /long address; /分区地址int state; /状态ElemType;/- 线性表的双向链表存储结构 -typedef struct DuLNode /double linked listElemType data;struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode, *DuLinkList;DuLinkList block_

24、first; /头结点DuLinkList block_last; /尾结点Status alloc(int);/Status free(int); /Status First_fit(int, int);/首次适应算法Status Best_fit(int, int); /最佳适应算法void show();/查看分配Status Initblock();/开创空间表Status Initblock()/开创带头结点的内存空间链表block_first = (DuLinkList)malloc(sizeof(DuLNode); block_last = (DuLinkList)malloc(

25、sizeof(DuLNode); block_first-prior = NULL;block_first-next = block_last; block_first-data.state = 3;block_first-data.size = 0;block_last-prior = block_first; block_last-next = NULL; block_last-data.address = 0;block_last-data.size = MAX_length; block_last-data.ID = 0;block_last-data.state = Free; re

26、turn 1;/- 分 配 主 存 -Status alloc(int ch)int ID, request;cout ID;cout request;if (request0 | request = 0)cout 分配大小不合适,请重试! endl; return ERROR;if (ch = 2) /选择最佳适应算法if (Best_fit(ID, request) =1) cout 分配成功! endl; else cout 内存不足,分配失败! endl;return 1;else /默认首次适应算法if (First_fit(ID, request) = 1) cout 分配成功!

27、endl; else cout 内存不足,分配失败! next;/请在此处添加为作业申请新空间且初始化的代码/请在此处完成首次适应算法的代码,分两种情况:有大小恰好合适的空闲块和有空闲块能满足需求且有剩余。/注意函数返回值。DuLinkList block = (DuLinkList)malloc(sizeof(DuLNode); memset(block, 0, sizeof(DuLNode);block-data.ID = ID;block-data.size = request; block-data.state = Busy; while (p)if (p-data.state = F

28、ree & p-data.size = request)if (p-data.size - request) 1)block-data.address = p-data.address;p-data.address = p-data.address + p-data.size = p-data.size - request;elsep-prior-next = block; block-next = p;block-prior = p-prior; p-prior = block;return 1;p-data.ID = ID;p-data.state = Busy; free(block);

29、return 1;p = p-next;free(block); return ERROR;/- 最佳适应算法 -Status Best_fit(int ID, int request)/请在此处添加为作业申请新空间且初始化的代码DuLinkList block = (DuLinkList)malloc(sizeof(DuLNode); memset(block, 0, sizeof(DuLNode);block-data.ID = ID;block-data.size = request; block-data.state = Busy; DuLNode *p = block_first-n

30、ext;DuLNode *q = NULL; /记录最佳插入位置int i = 0;int num = 0; DuLNode *q1 = while (p)if (p-data.state = Free & p-data.size = request)if (num = 0)q = p;i = q-data.size - request;else if (p-data.size - request data.size - request;num+;p = p-next;/请在此处完成最佳适应算法的代码,重点:要查找到最小剩余空间的分区,即最佳插入位置if (q = NULL) return E

31、RROR;/没有找到空闲块else/请插入找到了最佳位置并实现内存分配的代码! if (q-data.size - request) 1)block-data.address = q-data.address;q-data.address = q-data.address + q-data.size = q-data.size - request;elseblock-next = q;block-prior = q-prior; q-prior-next = block; q-prior = block;return 1;q-data.ID = ID;q-data.state = Busy;

32、free(block);return 1;/-主 存 回 收-Status free(int ID)DuLNode *p = block_first-next; DuLNode *p1 = NULL;while (p)if (p-data.ID = ID)p-data.state = Free; p-data.ID = Free;cout 内存块找到,准备回收! next = NULL) if (p-prior-data.state = Free) & (p-prior-data.address + p-prior-data.size = p-data.address)p-prior-data

33、.size += p-data.size; p-prior-next = NULL;free(p);cout 内存块为最后一块! next-next = NULL) & (p-next-data.state = Free) & (p-data.address + p-data.size = p-next-data.address)p-data.size += p-next-data.size; free(p-next);p-next = NULL;if (p-prior-data.state = Free) & (p-prior-data.address + p-prior-data.size

34、 = p-data.address)p-prior-data.size += p-data.size; p-prior-next = NULL;free(p);break;else if (p-prior-data.state = Free) & (p-prior-data.address + p-prior-data.size = p-data.address)if (p-next-data.state = Free & (p-data.address + p-data.size = p-next-data.address)p1 = p-next;p-data.size += p-next-data.size; p-next-next-prior = p;p-next = p-next-next; free(p1);p-prior-data.size += p-data.size; p-prior-next = p-next;p-next-prior = p-prior; free(p);break;else if (p-next-data.state = Free) & (p-data.address + p-data.size = p-next-data.address)p1 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论