2020年操作系统(一个小型操作系统的设计与实现)课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作者:非成败
作品编号:92032155GZ5702241547853215475102
时间:2020.12.13
南通大学计算机科学与技术学院
操作系统课程设计报告
专业:
学生姓名:
学号:
时间:
操作系统模拟算法课程设计报告设计要求
将本学期三次的实验集成实现:
A.处理机管理;
B.存储器管理;
C.虚拟存储器的缺页调度。
设计流程图
主流程图
A.处理机调度
1)先来先服务FCFS
先来先服务算法流程
2)时间片轮转法
时间片轮转算法流程图
B.存储器管理(可变式分区管理)
1)首次适应法
分配流程图
首次适应算法回收流程图
2)最佳适应法回收内存流程
C.虚拟存储器的缺页调度
1)先进先出FIFO
2)LRU
修改主存分块表和页表
终止
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
2)时间片轮转法
(一)任务
只对进程的运行模拟,将其运行时间加一,判断要求运行时间与已运行时间是否相等,若相等则表示进程结束,进程退出调度,释放资源。
(二)要求
1.实现对RR算法的模拟实现
2.显示执行完一个时间片的结果。
(三)原理
时间片轮转算法中,系统将所有的就程序按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;
然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
(四)数据结构
temp->state='R'; //初始状态每个进程均为运行态
temp->allocation=0; //初始时进程均不占用cpu
num+=temp->need_time; //用num来限制循环的次数
(五)实现方法
处理器调度总是选择标志单元指示的进程运行。执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。当一个进程被选中运行时,必须设置该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片
进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间 已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”且退出队列。此时,应把该进程的进程控制块中的
(六)运行界面
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:"< }// 输出内存的各个变量 (五)实现方法 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区的个数是可以调整的。当需要装入一个作业时,根据作业需要的贮存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被分配作业占用,有的分区空闲。在空闲区表中,按空闲区首地址从低到高进行登记。 当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时,要考虑相邻空间区合并问题。作业的释放区与空闲区的邻接分以下4种情况考虑: A、释放区下邻空闲区;