操作系统(一个小型操作系统的设计与实现)课程设计

  • 格式:doc
  • 大小:519.00 KB
  • 文档页数:40

下载文档原格式

  / 40
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南通大学计算机科学与技术学院操作系统课程设计报告

专业:

学生姓名:

学号:

时间:

操作系统模拟算法课程设计报告设计要求

将本学期三次的实验集成实现:

A.处理机管理;

B.存储器管理;

C.虚拟存储器的缺页调度。

设计流程图

主流程图

A.处理机调度

1)先来先服务FCFS

先来先服务算法流程

2)时间片轮转法

时间片轮转算法流程图

B.存储器管理(可变式分区管理)

1)首次适应法

分配流程图

首次适应算法回收流程图

2)最佳适应法

回收内存流程

C.虚拟存储器的缺页调度

1)先进先出FIFO

2)LRU

实现原理

主界面

设计一个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序。

A.处理机调度

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];

*/

进程名

链接指针

到达时间

估计运行时间

进程状态

(五)实现方法

建立一个链表按照到达CPU的时间从小到大排列,只需从第一个作业(头结点)依次调度到最后一个作业(尾结点)。

(六)运行界面

测试数据:

作业名到达时间运行时间

A 0 28

B 0 9

C 0 3

执行FCFS算法如下:

2)时间片轮转法

(一)任务

只对进程的运行模拟,将其运行时间加一,判断要求运行时间与已运行时间是否相等,若相等则表示进程结束,进程退出调度,释放资源。

(二)要求

1.实现对RR算法的模拟实现

2.显示执行完一个时间片的结果。

(三)原理

时间片轮转算法中,系统将所有的就程序按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;

然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

(四)数据结构

temp->state='R'; //初始状态每个进程均为运行态

temp->allocation=0; //初始时进程均不占用cpu

num+=temp->need_time; //用num来限制循环的次数

(五)实现方法

处理器调度总是选择标志单元指示的进程运行。执行:

已运行时间+1

来模拟进程的一次运行,表示进程已经运行过一个单位的时间。当一个进程被选中运行时,必须设置该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片

进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,

若该进程的要求运行时间 已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。

进程名

链接指针

到达时间

估计运行时间

进程状态

进程控制块结构

(六)运行界面

测试数据:

作业号执行时间/s

A 1

B 2

C 1

执行时间片轮转算法RR如下:

B.存储器管理(可变式分区管理)

1)首次适应法

(一)任务

通过采用首次适应算法实现内存的分配与回收,并可以查看和显示当前内存现状。

(二)要求

1.实现对FF算法的模拟实现

2.输入要进行分配内存的进程ID和相应所需内存大小,回收内存时输入已运行的进程ID。

(三)原理

FF算法要求空闲链已地址递增的次序连接。分配内存时,从链首开始顺序查找,直到找到第一个满足要求的空间并分配给进程,把分配后余下的空间仍然留在链表中。若从链首至链尾都不满足要求,则分配失败。该算法倾向于优先使用低地址的空间。

(四)数据结构

int const MEMO=256;//初始化常类型MEMO,用MEMO表示内存大小(常类型的变量或对象的值是不能被更新的)

struct FreeMemory

{

int ID;int StartAdd;int Size;

bool State;//定义state 为布尔型变量,其值只有真(TRUE) 和假(FALSE) FreeMemory* Next;

};

FreeMemory* AllocTable=new FreeMemory;//建立全局管理表用于内与回收FreeMemory* PtrforCycleFit=AllocTable;//为循环首次适应定义的指针,此指针用于指向当前查找的起始地址;

//初始化内存函数

void MemoryInit(FreeMemory* &tempAdd)

{

tempAdd->ID=0;//初始化当前进程为空

tempAdd->Size=MEMO;//初始化可分配空间为内存大小

tempAdd->StartAdd=0;//初始化起始地址为0

tempAdd->State=false;// 初始化状态为未分配

tempAdd->Next=NULL;//初始化下一个进程也为空

}

//反馈内存现态

void DispMemory()

{

FreeMemory* temp=AllocTable;//全局管理表反映内存状态

cout<<"系统总内存: "<

for(;temp;temp=temp->Next)

cout<<"进程ID:"<ID<<" "<<"大小:"<Size<<" "<<"起始