ZZULI 操作系统实训 一个微型模拟操作系统设计与实现


实现了演示视频要求以及验收要求。
思路就是根据他给出的主框架代码推出来需要补充的内容,多看实训任务书中的实验要求,那里面写的挺详细,就是有点抽象,代码中也给出了很多注释。
看懂程序框架里面定义的数据结构就好弄了

开发工具为Clion。

微型模拟操作系统的设计

系统总体功能设计

经过详细的系统需求分析,该平台需要构建3个大的模块,每个大模块下包含一些小的功能模块。
在这里插入图片描述

进程管理设计

依据系统的需求分析,主要设计了6个功能,分别是创建进程、创建子进程、添加进程到就绪队列、处理机调度、阻塞进程、终止进程,具体设计如下:

创建进程

启动时创建一个PID为1的初始进程,它是系统进程且无法终止。所有其他进程都是它的后代,并且在模拟中不使用资源。系统会监听用户输入,当输入命令为“new”时,会创建一个新进程并将其放入就绪队列的末尾。如果队列为空,新进程会占用CPU。新进程的PID从2开始递增选择。

创建子进程

命令为“fork”,输入该命令后,系统会先检测当前使用CPU的进程是否为初始进程,如果是,提示用户创建新的进程。否,则进行创建子进程的操作。

添加进程到就绪队列

将给定进程添加到就绪队列,或者如果CPU空闲,则该进程直接开始运行。先判断CPU是否空闲,然后直接根据进程号添加。

处理机调度

“-”命令指示系统时间向前推进了一个“节拍”或“量子”,表示当前运行的进程已使用CPU消耗了一个时间片。此时,该进程应该被抢占,放入就绪队列的末尾。使用RR调度算法处理就绪队列,先将当前进程移动到队列末尾,再将队首进程设置为当前使用CPU的进程。

阻塞进程

命令“wait”来阻塞进程并等待某一子进程终止。等待结束后,进程转到队列的末尾。如果已存在僵尸子进程,则进程继续占用CPU并删除其PCB。如果存在多个僵尸子进程,系统会使用其中任意一个子进程立即重新启动父进程,而其他僵尸进程继续等待父进程的下一次被阻塞。

终止进程

"exit"命令用于终止当前进程,如果父进程等待该进程则立即终止,否则成为僵尸进程。如果父进程是进程1,则终止该进程并将就绪队列中的第一个进程加入CPU,如果队列为空,则让进程1使用CPU。

存储管理设计

包括分页存储管理和页面置换算法的实现,旨在减少缺页率。

分页存储管理

命令为"m [address]"表示当前正在使用CPU的进程请求对逻辑地址进行内存操作。这个命令允许进程直接与内存进行交互,进行读取或写入操作。通过指定逻辑地址,进程可以访问相应的内存位置,并进行所需的操作。这有助于进程在需要时获取或修改存储在内存中的数据。

页面置换

根据需求分析,对页面帧集合遍历,存在当前页则更新时间戳,否则调用LRU算法。判断页号是否大于页面帧集合大小,如果是就找到时间戳最小的页面帧进行置换,否则创建新页面帧加入集合中。实现页面置换功能。

文件管理设计

基于微型模拟操作系统的文件管理结构设计,文件管理模块实现了两个主要功能:IO请求访问磁盘和从磁盘移除进程。

IO请求访问磁盘

使用"d #number #track"命令表示当前CPU进程请求访问硬盘#number,对编号为#track的磁道进行读写操作。首先将IO请求插入IO队列,并从CPU中移除当前进程,然后从就绪队列中取出新进程执行。

从磁盘移除进程

将当前使用磁盘的进程从磁盘移除并放回就绪队列,根据磁盘调度算法选择下一个进程使用该磁盘。使用"D #num"指令表示#num号硬盘完成一个进程的I/O请求,被移除的进程重新进入就绪队列等待,然后取出下一个进程使用该磁盘。

项目功能实现

这里只展示部分功能实现

进程管理功能

打开程序后,用户输入内存容量、页面大小和硬盘个数。根据用户输入,创建操作系统相关对象,并将参数赋值给构造方法进行配置。
在这里插入图片描述
创建进程和创建子进程,用户在输入相关操作后系统会提示用户创建成功。
在这里插入图片描述
处理机调度时,根据用户输入的操作,系统会使用循环轮转(RR)调度算法对就绪队列和当前CPU进程进行处理,将当前CPU进程放到就绪队列末尾。
在这里插入图片描述
阻塞进程,会先判断该进程是否有子进程,若没有则直接将其移动到队列末尾,不需要等待。若有子进程,则进入等待状态,并将就绪队列的对头进程发送给CPU。
在这里插入图片描述

存储管理功能

包括分页存储管理与页面置换功能2个模块。
在这里插入图片描述

文件管理功能

当前使用CPU的进程请求硬盘#number,要读取或写入编号为#track的磁道的函数功能。部分代码:

if((disk_number < number_of_hard_disks)&&(disk_number >= 0))      
	  hard_disks[磁盘号]->Request(磁道号, CPU);
      GetNextFromReadyQueue();
}
else
{
	cout << "没有硬盘" << disk_number << endl;
}
if(io_queue.empty())
{
    //放到队列末尾
    
    return;
}
//再放到队列末尾

io_queue.sort(cmp);//要重写

std::list<std::pair<int, int>> io1, io2;
for(auto& it : io_queue)
{
    if(it.second < current_track)
    {
        io1.push_front(it);
    }
    else
    {
        io2.push_back(it);
    }
}

在这里插入图片描述

部分运行截图

进程的创建、终止和调度

内存的分配与页面置换在这里插入图片描述
磁盘调度

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值