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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

相关文档
最新文档