操作系统(一个小型操作系统的设计与实现)课程设计
- 格式:doc
- 大小:519.00 KB
- 文档页数:40
南通大学计算机科学与技术学院操作系统课程设计报告
专业:
学生姓名:
学号:
时间:
操作系统模拟算法课程设计报告设计要求
将本学期三次的实验集成实现:
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:"<