hello各位同学欢迎使用学习本人开发的纯javascript模拟操作系统,本模拟系统灵感结构来源于linux系统结构,同时结合学校操作系统所学内容构思和开发,新手上路,架构设计如有不合理,系统任何bug,欢迎各位大佬指教。
all right编程一途永远在学习的路上,目前代码量还不是很多,架构我也一直在思考,我也不是什么大佬,只是一个不断学习的小白,我写这个模拟系统初衷也是为了学习,前端,JavaScript,我是一个喜欢探索未知的人,我也是一个喜欢创造的人(模仿只是为了学习),学习交友微信Rightstar_
,
友情链接
个人网站:
星空校园
微信公众号
:星球信息
项目链接
jsOS模拟系统预览
:jsOS模拟系统
GitHub地址
:jsOS源码
设计思想也不多说了,还是来源于操作系统那一套书,还有linux系统结构
贴张图吧
这是linux2.40版源码目录,看文件夹名称也知道有关功能和结构了
V1.0
:操作系统进程调度模拟功能,部分功能未完成
V1.1
:已去掉模拟部分,主更新应用
命令 | 参数 | 功能 |
---|---|---|
cls | 无 | 清空控制台 |
showClock | 无 | 显示所有时钟 |
clearClock | 无 | 清空所有时钟 |
clearClock | 空格+时钟ID | 删除指定ID时钟 |
runDC | 无 | 启动设备管理器 |
stopDC | 无 | 关闭设备管理器 |
通过javascript脚本语言设计实现模拟系统,参考window及linux系统内核文件结构,学习系统模块的设计思想,实现进程调度模拟,理解熟悉基本进程调度算法的思想
设计模拟系统,核心部分由javascript语言实现,可依靠浏览器平台实现运行,模拟系统参考window及linux系统结构,实现基本的内存,CPU,设备,进程管理调度等模块, 系统首要实现FIFO,RR,优先数调度等基本进程调度算法模拟, 而后可实现操作系统的更多模拟功能。
Window环境,vscode
本模拟系统采用javascript语言开发,借鉴linux内核文件结构思想,window窗口图形思想,为更接近实现操作系统的模拟状态,模仿系统真实的进程管理,存储管理,设备管理,文件管理等功能的运行实现过程,设计有以下重要js文件模块
系统上层部分
文件名称 | 功能说明 |
---|---|
Main.js | 系统入口文件 |
Os.js | 系统初始化文件 |
consoleCmd.js | 控制台命令函数库 |
Command.js | 系统操作命令函数库 |
Process.js | 进程创建函数库 |
Application.js | 应用定义创建 |
Device.js | 设备管理器主文件 |
设备
文件名称 | 功能说明 |
---|---|
WindowDrawer.js | 窗口创建设备 |
Drawer.js | 画图设备 |
系统底层部分
文件名称 | 功能说明 |
---|---|
CPU.js | CPU模拟主文件 |
Scheduler.js | 进程调度模拟文件 |
ConsoleWindow.js | 控制台窗口显示文件 |
clock.js | 时钟模块,负责运行时赋予 |
Utils.js | 系统工具函数库 |
Mm.js | 内存模块 |
Config.js | 系统配置及说明 |
本模拟系统设计大部分操作数据位于mm.js模块中,设置为全局变量访问。
以下为重要变量及数组的清单及功能说明:
变量名 | 说明 |
---|---|
mainWindow | 图形窗口主界面dom对象 |
windowCreateNum | 已创建过的窗口数 |
cmdHistoryIndex | 历史命令位置索引 |
OSTime | 系统时间单位ms |
deviceCCID | 设备管理器时钟ID |
deviceRoundTime | 设备管理器时钟周期单位ms |
drawerCreateNum | 创建过的画图设备数 |
processHistoryNum | 历史创建过的进程数 |
FreTime | CPU时间片长度单位ms |
CPUSliceIndex | CPU时间片序列号 |
数组名 | 说明 |
---|---|
windowList | 创建的窗口队列数组 |
cmdHistory | 控制台历史命令数组 |
clockList | 时钟心跳ID存放的数组 |
drawerList | 画图设备存放的队列 |
deviceIODataList | 设备请求输入输出队列 |
PCBCreateList | 已创建过的进程 |
PCBList | 进程队列 |
PCBReadlyList | 进程就绪队列 |
PCBBlockList | 进程阻塞队列 |
ImitateProcessList | 未加入PCBList的模拟进程队列, |
CPU | CPU运行中的进程队列 |
1.先来先服务调度算法(FCFS)
先来先服务(First Come First Service)算法是一种最简单的调
度算法,可以应用于高级调度(作业调度)也可以应用于低级调度(进
程调度)。高级调度时,FCFS调度算法按照作业进入后备作业队列的先
后顺序选择作业进入内存,即先进入后备作业队列的作业被优先选择进
入内存,然后为选中的作业创建进程并分配该作业所需资源。低级调度
时,FCFS调度算法每次从内存的进程/线程就绪队列中选择一个最先进入
的进程/线程,然后由进程/线程调度程序将CPU分配给它并使其运行。
FCFS调度算法是一种非抢占式调度算法,当某进程/线程占用了CPU
后就一直运行,直到该进程/线程运行结束才放弃CPU,或在运行中因发
生某等待事件被阻塞而放弃CPU。
FCFS实现流程
–扫描就绪队列
–CPU空闲则下一步,否则该进程等待时间加一
–分配进程运行完成所需的时间,进入CPU
–继续扫描
2.时间片轮转调度算法(RR)
时间片轮转(Round Robin)调度算法主要用于低级调度。在采用时
间片轮转调度算法的系统中,进程?线程就绪队列总是按进程/线程到达
系统时间的先后次序进行排队,进程/调度程序按先来先服务的原
则,选择就绪队列中的第一个进程?线程,将 CPU分配给它执行。进程/
线程每次使用 CPU的时间只能是一个时间片,当运行进程?线程用完规定
的时间片时必放弃CPU的使用权。这时,进程/线程调度程序又将CPU分
配给当前就绪队列的第一个进程/线程,而放弃 CPU的进程?线程,则回
到就绪队列的队尾,等待下次轮转到自己时再投入运行。所以只要是处
于就绪队列中的进程/线程,按时间片轮转法调度将迟早会获得CPU而得
到运行,并不会发生无限期等待的情况。
RR实现流程
–扫描就绪队列
–CPU空闲则下一步,否则该进程等待时间加一
–分配固定的时间片,进入CPU
–进程被分配的时间片用完则返回就绪队列
–继续扫描
3.优先级调度算法
优先级调度算法既可用于高级调度,也可用于低级调度,还可用于
实时系统。若调度的对象为作业,优先级调度算法每次从后备作业队列
中选择优先级最高的作业调入内存,为其分配相应的资源并创建进程放
入到进程就绪队列。若调度的对象为进程,则优先级调度算法每次从进
程就绪队列中,选择优先级最高的进程为其分配 CPU而投入运行。如果
有多个优先级最高的作业/程,则可结合先来先服务或短作业/进程
优先调度策略。
(1)静态优先级
作业/程在进入系统或创建时被赋予一个优先级,该优先级一旦确
定则在其整个生命期内不再改变。对于作业,其优先级可依据费用来确
定;对于进程,其优先级主要依据进程的类型(系统进程还是用户进
程)、进程的资源需求(资源需求少的进程优先级高)、时间需求(短
进程优先)和用户要求来确定
静态优先级实现流程
–扫描就绪队列
–选择优先级最高的进程
–CPU空闲则下一步,否则该进程等待时间加一
–分配进程运行完成所需的时间,进入CPU
–进程被分配的时间片用完则返回就绪队列
–继续扫描
调度算法需要PCB内数据的支持,故设计PCB结构如下
变量名 | 说明 |
---|---|
PCBID | 进程ID |
state | 进程状态标识 |
processName | 进程名称 |
firstReach | 初次获得CPU |
clockID | 时钟ID |
app | 进程绑定的应用实例 |
isImitate | 进程模拟的标识 |
imitateData | 进程模拟所需数据 |
以下为imitateData内的变量
变量名 | 说明 |
---|---|
timeSliceNum | 进程分配到的时间片 |
imitateType | 模拟类型标识 |
priorityLevel | 进程优先级数 |
runTime | 进程完成所需的运行时间片 |
usedSliceNum | 进程已使用的时间片数 |
reachTime | 进程到达就绪队列的时间 |
startTime | 进程开始时间(初次获得CPU的时间) |
finishTime | 完成时间 |
waitTime | 等待时间 |
roundTime | 周转时间(完成时间-到达时间) |
wRoundTime | 带权周转时间(周转时间/所需运行时间) |
结果符合
略
我的GitHub
https://github.com/rightstar2020/jsOS
码云
https://gitee.com/rightstar/jsOS
在线预览
https://rightstar.top/jsOS/