广工_操作系统_实验报告_第1页
广工_操作系统_实验报告_第2页
广工_操作系统_实验报告_第3页
广工_操作系统_实验报告_第4页
广工_操作系统_实验报告_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统实验报告学 院_计算机学院_专 业_软件工程_班 级_ _学 号_ _姓 名_ _指导教师 (2010年10 月)学号: 姓名: 协作者:_实验_一_题目_ 进程调度_第 周星期_ _一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二、实验内容和要求编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行的时间、已用CPU时间、进程状态等。进程的优先数以及需要的运行时间事先由人为指定(也可以随机数产生)。如果运行一个时间片后

2、进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果还未达到,则把它送回队尾。三、实验主要仪器设备和材料实验环境硬件环境:IBM-PC 或兼容机软件环境:C语言编程环境四、实验原理及设计方案1、实验原理将程序顺序的输入进程队列后,开始执行程序,当运行了一个时间片后,如果进程所占的CPU时间达到所需的运行时间时,该进程完成,并撤销该进程,否则则把进程送回队尾。2、设计方案用一个进程控制块(PCB)表示进程。输入进程名称,优先级,运行时间后,通过模拟系统对进程采用“轮转法”调度,得到各个时间片进程的运行情况。3、相关数据结构的说明struct pcb/ 定义进程控制块 PCB char

3、 name10;/ 进程名称 char state;/ 进程当前状态 int super;/ 进程优先级 int ntime;/ 进程运行所需时间 int rtime;/ 进程已运行时间 struct pcb* link;/ 连接到队列中下一个进程的指针4、程序流程图(详细)5、给出程序中源程序名和可执行程序名。源程序名:pcb.cpp可执行程序名:pcb.exe输入数据:in.txt输出数据:out.txt6、程序清单(源程序中要附有详细的注释)#include #define getpch(type) (type*)malloc(sizeof(type)struct pcb/ 定义进程控制

4、块 PCB char name10;/ 进程名称 char state;/ 进程当前状态 int super;/ 进程优先级 int ntime;/ 进程运行所需时间 int rtime;/ 进程已运行时间 struct pcb* link;*ready,*p,*rear;typedef struct pcb PCB;void push()/ 建立将进程按 FCFS 排入队列的函数rear-link = p;rear = p;p-link = NULL;p-state = w; / 插入队尾后把状态改成w void input()/ 建立进程控制块函数int i,num;printf( 请输入

5、进程数量 );scanf(%d,&num);p=getpch(PCB); / 给 p 分配空间 for( i=0; iname);printf( 输入进程优先等级:);scanf(%d,&p-super);printf( 输入进程所需运行时间:);scanf(%d,&p-ntime);p-rtime = 0; / 为进程的已运行时间初始化为0 p-state = w; / 为进程的状态初始化为 w p-link = NULL; push();void disp(PCB* pr)/ 建立进程显示函数 printf(n qnametstatetsupertndtimetruntime n); pr

6、intf(| %st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n);void check()/ 建立进程查看函数 system(cls); PCB *pr; pr=ready-link; while(pr!=NULL) / 队列从头到尾显示进程 disp(pr); pr = pr-link; void destroy()/ 建立进程撤消函数 disp(p); printf(n 进程 %s 已完成。n,p-name);

7、free(p); / 释放 p void running() / 建立进程就绪函数 p-rtime+; / 已运行时间增加 if(p-rtime = p-ntime) / 当已运行时间等于所需运行时间时 p-state = f; / 状态更新为f ready-link = p-link; destroy(); / 调用destory()函数,释放p p = ready-link; system(pause); / 暂停,可了解当前状态 else / 如果进程还没达到所需运行时间,则把进程送入队尾 ready-link = p-link; push(); p = ready-link; int

8、main()/ 主函数 int t=0; / 定义t表示已用的时间片 rear = getpch(PCB); / 为rear分配内存 ready = rear; / 把ready指向rear input(); / 输入进程 p = ready-link;check();while(ready-link) / 当进程队列中还有进程时运行 t+; p-state = r; / 将进程状态设置为 ready check(); printf(第%d个时间片:,t); printf(正在运行n); system(pause); / 显示正在运行的进程队列 running(); check(); prin

9、tf(第%d个时间片:,t); printf(运行完成n); system(pause); / 显示运行完成后的进程队列 printf(n全部进程已运行完成!n);system(pause);return 0;五、实验结果及分析1、运行结果(要求截图)(能动态说明执行结果)(要求截图尺寸大小适中)(1)输入数据(2)开始运行,进程队列如图(3)经过3个时间片,进程【333】完成(4)经过9个时间片,进程【555】完成(5)经过10个时间片,进程【111】完成(6)经过12个时间片,进程【444】完成(7)经过13个时间片,进程【222】完成(8)全部进程运行完成2、实验结果的分析及说明程序输出

10、与编写程序的目的一致,直观的反应了轮转法进程调度的运行规则,显示了完成各个进程运行所需要的时间,以及各个进程完成的顺序。六、调试总结及心得体会(调试过程中小结、所遇问题及解决方法、心得体会)整个调试过程中并未遇到太大的问题,程序编写过程也很顺利,运行程序模拟进程调度之后,更直观的了解了轮转法进程调度的过程。七、思考题1、 分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。答:动态有限权算法:动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理

11、机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。时间片的轮转法:系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。每运行一次,进程的需要时间减1,直到就绪队列为空!学号: 姓名: 协作者:_实验_二_题目_ 作业调度_第 周星期_ _一、实验目的本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。二、实验内容和要求作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。

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

13、运行。作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2) 假定某系统可供用户使用的主存空间共100k,并有5台磁带机。3、相关数据结构的说明struct time/ 定义一个时间结构体 int h; int m; t;struct jcb/ 定义一个作业结构已

14、 char name10;/ 作业名称 struct time submittime;/ 提交时间 struct time starttime;/ 开始时间 struct time needtime;/ 需要运行的时间 struct time finishtime;/ 完成时间 char state;/ 状态 struct jcb* link;/ 连接到下一个作业的指针;4、程序流程图(详细)5、给出程序中源程序名和可执行程序名。源程序名:jcb.cpp可执行程序名:jcb.exe输入数据:in.txt输出数据:out.txt6、程序清单(源程序中要附有详细的注释)#include#inclu

15、de#define getpch(type) (type*)malloc(sizeof(type)struct time/ 定义一个时间结构体 int h; int m; t;struct jcb/ 定义一个作业结构已 char name10;/ 作业名称 struct time submittime;/ 提交时间 struct time starttime;/ 开始时间 struct time needtime;/ 需要运行的时间 struct time finishtime;/ 完成时间 char state;/ 状态 struct jcb* link;/ 连接到下一个作业的指针*read

16、y,*p,*rear;typedef struct jcb JCB;int num;void push()/ 建立将进程按 FCFS 排入队列的函数rear-link = p;rear = p;void disp(JCB* pr)/ 建立作业显示函数 printf(n nametstatetsubmittimetneedtimetstarttimetfinishtimettime n); printf(| %st,pr-name); printf(|%ct,pr-state); printf(|%d:%dtt,pr-submittime.h,pr-submittime.m); printf(|

17、%d:%dtt,pr-needtime.h,pr-needtime.m); printf(|%d:%dtt,pr-starttime.h,pr-starttime.m); printf(|%d:%dtt,pr-finishtime.h,pr-finishtime.m); printf(|%d:%dtt,pr-finishtime.h-pr-submittime.h,pr-finishtime.m-pr-submittime.m); printf(n);void input()/ 建立作业控制块函数int i;printf( 请输入作业数量 );scanf(%d,&num);p=getpch(J

18、CB); / 给 p 分配空间 for( i=0; iname);printf( 输入作业提交时间(h:m):);scanf(%d:%d,&p-submittime.h,&p-submittime.m);printf( 输入作业所需运行时间(h:m):);scanf(%d:%d,&p-needtime.h,&p-needtime.m);printf(n);p-state = w; / 为作业的状态初始化为 w p-link = NULL; push(); p = NULL;void running() / 建立作业就绪函数 if(p-submittime.h submittime.h = t.

19、h & p-submittime.m starttime.h=t.h; / 当提交时有程序在运行 p-starttime.m=t.m;/ 则开始时间等于上一程序运行完成时间 else/ 否则开始时间等于提交时间 t.h=p-submittime.h; t.m=p-submittime.m; p-starttime.h=t.h; p-starttime.m=t.m; t.h=p-needtime.h+t.h; t.m=p-needtime.m+t.m; if(t.m=60) t.h+; t.m-=60; p-finishtime.h=t.h; p-finishtime.m=t.m; p-stat

20、e=f; push(); int main()/ 主函数 /freopen(in.txt,r,stdin); /freopen(out.txt,w,stdout); int i; rear = getpch(JCB); ready = getpch(JCB); rear = ready; input(); p=ready-link; t.h=p-submittime.h; t.m=p-submittime.m; printf(n); for(i=0;ilink; p=ready-link; system(pause); return 0;五、实验结果及分析1、运行结果(要求截图)(能动态说明执

21、行结果)(要求截图尺寸大小适中)输入数据:输出结果:2、实验结果的分析及说明根据实验输入,输出了运行后各个作业的开始时间,完成时间以及周转时间。六、调试总结及心得体会(调试过程中小结、所遇问题及解决方法、心得体会)有了第一个实验的基础,在这个实验中,除了在处理小时与分钟的转换上花费了点时间之外,其余的部分都完成的比较顺利。七、思考题1、写出每种算法的调度策略,最后比较各种算法的优缺点。答:先来先服务算法是根据作业的进入时间来排序,到达时间短的先运行,优点是实现简单,缺点是运行时间慢。短作业优先算法是根椐作业的估计运行时间来排序,估计运行时间短的先运行,优点是运行时间快,缺点是实现起来比较复杂。

22、2、选择调度算法的依据是什么?答:如果作业要求的速度不高,而且作业比较小型,那就最好用先来先服务算法。如果作业要求的速度高,作业流程复杂,那就最好用短作业优先算法。学号: 姓名: 协作者:_实验_四_题目 主存空间的分配和回收_第 周星期_ 一、实验目的熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。二、实验内容和要求主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还

23、给系统。可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。三、

24、实验主要仪器设备和材料硬件环境:IBM-PC或兼容机软件环境:VC+ 6.0四、实验原理及设计方案1、实验原理在该算法中,把主存中所有空闲区按其物理地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区表或链中。2、设计方案(1)初始化空闲分区;(2)反复对现有的空闲分区进行进程创建和撤消,即内存分配和回收;(3)退出。3、相关数据结构的说明struct zoneint size; / 区域的大小 int state; / 区域的状态 char name1

25、0; / 区域的名称 struct zone *link; / 连接到下一区域的指针 ; 4、程序流程图(详细)5、给出程序中源程序名和可执行程序名。源程序名:memory.cpp可执行程序名:memory.exe输入数据:in.txt输出数据:out.txt6、程序清单(源程序中要附有详细的注释)#include #include #define MAX 5struct page / 定义一个页表 page int num; / 页号 char imformation100; / 页表信息 page * next; / 指向下一个页表的指针 *address,*memory; / 定义一个指

26、令地址指针和主存指针 void print(page *pp) / 输出页表 printf(num:t%dn,pp-num); printf(imformation:t%snn,pp-imformation); void AddToAddress() / 向指令地址添加页表 int a; page *p,*pp; p = address; while(1) printf(please input num:); scanf(%d,&a); if(a) pp = (page *)malloc(sizeof(page); / 分配内存空间 pp-num = a; printf(please inpu

27、t imformation:); scanf(%s,pp-imformation); pp-next = NULL; p-next = pp; / 把页表连接到address后 p = pp; print(p); pp = NULL; free(pp); else return; void init() / 初始化程序,为address和memory分配内存空间 address = (page *)malloc(sizeof(page); memory = (page *)malloc(sizeof(page); AddToAddress();bool IsInMemory(int n) /

28、判断页号是否已在主存内 page * p; p = memory-next; while(NULL != p) if(p-num = n) printf(is in memoryn); return 1; p = p-next; printf(is not in memoryn); return 0;bool IsMemoryFull() / 判断主存是否已满 page *p; int i = 0; p = memory-next; while(NULL != p) i+; p = p-next; if(i = MAX) / 主存中页表的数量达到 MAX 时,主存已满 printf(is fu

29、lln); return 1; else printf(is not fulln); return 0; void DeletePage() / 用 FIFO 算法淘汰一页 page *p; p = memory; memory = p-next; free(p);void AddToMemory(page *pp) / 向主存调入当前页表 page *p; p = memory; while(NULL != p-next) p = p-next; p-next = pp;int main() init(); /初始化 page * p; page * pp; p = address; p =

30、 p-next; while(p) if(!IsInMemory(p-num) / 判断 p 是否已在主存内 if(IsMemoryFull() / 判断 主存是否已满 DeletePage(); / 用 FIFO 算法淘汰一页 printf(n); AddToMemory(p); / 向主存调入当前页表 print(p); pp = p; p = p-next; pp-next = NULL; printf(n-memory:n); / 打印当前主存区内情况 p = memory-next; while(p) print(p); p = p-next; system(pause);五、实验结

31、果及分析1、运行结果(要求截图)(能动态说明执行结果)(要求截图尺寸大小适中)输入命令:task1 new 130输入命令:task2new60输入命令:task3new100输入命令:task2delete60输入命令:task4new200输入命令:task3delete100输入命令:task1delete130输入命令:task5new140输入命令:task6new60输入命令:task7new50输入命令:task 3 new 50 (错误的命令)输入命令:quit 结束2、实验结果的分析及说明本实验用了一条链表将所有的内存都连接起来,在之中按照书上要求的算法,分别执行了每一条命令

32、,结果完全正确,对错误的命令也能够及时的判断出来。六、调试总结及心得体会(调试过程中小结、所遇问题及解决方法、心得体会)通过前几个实验,对链表又有了深刻的了解,所以在这个对链表操作更为复杂的实验中,感觉游刃有余,对内存空间的开辟以及释放有了更深刻的了解,整个程序在编写的过程中也没有碰到太大的困难,最主要是在编写之前已经深刻的把整个构思在大脑中了。七、思考题1、内存的主要分配方式有哪些?回收时可能出现的什么情况?应怎样处理这些情况?答:有定分区分配和动态分区分配两种,回收时可能出现内存分区被切成若干在小不等小分区,过小的分区浪费内存资源,这要求我们要用紧凑技术修整。2、动态分区管理的常用内存分配

33、算法有哪几种?比较它们各自的使用范围。答:有首次适应算法、循环首次适应算法、最佳适应算法三种。首次适应算法适用于小型作业,而且分配速度不怎么要求的作业,循环首次适应算法适用于一些大的作业,避免大作业长期得不到分配,最佳适应算法适应于对分配速度要求高,作业容量比较大的作业。学号: 姓名: 协作者:_实验_五_题目_ 文件系统_第 周星期_ _一、实验目的模拟文件系统实现的基本功能,了解文件系统的基本结构和文件的各种管理方法,加深理解文件系统的内部功能及内部实现。通过用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验

34、内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。要求本文件系统采用两级目录,即设置主文件目录MFD和用户文件目录UED。另外,为打开文件设置运行文件目录AFD。设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件,并对文件必须设置保护措施。在用户程序中通过使用文件系统提供的Create、open、read、write、close、delete等文件命令,对文件进行操作三、实验主要仪器设备和材料硬件环境:IBM-PC或兼容机软件环境:C语言编程环境四、实验原理及设计方案1、实验原理运用二级目录思想来模拟文件系统。为每个用户建立一个单独的用户文件

35、目录UFD。这些文件目录具有相似的结构,它由用户文件的文件块组成。此外,在系统再建立一个主文件目录MFD;在主文件目录中,每个用户目录都占有一个目录项,其目录项中包含文件名和指向该文件目录文件的指针。2、设计方案按照课本要求,为每一个命令设置一个函数,再由主界面接受命令,进行判断以及调用函数。3、相关数据结构的说明struct MDF/ 定义一个用来存放user和ufd的结构体char username200;/ usernameint length;/ user 文件目录长度struct UFD *userufd;/ 指向user文件目录的指针struct MDF *link;/ 指向下一个

36、user的指针*mdfhead,*mdfptr;/ 头指针struct UFD/ 定义用来存放files的链表char filename200;/ filenameint num;/ 保护码int length;/ file长度struct UFD *link;/ 指向下一个file的指针*ufdptr;struct AFD/ 定义一个用来存放已经打开的files的链表char username200;/ usernamechar filename200;/ filenameint num;/ 保护码int state;/ 读写指针int length;/ file长度struct AFD *

37、link;/ 指向下一个file的指针*afdhead,*afdptr;/ 头指针4、程序流程图(详细)5、给出程序中源程序名和可执行程序名。源程序名:file.cpp可执行程序名:file.exe6、程序清单(源程序中要附有详细的注释)#include #include #include struct MDF/ 定义一个用来存放user和ufd的结构体char username200;/ usernameint length;/ user 文件目录长度struct UFD *userufd;/ 指向user文件目录的指针struct MDF *link;/ 指向下一个user的指针*mdfh

38、ead,*mdfptr;/ 头指针struct UFD/ 定义用来存放files的链表char filename200;/ filenameint num;/ 保护码int length;/ file长度struct UFD *link;/ 指向下一个file的指针*ufdptr;struct AFD/ 定义一个用来存放已经打开的files的链表char username200;/ usernamechar filename200;/ filenameint num;/ 保护码int state;/ 读写指针int length;/ file长度struct AFD *link;/ 指向下一个

39、file的指针*afdhead,*afdptr;/ 头指针void init();bool createfile(char* username,char* filename,int num);bool deletefile(char * username,char * filename);bool openfile(char * username,char * filename);bool closefile(char * username,char * filename);bool readfile(char * username,char * filename);bool writefil

40、e(char * username,char * filename);void init()/ 初始化函数afdhead = (AFD *)malloc(sizeof(AFD);afdhead-link = NULL;afdhead-length = 0;/ 为afdhead分配空间,并link = null,length = 0afdptr = afdhead;int i = 10;mdfhead = (MDF *)malloc(sizeof(MDF);mdfptr = mdfhead;/ 为mdfhead分配空间struct MDF *mp;struct UFD *up;char str2

41、00;while(i-)/ 初始化10个用户名mp = (MDF *)malloc(sizeof(MDF);/ 为每个user分配空间,并link = nullsprintf(str,user%d,10-i); strcpy(mp-username,str);/ 从user1到user10mp-length = 0;up = (UFD *)malloc(sizeof(UFD);/ 为每个user分配一个ufd,并link = null,length = 0mp-userufd = up;mp-userufd-length = 0;mp-userufd-link = NULL;mp-link =

42、 NULL;mdfptr-link = mp;mdfptr = mp;up = NULL;mp = NULL;bool createfile(char* username,char* filename,int num)/ create函数bool flag = false;/ 定义一个bool类型的flag用来做返回值mdfptr = mdfhead-link;struct UFD *up;while(mdfptr)/ 从第一个user开始寻找usernameif(!strcmp(mdfptr-username,username)/ 找到username之后if(mdfptr-length =10)/ 如果user保存文件数超过10个,则提示错误并返回printf(error! the user have 10 files.n);return flag;ufdptr = mdfptr-userufd;up = ufdptr-link;while(up)/ 在user的ufd中查找filenameif(!strcmp(up-filena

温馨提示

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

评论

0/150

提交评论