收藏 分享(赏)

一个小型的操作系统设计与实现.doc

上传人:精品资料 文档编号:8701354 上传时间:2019-07-08 格式:DOC 页数:39 大小:2.81MB
下载 相关 举报
一个小型的操作系统设计与实现.doc_第1页
第1页 / 共39页
一个小型的操作系统设计与实现.doc_第2页
第2页 / 共39页
一个小型的操作系统设计与实现.doc_第3页
第3页 / 共39页
一个小型的操作系统设计与实现.doc_第4页
第4页 / 共39页
一个小型的操作系统设计与实现.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、操作系统课程设计报告南通大学计算机科学与技术学院操作系统课程设计报告专 业:计嵌 151学生姓名:王志宏学号:1513052018时间:2017/6/28操作系统课程设计报告第 0 页 共 39 页设计一个小型的操作系统设计要求将本学期三次的实验集成实现:1.中断处理2.作业调度3.PV 原语4.死锁5.页面替换6.磁盘调度(一)设计流程图主流程图开始的图形界面中断处理 死锁 磁盘调度先来先服务先来先服务作业调度 页面替换LRU算法银行家算法时钟先进先出算法PV 原语哲学家吃通心面操作系统课程设计报告第 1 页 共 39 页1.中断处理模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程

2、序。计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中断寄存器的某一位就被置成1。处理器每执行一条指令后,必须查中断寄存器,当中断寄存器内容不为0时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加 1 来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息

3、且分析,当读入信息=0 时,表示无中断事件发生,继续执行指令;当读入信息=1 时,表示发生了时钟中断事件,转时钟中断处理程序2.作业调度1)先来先服务 FCFSN开始初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队调度数组中首个进程,并让数组中的下一位移到首位计算并打印进程的完成时刻、周转时间、带权周转时间其中:周转时间 = 完成时间 - 到达时间带权周转时间=周转时间/服务时间更改计时器的当前时间,即下一刻进程的开始时间当前时间=前一进程的完成时间+其服务时间数组为空操作系统课程设计报告第 2 页 共 39 页Y先来先服务算法流程3.PV 原语1)哲学家吃通心面问题哲学家吃通心面:

4、在这道题目里,每把叉子必须互斥使用,当一位哲学家吃通心面之前必须执行两个 P 操作,获得自己左右两边的叉子,在吃完通心面后必须执行两个 V 操作,放下叉子。结束操作系统课程设计报告第 3 页 共 39 页4.死锁1)银行家算法5.页面替换操作系统课程设计报告第 4 页 共 39 页1)先进先出 FIFO2)LRU开始 FIFO 的缺页中断处理查主存分块表有空闲块可用? 分配一块J 的修改标志=1?J=pHEAD输出“将 J 页复写入交换区”输出“装入 L 页”调整 FIFO 队列,将 L 插入队尾(HEAD=(HEAD+1)modM)修改主存分块表和页表终止NYNYFIFO 淘汰算法流程开始

5、LRU 的缺页中断处理操作系统课程设计报告第 5 页 共 39 页6.磁盘调度1)先来先服务算法 FCFS)查主存分块表有空闲块可用? 分配一块J 的修改标志=1?找到栈底元素:J=pM-1输出“将 J 页送到入交换区”输出“装入 L 页”调整堆栈,使 HEAD 所指元素及以下的元素下移 PHEAD=L修改主存分块表和页表终止NYNYLRU 淘汰算法流程操作系统课程设计报告第 6 页 共 39 页(二)实现原理主界面设计一个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序。1.中断操作系统课程设计报告第 7 页 共 39 页2.作业调度1)先来先服务 FCFS(1)任务先来先服务的调度

6、算法实现处理机调度。(2)要求1.实现对 FCFS 算法的模拟实现2.计算出该算法的平均作业周转时间、平均带权作业周转时间。(3)原理按作业到达 CPU 时间先后顺序进行非剥夺式调度,先到达 CPU 的作业先被执行。(4)数据结构struct task_structchar name; /*进程名称*/int number; /*进程编号*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int priority; /*优

7、先级*/int order; /*运行次序*/int run_flag; /*调度标志*/tasksMAX;int fcfs()/*先来先服务算法*/进程名链接指针到达时间估计运行时间进程状态进程控制块结构(5)实现方法建立一个链表按照到达 CPU 的时间从小到大排列,只需从第一个作业(头操作系统课程设计报告第 8 页 共 39 页结点)依次调度到最后一个作业(尾结点)。(6)运行界面测试数据:作业名 到达时间 运行时间A 0 28B 0 9C 0 3执行 FCFS 算法如下:3.死锁假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释放,故只需要遍历链表将各个进程中所需的资源统

8、计出来,只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择 kill一进程,已达到释放资源的目的。死锁检测函数:void sisuo() 死锁解除函数:void safe()操作系统课程设计报告第 9 页 共 39 页4.缺页调度1)先进先出 FIFO(1)任务采用先进先出 FIFO 算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。(2)要求1.实现对 FIFO 算法的模拟实现2.输出每次执行的结果。(3)原理基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能

9、性较大。(4)数据结构void FIFO()int length;int fifo100=0;int pageLength;int fifoPage100=0;int i,j;cout0;cc-)lruPagecc=lruPagecc-1;lruPage1=lrui;flag=1;j=pageLength+1;else if(lruPagej=0)for(int vv=j;vv0;vv-)lruPagevv=lruPagevv-1;lruPage1=lrui;j=pageLength+1;flag=1;if(flag=1)elsecout0;j-)lruPagej=lruPagej-1;lru

10、Page1=lrui;操作系统课程设计报告第 12 页 共 39 页(5)实现方法当采用 LRU 算法时,用一个数组构成堆栈,堆栈中各个元素为进程已在主存的页号,为了进行页面置换,可设置一个栈指针,初始化为 0.假定分配给每个进程的内存块数固定不变。当队列满需淘汰时,操作系统选择栈底元素淘汰,其他元素向下移一个位置,将新调入页放栈指针指示的栈顶。当访问的页在栈中时,还应调整页从当前位置到栈顶。(6)运行界面测试数据:页表长度:9;页框长度:3;页面请求数列:2,3,5,1,5,5,4,4,3执行最近最少使用 LRU 算法结果如下:5.磁盘调度1)先来先服务算法 FCFS)这是一种比较简单的磁盘

11、调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。操作系统课程设计报告第 13 页 共 39 页(三)总结与体会通过本次课程设计让我对于图形界面设计有了一定的思路和看法,同时我对先来先服务、时间片轮转、首次适应算法、最佳适应算法、先进先出和最近最少使用算法有了更详尽的认识。在编程的过程中发现会用到大量的指针,用指针来操作大量的数据比

12、较方便,但最后应该记得释放资源。从这次实验中我发现我对于 c+掌握也有所不足,程序经过了多次修改才得以完善,在以后应该注重编程方面的训练。此外我还更深入的理解了各个进程调度算法,及实现过程。在编写程序时查询了很多资料,间接提高了我的搜索能力。在此次课程设计过程中,对进程的相关知识有了一定的加深。特别是对进程的进程控制块的存在和价值有了更进一步的认识。在编写程序的过程之中,对进程自身信息的设计和管理以及调度的算法都有助于对书本知识的理解和掌握。特别是设计先来先服务调度算法和时间片轮转调度算法的时候,对进程的调度算法有了更好的深入理解。对进程管理中的等待队列,就绪队列,时间片等概念有了更深刻的印象

13、。在设计此模拟操作系统的课设中,也加深了对 c+知识的把握。解决了一些以往在编程中遇到了困难。通过此次的课程设计,不仅提高了对操作系统的认知,也在同时提高了编程的能力,加强了实践。另外,我觉得此次课程设计虽然主要问题是在编程上,但是经过不断的去调试,还是成功的调试了出来。但是这几个程序用了多天的时间进行分析和修改,虽然出现了不少问题,但收获颇多!源代码:#include#include#include 操作系统课程设计报告第 14 页 共 39 页#include #include #include #include #include#includeusing namespace std;in

14、t fcfsoutput(); /*调度结果输出*/int fcfsinput(); /进程参数的初始化void kaishi();#define MAX 10#define maxsize 1000struct node /建立链表来存放进程数据 char name5; /进程名称 int need_time; /所需要的时间 int allocation; /占用 cpu 的情况 char state; /目前的状态 R 为运行,E 为运行完毕 node *next; /链表的尾结点 ;struct task_structchar name; /*进程名称*/int number; /*进

15、程编号*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int priority; /*优先级*/int order; /*运行次序*/int run_flag; /*调度标志*/tasksMAX;int counter; /*实际进程个数*/int fcfs()/*先来先服务算法*/fcfsinput();float time_temp = 0;int i;int number_schedul;time_temp =

16、e_time;for (i = 0; itasksj + e_time)tt = tasksj;tasksj = tasksj + 1;tasksj + 1 = tt;/初始化每个进程估计运行的时间tasks0.run_time = 28;tasks1.run_time = 9;tasks2.run_time = 3;/初始化每个进程的名字操作系统课程设计报告第 16 页 共 39 页tasks0.name = A;tasks1.name = B;tasks2.name = C;cout n;switch (n)case 1: fcfs(); kaishi(); break;case 2: k

17、aishi(); kaishi(); break;/*-*/void FIFO()int length;int fifo100 = 0 ;int pageLength;int fifoPage100 = 0 ;int i, j;cout 0; cc-)lruPagecc = lruPagecc - 1;lruPage1 = lrui;flag = 1;j = pageLength + 1;else if (lruPagej = 0)for (int vv = j; vv0; vv-)lruPagevv = lruPagevv - 1;lruPage1 = lrui;j = pageLength

18、 + 1;flag = 1;if (flag = 1)elsecout 0; j-)lruPagej = lruPagej - 1;lruPage1 = lrui;cout n;switch (n)case 1: FIFO(); kaishi(); break;case 2: LRU(); kaishi(); break;case 3: kaishi(); kaishi(); break;/*-*/*判断输入数据是否有效*/int decide(char str) /判断输入数据是否有效int i = 0;while (stri != 0)if (stri9)return 0;break;i+

19、;return i;/*将字符串转换成数字*/int trans(char str, int a) /将字符串转换成数字int i;int sum = 0;for (i = 0; i str; /对输入数据进行有效性判断a = decide(str);if (a = 0)cout str; /对输入数据进行有效性判断a = decide(str);if (a = 0)cout str; /对输入数据进行有效性判断a = decide(str);if (a = 0)cout str; /对输入数据进行有效性判断a = decide(str);if (a = 0)cout Change(); in

20、t i = pA-getinfo();string str;if (i = 0)str = “等待“;else if (i = 1)str = “就餐“;else str = “思考“;return str;string toolstatus(bool a)string state;if (a = true)state = “闲“;if (a = false)state = “用“;return state;void dead_lock()char con = y; /判断是否继续/ con = n;for (int i = 0; icon;while (con = y)操作系统课程设计报告第

21、 26 页 共 39 页P1.Change(); P2.Change(); P3.Change(); P4.Change(); P5.Change();cout con;Sleep(20);while (con = n)P1.dead_lock();P2.dead_lock(); P3.dead_lock(); P4.dead_lock(); P5.dead_lock();cout con;Sleep(20);DeleteCriticalSection( /退出资源区void PV()/哲学家吃通心面问题int n;cout n;switch (n)case 1: dead_lock(); k

22、aishi(); break;case 2: kaishi(); kaishi(); break;/*-*/void ZD()double p;int a, m, r, n, e, o, u;struct tm *local;char *st, s27;time_t t;t = time(NULL);local = localtime(st = asctime(local);/记录初试时间for (int i = 0; i w;/读取键盘输入 while (w = 0); /如果 w 一直为 0,则程序一直在此循环执行if (w = 1)cout = 0.5)p = a + 1;else p

23、= a;/这段代码是对硬件的模拟,就是当 count1 出现偏差时的处理m = (int)p;cout “现在已过时间为:“ m endl;r = s17 - 48;n = s18 - 48;e = r * 10 + n;p = p + e;/下面部分代码为 ASCII 码的转换if (p60)s17 = (int)p / 10) + 48;s18 = (int)p % 10) + 48;for (int i = 4; i 27; i+)cout si;cout endl;elses14 = s14 - 48;s15 = s15 - 48;o = s14 * 10 + s15;o = o + (int)p / 60;if (o60)s14 = (o / 10) + 48;s15 = (o % 10) + 48;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报