一个小型的操作系统设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个小型的操作系统设计
与实现
Prepared on 24 November 2020
南通大学计算机科学与技术学院
操作系统课程设计报告
专业:计嵌151
学生姓名:王志宏
学号:
时间:2017/6/28
设计一个小型的操作系统设计要求
将本学期三次的实验集成实现:
1.中断处理
2.作业调度
3.PV原语
4.死锁
5.页面替换
6.磁盘调度
(一)设计流程图
主流程图
1.
寄存器,当中断寄存器内容不为―0‖时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中
的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加 1 来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0 时,表示无中断事件发生,继续执行指令;当读入信息=1 时,表示发生了时钟中断事件,转时钟中断处理程序
2.作业调度
1)先来先服务FCFS
原语
1)哲学家吃通心面问题
哲学家吃通心面:在这道题目里,每把叉子必须互斥使用,当一位哲学家吃通心面之前必须执行两个P操作,获得自己左右两边的叉子,在吃完通心面后必须执行两个V操作,放下叉子。
4.死锁
1)银行家算法
5.页面替换
1)先进先出FIFO
2)LRU
6.磁盘调度
1)先来先服务算法FCFS )
(二)实现原理
主界面
设计一个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序。
1.中断
2.作业调度
1)先来先服务FCFS (一)任务
先来先服务的调度算法实现处理机调度。 (二)要求
1.实现对FCFS 算法的模拟实现
2.计算出该算法的平均作业周转时间、平均带权作业周转时间。 (三)原理
按作业到达CPU 时间先后顺序进行非剥夺式调度,先到达CPU 的作业先被执行。
(四)数据结构
struct task_struct
{
char name; /*进程名称*/
int number; /*进程编号*/
float come_time; /*到达时间*/
float run_begin_time; /*开始运行时间*/
float run_time; /*运行时间*/
float run_end_time; /*运行结束时间*/
int priority; /*优先级*/
int order; /*运行次序*/
int run_flag; /*调度标志*/
}tasks[MAX];
int fcfs()/*先来先服务算法*/
进程控制块结构
(五)实现方法
建立一个链表按照到达CPU的时间从小到大排列,只需从第一个作业(头结点)依次调度到最后一个作业(尾结点)。
(六)运行界面
测试数据:
C 0 3
执行FCFS算法如下:
3.死锁
假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释放,故只需要遍历链表将各个进程中所需的资源统计出来,只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择kill 一进程,已达到释放资源的目的。
死锁检测函数:void sisuo()
死锁解除函数:void safe()
4.缺页调度
1)先进先出FIFO
(一)任务
采用先进先出FIFO算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。
(二)要求
1.实现对FIFO算法的模拟实现
2.输出每次执行的结果。
(三)原理
基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性较大。
(四)数据结构
void FIFO(){
int length;
int fifo[100]={0};
int pageLength;
int fifoPage[100]={0};
int i,j;
cout<<" ***********************先进先出算法
**************************"< pageLength=3; length=9; for(i=1;i<=length;i++){ int flag=0; for(j=1;j<=pageLength;j++){ if(fifo[i]==fifoPage[j]){ flag=1; j=pageLength+1; }else if(fifoPage[j]==0){ fifoPage[j]=fifo[i]; j=pageLength+1; flag=1; } } if(flag==1) { } else { cout<<" →淘汰"< for(j=1;j<=pageLength;j++){ fifoPage[j]=fifoPage[j+1]; } fifoPage[pageLength]=fifo[i];