模拟操作系统(Java)_模拟操作系统的组成-程序员宅基地

技术标签: java  操作系统  课程设计  

在这里插入图片描述
gitee完整代码下载
github完整代码下载

一、 需求分析

模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。预计程序所能达到的功能:
进程管理模拟:实现操作系统进程管理功能,如实现进程的控制(进程调度,进程创建与撤销,状态转换,进程唤醒),进程并发执行。
存储管理模拟:实现内存空间的分配和回收、存储保护。
设备管理模拟:主要包括设备的分配和回收。
文件管理和用户接口:主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。

二、 概要设计

  1. 通过程序来模拟计算机的硬件系统,在此基础上实现操作系统的模拟实现。
  2. 本次实验由5个模块构成
    (1) 文件管理模块
    (2) 进程控制及内存管理模块
    (3) 硬件实现及管理模块
    (4) 用户界面交互模块
    (5) 系统内核软件模块
  3. 主程序的流程图

三、详细设计

(1) 文件管理模块

文件管理模块由以下3个类组成

1.MyFile类

该类是操作系统的基本文件单位,这个类包含了文件的数据内容,名字,属性以及磁盘的起始扇区和长度等,构成一个基本的文件。利用输入的属性和数据来初始化文件,同时提供了getter和setter方法可以对文件的属性进行访问和修改。

  1. FileSamplesGenerator类

该类通过预设的二进制代码生成可执行的文件。这个类中保存了10个可执行的程序的代码,通过调用文件系统中创建文件的方法,将这些代码转换成操作系统内部的文件,同时将文件名和路径记录在这个类中。

  1. FileSystem类

该类用于管理整个文件系统。通过读取磁盘文件,利用FileSamplesGenerator类生成可执行文件和利用DirTreeParser类生成目录树进行初始化,包含了查找磁盘空闲扇区和分配空闲扇区的功能接口,以实现将FAT中的数据直接写入磁盘或直接对磁盘盘块进行写入操作,以及可以对操作系统内的文件直接进行查找和访问。对外提供了创建、打开、读取、写入、关闭、删除文件的功能方法,并且可以获取路径下的子目录,并且修改文件的属性。

(2)进程控制及内存管理模块

进程控制及内存管理模块由以下4个类组成

1.ExcuteTask类

该类是操作系统的进程调度的类,这个类包含了进程创建、进程销毁、进程阻塞、进程唤醒等功能,模拟一个进程的生命周期及维护相应的就绪和阻塞队列,并且调用其他类来模拟申请内存与释放内存、查看当前内存详情和获取正在执行的指令等

2.MenoryBlock类

该类是内存块类,获取具体被分配的线程id的属性和大小,提供了getter和setter方法可以对内存块的属性进行访问和修改。

3.MemoryController类

该类是内存空间的管理类,用于维护一个内存块队列,比如添加一个新内存块、删除一个内存卡、获取当前内存块队列,提供了getter和setter方法可以对内存的属性进行访问和修改。

4.SimulationThread类

该类是进程的一个模拟类,通过进程的id或者对应的可执行文件来启动或者新建一个进程、包括获取进程id和获取进程阻塞原因,同时提供了getter和setter方法可以对进程的属性进行访问和修改。

(3)硬件实现及管理模块

硬件实现及管理模块由以下8个类组成:

  1. HardDevice类
    该类为抽象类,默认无任何模仿功能,类中封装了硬件设备的状态,ID和名字等成员变量,同时提供getStatus、getID和getName方法对硬件设备的三个成员进行访问,该类需要被所有除CPU以外的硬件类继承。

  2. Peripheral类
    该类继承了HardDevice类,定义了interval用以表示外围设备被占用倒计时的计时器;同时提供了方法allocate用以申请占用外围设备time个计时周期;refresh方法用以更新设备状态,并在每个CPU周期开始时执行,设备之前若处于中断状态,则取消中断,若已被占用,则扣除clock个计时周期;reset方法用于重置设备的计时器和状态。

  3. Memory类
    该类继承了HardDevice类,定义了私有变量storage用数组模拟内存,用maxCapacity表示内存的最大容量。同时,类中包含了方法read用以从address地址的内存中读取一字节的数据;方法write用以向address地址的内存中写入一字节的数据;方法getMaxCapacity用以访问内存的最大容量。

  4. Disk类
    该类继承了HardDevice类,类中包含了storage表示内存,filename表示磁盘数据存储的文件名,即虚拟磁盘,maxCapacity表示磁盘的最大存储量,sectorSize表示磁盘中块的容量,sectorCount表示硬盘中块的数量。同时提供了方法read从磁盘中读取第address块的64字节数据;方法write将64字节的数据写入磁盘的第address块中;方法load从实际硬盘中试图加载制定名字的虚拟磁盘,并读取其中的数据,该方法用在Disk类的构造方法中;方法initialize在未找到虚拟磁盘文件时,则建立指定名字的文件,该方法用在Disk类的构造方法中;方法store用以将暂存于内存中的数据存入虚拟磁盘实际的数据文件中;以及方法getMaxCapacity,getSectorSize,getSectorCount分别对磁盘的最大容量,最大块长度和块的数量进行访问。

  5. CPU类
    该类为中央处理器,控制一切硬件的行为,对接模拟系统。该类包含了内存、磁盘、外围设备、硬件、寄存器AX和计时器。同时类中还提供了方法readMemory用以从内存中的address地址中读取一字节数据;方法writeMemory用以向address地址的内存中写入一字节的数据;方法readDisk用以从磁盘中的address地址中读取一块64字节的数据;方法writeDisk用以向address地址的磁盘中写入一块64字节的数据;方法initializePeripheral用以在实例化CPU时,初始化所需要的所有外设;方法getX用以获取寄存器AX的值;方法getStatus用以获取指定名称的硬件的状态;方法getPeripheralStatus用以获取指定名称的外设的状态;方法getMemoryCapacity用以获取内存的最大容量;方法getDiskCapacity用以获取硬盘的最大容量;方法allocatePeripheral用以申请占用外设time个计时周期,由execute方法定期调用;方法refreshPeripheral用以更新设备状态;方法resetPeripheral用以重置外设状态。总的来说,该类主要执行的是检查各硬件的状态,在各时钟周期内不断地完成读写等操作,完成存储管理和设备管理的任务。在该类的函数中,每次执行指令前,均检查设备的状态,判断是否有中断,如有中断先进行取消,再执行其他的操作。

(4)用户界面交互模块

用户界面交互模块主要由以下个14个类组成

1.Controller类

该类是整个面板的控制类,在里面设置了所有栏的参数和所有窗口的设置。进行了图标的读取与设置,已经各个app名称的设置,还有建造窗口时基本的设置。
2.Apppane类

底部次级栏设置,设置了10张照片分别对应底部10个应用程序的图标。
3.ControllerSetter类
整个界面的设置,获取整个屏幕的大小,整个主页面都是一个controller类,可以设置背景图片。
4.CPUWin类
CPU窗口的创建,设置了4个文本框来写出目前状态。
5.DeviceWin类
设备状态的显示窗口。设置了众多文本来表示目前各设备的状态。
6.DictionaryWin类
磁盘目录的显示窗口,调用了磁盘目录类的使用方法。使用简单第归遍历数据, 重新建立目录结构。
7.DickWin类
磁盘状态的显示窗口,未占用的内存鸽子就是绿色,占用了就是红色。
8.FileWin类
次级栏中的模拟程序的窗口,打开了就显示当前程序正在运行,并且调用了StringBuilder类的方法。
9.HelpWin类
顶部状态栏中的帮助窗口的建立。
10.MainMemoryWin类
内存状态的显示窗口,同时调用了SystemCore类的方法,方便进行内存状态的更新。
11.SuperWin类
Win的子类,在Win类的基础上,增加了快捷键的动态效果,把鼠标移上去时会出现动态效果放大缩小。
12.TerminalWin类
终端的窗口设置,调用了终端的设置类。
13.UpdateCenter类

Controller类的更新设置,time设置了更新的周期。
14.Win类

最基本的窗口类,进行窗口参数设置,里面也有其他窗口的基本设置。在这里设置了窗口的名字,大小,还有是否更新窗口的update设置。

(5)系统内核软件模块

1.Compiler类

Compiler类用于创建编译器对象,主要实现对创建的“可执行文件”进行汇编/编译的功能,其中“可执行文件”中所能编译通过执行的指令只有5中,包括:
ASSIGNMENT:x=?,对x进行赋值,其中x为两位数。
ADD:x++ x加1(x小于等于255,大于等于1)
DEL:x- - x减一
USEHARD:I/O指令
FINISH:终止运算,表示可执行文件结束

  1. Shell类

Shell提供用户命令接口,通过终端窗口接受用户从键盘键入的命令,并对用户输入的命令进行处理并返回处理结果。
实现的命令如下:

  1. create : create /usr/tes.e [创建一个带空字符的普通文件]
  2. delete : delete /usr/tes.e [删除文件]
  3. cat : cat /usr/tes.e [查看文件的内容]
  4. copy : copy /usr/tes.e/drv/tes.e [复制文件到其他的目录]
  5. mv : mv /usr/tes.e /drv/tes.e [移动文件到其他的目录]
  6. echo : echo “ABC” > /usr/tes.e [重定向输入文本到文件中,双引号包含输入内容
  7. mkdir : mkdir /usr/bin [创建一个目录]
  8. rmdir : rmdir /usr/bin [删除一个目录]
  9. exe : exe /usr/000/e [执行一个可执行的文件]
  10. time : time [查看当前系统的时间片]
  11. clear : clear [清屏]
  12. poweroff : poweroff [关机]
  13. system : system [系统开发者]
  14. compile : compile /usr/abc.s [在当前目录下生成编译文件,编译前必须删除以前的编译文件]
  15. close : close /usr/005.e [手动关闭文件]

3.DirTreeParser类

DirTreeParser类实现生成JSON格式的系统目录,供文件系统FileSystem通过生成对象调用getJsonTree生成系统文件目录,目录结构采用树型目录结构,目录名或文件名:3个字节,拓展名:1个字节。根目录位置固定为OS。

五、用户使用说明

程序开始时会创立一个主界面,包含了系统所有功能的入口,通过对界面组件事件的监听,可以响应用户的请求,显示用户需要的窗口,或者可以通过终端窗口,用户可以根据终端指南窗口的提示,对文件进行操作,用户可以通过磁盘,文件目录界面对操作系统内的文件情况进行观察,同时可以通过对cpu,内存,设备状态界面来观察可执行文件运行时,操作系统的内在状况。也可以通过更换夜间模式,更换壁纸和分辨率选择用户界面的样式。

六、功能

  • 进入页面
  • 主界面
  • 窗口设置
  • 1280*720
  • 1024*768
  • 交换壁纸
  • 打开次级栏后的页面
  • 运行程序
  • 未运行程序时的CPU状态
  • 运行程序时CPU状态
  • 未运行程序时内存的状态
  • 运行程序时内存的状态
  • 磁盘状态
  • 磁盘目录
  • 未运行程序时的设备状态
  • 运行程序时的设备状态
  • 终端处理:
  • 创建文件
  • 删除文件
  • 查看文件
  • 清屏
  • 移动文件
  • 复制文件
  • 重定向文本到文件中
  • 新建目录
  • 删除目录
  • 运行程序
  • 显示当前运行了的时间片
  • 显示系统开发者
  • 生成编译文件
  • 顶部菜单栏中点击文件可以出现磁盘目录
  • 顶部菜单栏中点击前往中的CPU状态可以显示CPU状态
  • 顶部菜单栏中点击前往中的磁盘状态可以显示磁盘状态
  • 顶部菜单栏中点击前往中的内存状态可以显示内存状态
  • 顶部菜单栏中点击前往中的设备可以显示设备状态
  • 顶部菜单栏帮助中的终端指令指南
  • 帮助中的快捷键指南
  • 帮助中的课设成员名单
  • 夜间模式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44560620/article/details/113405957

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签