模拟操作系统(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状态
  • 顶部菜单栏中点击前往中的磁盘状态可以显示磁盘状态
  • 顶部菜单栏中点击前往中的内存状态可以显示内存状态
  • 顶部菜单栏中点击前往中的设备可以显示设备状态
  • 顶部菜单栏帮助中的终端指令指南
  • 帮助中的快捷键指南
  • 帮助中的课设成员名单
  • 夜间模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库面试复习_数据科学面试复习

数据库面试复习大面试前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介绍 (Introduction) I crafted this study guide from multiple sources to make it as comprehensive as possible. This guide helped me prepare for both the technical and behavioral aspects of the …

hibernate缓存

(转自:http://www.cnblogs.com/java-class/p/6108175.html) 阅读目录 1. 为什么要用 Hibernate 缓存?2. 项目实战3. Hibernate 缓存原理回到顶部1. 为什么要用 Hibernate 缓存? Hibernate是一个持久层框架,…

分布与并行计算—用任务管理器画CPU正弦曲线(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次数,也就是2/0.01个,正好是一周final double PI Math.PI;final int interval 100;// 时间间…

Asp.net mvc中使用配置Unity

第一步:添加unity.mvc 第二步:在添加之后会在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 转载于:https://www.cnblogs.com/WJ--NET/p/7117839.html

正确认识 Vista 激活期限

当我们在安装 Vista 时,可以不输入序列号进行安装,这和以往的操作系统安装有所不同,我们不必再为安装系统时找不到我们的序列号标签而发愁。如果不输入序列号而继续安装系统,那么系统将提示我们有30天的激活期限!这里的…

Oracle使用hs odbc连接mssql2008

1.创建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷贝initdg4odbc,把名字改为initcrmsql(init所建odbc的名称) HS_FDS_CONNECT_INFO crmsql #odbc名称 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要连接的数据库名称 HS_FDS_RECOVERY_PWD…

【NGN学习笔记】6 代理(Proxy)和背靠背用户代理(B2BUA)

1. 什么是Proxy模式? 按照RFC3261中的定义,Proxy服务器是一个中间的实体,它本身即作为客户端也作为服务端,为其他客户端提供请求的转发服务。一个Proxy服务器首先提供的是路由服务,也就是说保证请求被发到更加”靠近”…

《人人都该买保险》读书笔记

内容目录: 1.你必须知道的保险知识 2.家庭理财的必需品 3.保障型保险产品 4.储蓄型保险产品 5.投资型保险产品 6.明明白白买保险 现在我所在的公司Manulife是一家金融保险公司,主打业务就是保险,因此我需要熟悉一下保险的基础知识&#xff0c…

如何击败腾讯_击败股市

如何击败腾讯个人项目 (Personal Proyects) Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an…

配置静态IPV6 NAT-PT

一.概述: IPV6 NAT-PT( Network Address Translation - Port Translation)应用与ipv4和ipv6网络互访的情况,根据参考链接配置时出现一些问题,所以记录下来。参考链接:http://www.cisco.com/en/US/tech/tk648/tk361/technologies_c…

python3虚拟环境中解决 ModuleNotFoundError: No module named '_ssl'

前提是已经安装了openssl 问题 当我在python3虚拟环境中导入ssl模块时报错,报错如下: (py3) [rootlocalhost Python-3.6.3]# python3 Python 3.6.3 (default, Nov 19 2018, 14:18:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux Type "help…

通过Xshell登录远程服务器实时查看log日志

主要想总结以下几点: 1.如何使用生成密钥的方式来登录Xshell连接远端服务器 2.在远程服务器上如何上传和下载文件(下载log文件到本地) 3.如何实时查看log,提取错误信息 一. 使用生成密钥的方式来登录Xshell连接远端服务器 ssh登录…

如何将Jupyter Notebook连接到远程Spark集群并每天运行Spark作业?

As a data scientist, you are developing notebooks that process large data that does not fit in your laptop using Spark. What would you do? This is not a trivial problem.作为数据科学家,您正在开发使用Spark处理笔记本电脑无法容纳的大数据的笔记本电脑…

是银弹吗?业务基线方法论

Fred.Brooks在1987年就提出:没有银弹。没有任何一项技术或方法可以能让软件工程的生产力在十年内提高十倍。 我无意挑战这个理论,只想讨论一个方案,一个可能大幅提高业务系统开发效率的方案。 方案描述 我管这个方案叫做“由基线扩展…

同一服务器部署多个tomcat时的端口号修改详情

2019独角兽企业重金招聘Python工程师标准>>> 同一服务器部署多个tomcat时&#xff0c;存在端口号冲突的问题&#xff0c;所以需要修改tomcat配置文件server.xml&#xff0c;以tomcat7为例。 首先了解下tomcat的几个主要端口&#xff1a;<Connector port"808…

第一章-从双向链表学习设计

链表学习链表是一种动态的数据结构使用节点作为链表的基本单位存储在节点包括数据元素和节点指针一个完整的数据链表应包括转载于:https://www.cnblogs.com/cjxltd/p/7125747.html

思维导图分析http之http协议版本

1.结构总览 在http协议这一章&#xff0c;我将先后介绍上图六个部分&#xff0c;本文先介绍http的协议版本。 2.http协议版本 http协议的历史并不长&#xff0c;从1991的0.9版本到现在(2017)仅仅才20多年&#xff0c;算算下来,http还是正处青年&#xff0c;正是大好发展的好时光…

使用管道符组合使用命令_如何使用管道的魔力

使用管道符组合使用命令Surely you have heard of pipelines or ETL (Extract Transform Load), or seen some method in a library, or even heard of any tool to create pipelines. However, you aren’t using it yet. So, let me introduce you to the fantastic world of…

C# new关键字和对象类型转换(双括号、is操作符、as操作符)

一、new关键字 CLR要求所有的对象都通过new来创建,代码如下: Object objnew Object(); 以下是new操作符做的事情 1、计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数.堆上每个对象都需要一些额外的成员,包括“类型…

JDBC01 利用JDBC连接数据库【不使用数据库连接池】

目录&#xff1a; 1 什么是JDBC 2 JDBC主要接口 3 JDBC编程步骤【学渣版本】 5 JDBC编程步骤【学神版本】 6 JDBC编程步骤【学霸版本】 1 什么是JDBC JDBC是JAVA提供的一套标准连接数据库的接口&#xff0c;规定了连接数据库的步骤和功能&#xff1b;不同的数据库提供商提供了一…