# jsOS **Repository Path**: zhang-feii/jsOS ## Basic Information - **Project Name**: jsOS - **Description**: javascript模拟操作系统 - **Primary Language**: CSS - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-12-14 - **Last Updated**: 2022-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[toc] # 前言 >    hello各位同学欢迎使用学习本人开发的纯javascript模拟操作系统,本模拟系统灵感结构来源于linux系统结构,同时结合学校操作系统所学内容构思和开发,新手上路,架构设计如有不合理,系统任何bug,欢迎各位大佬指教。 all right编程一途永远在学习的路上,目前代码量还不是很多,架构我也一直在思考,我也不是什么大佬,只是一个不断学习的小白,我写这个模拟系统初衷也是为了学习,前端,JavaScript,我是一个喜欢探索未知的人,我也是一个喜欢创造的人(模仿只是为了学习),学习交友微信`Rightstar_`, **友情介绍** `个人网站:`[星空校园](http://www.leftstar.cn) `微信公众号`:[星球信息](https://mp.weixin.qq.com/s/2riafaVlNmsmvzQp19Luzg) # 设计思想介绍 设计思想也不多说了,还是来源于操作系统那一套书,还有linux系统结构 贴张图吧 ![1](https://img-blog.csdnimg.cn/20200918100903380.png) 这是linux2.40版源码目录,看文件夹名称也知道有关功能和结构了 # 版本及迭代 `V1.0`:操作系统进程调度模拟功能,部分功能未完成 `V1.1`:已去掉模拟部分,主更新应用 # 主界面 ![2](https://img-blog.csdnimg.cn/2020091810124354.png) # 基本使用方式 ## 基本命令 命令| 参数 | 功能 :-----|:------|:------ cls|无|清空控制台 showClock|无|显示所有时钟 clearClock|无|清空所有时钟 clearClock|空格+时钟ID|删除指定ID时钟 runDC|无|启动设备管理器 stopDC|无|关闭设备管理器 # 实习报告书--jsOS模拟操作系统的实现 ## 一、设计目的 通过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 |系统配置及说明 #### ②模块结构依赖 ![3](https://img-blog.csdnimg.cn/20200918101324411.png) #### ③重要数据结构 >本模拟系统设计大部分操作数据位于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运行中的进程队列 #### ④程序流程 ![4](https://img-blog.csdnimg.cn/20200918101352422.png) ### <二>进程调度 #### ①算法原理 `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| 带权周转时间(周转时间/所需运行时间) #### ③程序流程 ![5](https://img-blog.csdnimg.cn/20200918101422802.png) ## 五、运行示例及结果分析 FCFS算法运行示例 ![6](https://img-blog.csdnimg.cn/20200918101444945.png) 结果符合 ## 六、心得体会 略 ## 七、附录、程序代码 见程序代码压缩文件