《一个小型的操作系统设计与实现.docx》由会员分享,可在线阅读,更多相关《一个小型的操作系统设计与实现.docx(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统课程设计报告操作系统课程设计报告设计一个小型的操作系统操作系统课程设计报告设计要求将本学期三次的实验集成实现:1. 中断处理2. 作业调度3. PV 原语4. 死锁5. 页面替换6. 磁盘调度(一)设计流程图主流程图开始的图形界面中断处理作业调度PV 原语死锁页面替换磁盘调度哲银先L行进R家先U算出算法算法时先学先钟来家来先先吃服服通务务1心第页 共 2 页操作系统课程设计报告1. 中断处理模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中
2、断寄存器的某一位就被置成1。处理器每执行一条指令后,必须查中断寄存器, 当中断寄存器内容不为0时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加 1 来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0 时,表示无中断事件发生,继续执行指令;当读入信息=1 时,表示发生了时钟中断事件,转时钟中断处理程序2. 作业调度
3、1) 先来先服务 FCFS开始初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队调度数组中首个进程,并让数组中的下一位移到首位计算并打印进程的完成时刻、周转时间、带权周转时间其中:周转时间 = 完成时间 - 到达时间带权周转时间=周转时间/服务时间更改计时器的当前时间,即下一刻进程的开始时间当前时间=前一进程的完成时间+其服务时间N数组为空第 2 页 共 3 页操作系统课程设计报告Y结束先来先服务算法流程3. PV 原语1)哲学家吃通心面问题哲学家吃通心面:在这道题目里,每把叉子必须互斥使用,当一位哲学家吃通心面之前必须执行两个 P 操作,获得自己左右两边的叉子,在吃完通心面后必须执行
4、两个 V 操作,放下叉子。第 3 页 共 4 页操作系统课程设计报告哲学家处于的状态戏atus=l是旅下左右手工具 否哲学家处千思考状态Status=2是状态改为等待starus=动否哲学家处于等待Stams=O了是左右手筷子均空闲是章起左右手筷子状态为思考Status=2状态改为就餐啦tus=l4. 死锁1) 银行家算法恨行家豆法彻rI:.:( )开始初始化I n:几();挝出悄求邸qu贬. l Li Errotn飞r,廿VAI L 牡 lu 五i 闾 陬 T j : r,I 皇1欢沐I|()廿i 1 1 lE凇 从; 1:劝i1; NEE互i 哗U去寸 i :箱出提 示 ; 切 的 l行求
5、枝拒!勃仆提示巴 可 屯分配讷 求 15.页面替换札 A l l AHI卜,.i l化灶 U侬 1代 1 i,, L肛贮 WI 吹 i - =RE饥 芷双 i j ;,订:fI1 7ll斗卜廿lJ,干.S. l l ,第 4 页 共 5 页坦出相片银行寀汀法B吕 1. k ()銡束操作系统课程设计报告开始 FIFO 的缺页中断处理查主存分块表有空闲块可用?Y分配一块NJ=pHEADNJ 的修改标志=1?Y输出“将 J 页复写入交换区”输出“装入L 页”调整 FIFO 队列,将 L 插入队尾(HEAD=(HEAD+1)modM)修改主存分块表和页表终止1) 先进先出 FIFOFIFO 淘汰算法流
6、程开始 LRU 的缺页中断处理第 5 页 共 6 页2) LRU操作系统课程设计报告查主存分块表有空闲块可用?Y分配一块N找到栈底元素:J=pM-1NJ 的修改标志=1?Y输出“将 J 页送到入交换区”输出“装入L 页”调整堆栈,使 HEAD 所指元素及以下的元素下移PHEAD=L修改主存分块表和页表终止LRU 淘汰算法流程6.磁盘调度1)先来先服务算法 FCFS)第 6 页 共 7 页操作系统课程设计报告开始输人总的磁道龄输人提出谢盘I/01 申请的进程数输人记道序列(以 0 结束)谕入开始的出道号输出氐盘请求序列和扫描序列求移动的总的记道数求平均寻道长度结束(二)实现原理主界面设计一个框架
7、分别去链接处理机管理、存储器管理和缺页调度相关的程序。-谀. 作系统课程设 i丁1. 中断处理2. 作业调度3死钟 4页面替犊5. 殴盘调度1. 中断第 7 页 共 8 页操作系统课程设计报告2. 作业调度1) 先来先服务 FCFS(一)任务先来先服务的调度算法实现处理机调度。(二)要求1. 实现对 FCFS 算法的模拟实现2. 计算出该算法的平均作业周转时间、平均带权作业周转时间。(三)原理按作业到达 CPU 时间先后顺序进行非剥夺式调度,先到达 CPU 的作业先被执行。(四)数据结构struct task_structchar name;/*进程名称*/int number;/*进程编号*
8、/float come_time;/* 到 达 时 间 */ float run_begin_time;/*开始运行时间*/ float run_time;/*运行时间*/ float run_end_time;/*运行结束时间*/ int priority;/*优先级*/int order;/*运行次序*/int run_flag;/*调度标志*/tasksMAX;int fcfs()/*先来先服务算法*/进 程 名链接指针 到达时间 估计运行时间进程状态进程控制块结构(五)实现方法建立一个链表按照到达 CPU 的时间从小到大排列,只需从第一个作业(头结第 8 页 共 9 页操作系统课程设计
9、报告点)依次调度到最后一个作业(尾结点)。(六)运行界面测试数据:作业名到达时间运行时间A028B09C03执行 FCFS 算法如下:3. 死锁假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释放,故只需要遍历链表将各个进程中所需的资源统计出来,只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择 kill 一进程,已达到释放资源的目的。死锁检测函数:void sisuo()死锁解除函数:void safe()第 9 页 共 10 页操作系统课程设计报告4. 缺页调度1) 先进先出 FIFO(一)任务采用先进先出 FIFO 算法实现分页管理的缺页调度,
10、并输出每次调入调出的页号和运行结果。(二)要求1. 实现对 FIFO 算法的模拟实现2. 输出每次执行的结果。(三)原理基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性较大。(四)数据结构void FIFO()int length;int fifo100=0; int pageLength;int fifoPage100=0; int i,j;cout*先进先出算法*endl; pageLength=3;length=9; for(i=1;i=length;i+)int flag=0; for(j=
11、1;j=pageLength;j+)if(fifoi=fifoPagej) flag=1; j=pageLength+1;else if(fifoPagej=0) fifoPagej=fifoi; j=pageLength+1; flag=1;if(flag=1)elsecout淘汰fifoPage1endl; for(j=1;j=pageLength;j+)fifoPagej=fifoPagej+1;第 10 页 共 11 页操作系统课程设计报告fifoPagepageLength=fifoi;(五)实现方法当采用先进先出算法时,用一个数组构成先进先出队列,数组中各个元素为进程已在主存的页号
12、,其队列头指针初始化为 0.假设分配给每个进程的内存块数固定。当队列满需淘汰时,淘汰最先进入主存的一页。若该页修改过,还有存入磁盘。然后要把当前访问的页装入该块,并修改页表和存储分块表的对应标志。(六)运行界面测试数据:页表长度:9; 页框长度:3;页面请求数列:4,4,3,5,1,1,2,3,2执行先进先出 FIFO 算法结果如下:)(一)任务号和运行结果。LRU并输出每次调入调出的页1. 实现对 LRU 算法的模拟实现2. 输出每次执行的结果。(三)原理最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还有
13、立即被使用,而那些在较长时间内未被使用的页面可能不会立即使用。在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统处理缺页中断。如果主存中已无空闲块,可采用 LRU 算法进行缺页处理。第 11 页 共 12 页操作系统课程设计报告(四)数据结构void LRU()int length;int lru100=0; int pageLength;int lruPage100=0; int i,j;cout*最近最少使用LRU算法*endl; pageLength=3;length=9; for(i=1;i=length;i+)int flag=0; for(j=1;j0;cc-) lruPagec
14、c=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)elsecout lruPagepageLength0;j-) lruPagej=lruPagej-1;- 淘 汰lruPage1=lrui;(五)实现方法第 12 页 共 13 页操作系统课程设计报告当采用 LRU 算法时,用一个数组构成堆栈,堆栈中各个元素为进程已在主存
15、的页号,为了进行页面置换,可设置一个栈指针,初始化为 0.假定分配给每个进程的内存块数固定不变。当队列满需淘汰时,操作系统选择栈底元素淘汰,其他元素向下移一个位置,将新调入页放栈指针指示的栈顶。当访问的页在栈中时, 还应调整页从当前位置到栈顶。(六)运行界面测试数据:页表长度:9; 页框长度:3;页面请求数列:2,3,5,1,5,5,4,4,3执行最近最少使用 LRU 算法结果如下:5.磁盘调度1)先来先服务算法 FCFS)这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的
16、情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。第 13 页 共 14 页操作系统课程设计报告(三)总结与体会通过本次课程设计让我对于图形界面设计有了一定的思路和看法,同时我对先来先服务、时间片轮转、首次适应算法、最佳适应算法、先进先出和最近最少使用算法有了更详尽的认识。在编程的过程中发现会用到大量的指针,用指针来操作大量的数据比较方便,但最后应该记得释放资源。从这次实验中我发现我对于 c+掌握也有所不足,程序经过了多次修改才得以完善,在以后应该注重编程方面的训练。此外我还更深
17、入的理解了各个进程调度算法,及实现过程。在编写程序时查询了很多资料,间接提高了我的搜索能力。在此次课程设计过程中,对进程的相关知识有了一定的加深。特别是对进程的进程控制块的存在和价值有了更进一步的认识。在编写程序的过程之中,对进程自身信息的设计和管理以及调度的算法都有助于对书本知识的理解和掌握。特别是设计先来先服务调度算法和时间片轮转调度算法的时候,对进程的调度算法有了更好的深入理解。对进程管理中的等待队列,就绪队列,时间片等概念有了更深刻的印象。在设计此模拟操作系统的课设中,也加深了对c+知识的把握。解决了一些以往在编程中遇到了困难。通过此次的课程设计,不仅提高了对操作系统的认知, 也在同时
18、提高了编程的能力,加强了实践。另外,我觉得此次课程设计虽然主要问题是在编程上,但是经过不断的去调试,还是成功的调试了出来。但是这几个程序用了多天的时间进行分析和修改,虽然出现了不少问题,但收获颇多!源代码:#include #include #include #include 第 14 页 共 15 页操作系统课程设计报告#include #include #include #include#includeusing namespace std;int fcfsoutput(); /*调度结果输出*/ int fcfsinput(); /进程参数的初始化void kaishi();#defin
19、e 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;/*进程编号*/float come_time;/*到达时间*/ float run_begin_time;/*开始运行时间*/ float run_time;/*运行时间*/
20、 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 = e_time; for (i = 0; icounter; i+)第 15 页 共 16 页操作系统课程设计报告tasksi.run_begin_time = time_t
21、emp;tasksi.run_end_time = tasksi.run_begin_time + tasksi.run_time; tasksi.run_flag = 1;time_temp = tasksi.run_end_time; number_schedul = i; tasksnumber_schedul.order = i + 1;fcfsoutput(); return 0;int fcfsinput()task_struct tt; int i, j;/初始化进程数counter = 3;/初始化每个到达系统的时间为 5、7、8 e_time = rand() % 9; e_
22、time = rand() % 9;e_time = rand() % 9;for (i = 1; i3; i+)for (j = 0; jtasksj + e_time)tt = tasksj;tasksj = tasksj + 1; tasksj + 1 = tt;/初始化每个进程估计运行的时间tasks0.run_time = 28;tasks1.run_time = 9;tasks2.run_time = 3;/初始化每个进程的名字tasks0.name = A;第 16 页 共 17 页操作系统课程设计报告tasks1.name = B;tasks2.name = C;cout *先
23、来先服务算法* endl endl;for (i = 0; icounter; i+)tasksi.run_begin_time = 0;tasksi.run_end_time = 0;tasksi.order = 0;tasksi.run_flag = 0;return 0;int fcfsoutput() /*调度结果输出*/int i;float turn_round_time = 0, f1, w = 0;cout *先来先服务* endl;cout 作业名到达时间 运行时间 开始时间 停止时间运行次序 周转时间 endl;for (i = 0; icounter; i+)f1 = t
24、asksi.run_end_time - e_time; turn_round_time += f1;w += (f1 / tasksi.run_time);cout tasksi.name t e_time t tasksi.run_time t tasksi.run_begin_time t tasksi.run_end_time t tasksi.order t f1 t endl;cout 平均周转时间: turn_round_time / counter endl; cout 平均带权周转时间: w / counter endl;cout ;return 0;void zuoyedi
25、aodu()/作业调度int n;cout t1.先来先服务算法t 2.返回开始菜单 n;switch (n)case 1: fcfs(); kaishi(); break; case 2: kaishi(); kaishi(); break;/*-*/void FIFO()int length;int fifo100 = 0 ; int pageLength;int fifoPage100 = 0 ;int i, j;cout *先进先出算法* endl;pageLength = 3;length = 9;cout 时刻 t t; for (i = 0; ilength; i+)cout i
26、 t;cout endl 引用串 t; for (i = 1; i = length; i+)fifoi = rand() % 5 + 1; cout fifoi t;for (i = 1; i = length; i+) int flag = 0;for (j = 1; j = pageLength; j+) if (fifoi = fifoPagej)flag = 1;j = pageLength + 1;else if (fifoPagej = 0) fifoPagej = fifoi; j = pageLength + 1; flag = 1;if (flag = 1)第 18 页 共
27、 19 页操作系统课程设计报告elsecout 淘汰 fifoPage1 endl;for (j = 1; j = pageLength; j+) fifoPagej = fifoPagej + 1;fifoPagepageLength = fifoi;cout endl t= i - 1 时 t;for (int jk = 1; jk = pageLength; jk+)cout P jk t;cout endl t;for (int s = 1; s = pageLength; s+) cout fifoPages t;cout endl;void LRU()int length;int
28、lru100 = 0 ; int pageLength;int lruPage100 = 0 ; int i, j;cout *最近最少使用 LRU 算法* endl;pageLength = 3;length = 9;cout 时刻 t t; for (i = 0; ilength; i+)cout i t;cout endl 引用串 t; for (i = 1; i = length; i+)lrui = rand() % 5 + 1; cout lrui t;第 19 页 共 20 页操作系统课程设计报告for (i = 1; i = length; i+)int flag = 0;fo
29、r (j = 1; j 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 + 1; flag = 1;if (flag = 1)elsecout 0; j-) lruPagej = lruPagej - 1;lruPage1 = lrui;淘汰 lruPagepageLengt
30、h endl;cout endl t= i - 1 时 t; for (int jk = 1; jk = pageLength; jk+)cout P jk t;cout endl t;for (int s = 1; s = pageLength; s+) cout lruPages t;cout endl;第 20 页 共 21 页操作系统课程设计报告void queye()/页面替换int n;cout endl;cout t1.先进先出算法t2.LRU 算法t3.返回开始菜单 n;switch (n)case 1: FIFO(); kaishi(); break; case 2: LRU
31、(); kaishi(); break; case 3: kaishi(); kaishi(); break;/*-*/*判断输入数据是否有效*/ int decide(char str)/判断输入数据是否有效int i = 0;while (stri != 0)if (stri9) i+;return 0; break;return i;/*将字符串转换成数字*/ int trans(char str, int a)/将字符串转换成数字int i;int sum = 0;for (i = 0; ia; i+)sum = sum + (int)(stri - 0)*pow(10, a - i
32、- 1);return sum;第 21 页 共 22 页操作系统课程设计报告/*先来先服务调度算法*/ void FCFS(int cidao, int m)/磁道号数组,个数为 mint now;/当前磁道号int sum = 0;/总寻道长度int j, i;int a;char str100;float ave;/平均寻道长度cout *先来先服务* endl; cout 磁盘请求序列为:;for (i = 0; im; i+)/按先来先服务的策略输出磁盘请求序列cout cidaoi ;cout endl;cout str;/对输入数据进行有效性判断a = decide(str);i
33、f (a = 0)elsecout 输入数据的类型错误,请重新输入! endl; goto B;now = trans(str, a);/输入当前磁道号sum += abs(cidao0 - now); cout 磁盘扫描序列为:;for (i = 0; im; i+)/输出磁盘扫描序列cout cidaoi ;for (i = 0, j = 1; jm; i+, j+)/求平均寻道长度sum += abs(cidaoj - cidaoi); ave = (float)(sum) / (float)(m);cout endl;cout 平均寻道长度: ave endl;void cipandi
34、aodu() /磁盘调度int a;第 22 页 共 23 页操作系统课程设计报告int c;/菜单项int cidaomaxsize;int i = 0, count; char str100; cout endl;cout t1.先来先服务t2.返回开始菜单 str;/对输入数据进行有效性判断a = decide(str); if (a = 0)cout 输入数据的类型错误,请重新输入! endl; goto F;/输入错误,跳转到 F,重新输入elsec = trans(str, a);cout 请输入磁道序列(0 结束): str;/对输入数据进行有效性判断a = decide(str);if (a = 0)cout 输入数据的类型错误,请重新输入! str;/对输入数据进行有效性判断a = decide(str);if (a = 0)cout 输入数据的类型错误,请重新输入! endl;elsecidaoi = trans(str, a); i+;count = i - 1;/要访问的磁道数cout 你输入的磁道序列为:;for (i = 0; icount; i+)cout cidaoi ;