模拟操作系统(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是一个持久层框架,…

oracle 连接greenplum,Oracle通过DBLINK访问GreenPlum

为多个数据库之间的整合和迁移做POC,尝试使用Oracle Gateway和Heterogeneous Service来中转访问,测试过好多次,最终发现只有在32位的Oracle当中才能成功配置。 配置环境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端创建Rails项目

by Mark Hopson马克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript!)创建Rails项目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails项目中使用React和Redux设置单页Javascript App的完整指南。 (A …

分布与并行计算—用任务管理器画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;// 时间间…

Rails文件上传file_field报错Encoding::UndefinedConversionError

服务器用的是ubuntu12 64bit,环境是ruby1.9.3rails3mysql,测试是在windows2003上。 上传一个【.gitconfig】文件,没有问题,上传【新浪微博数据挖掘.pdf】报错,上传【back.jpg】报错。 下面是两段信息,是从【…

好久不来这里写东西了.

我正准备离开学校去实现自己的目标,很清楚自己在学校的... ...做共享程序员,就不得不考虑些商业上的东西,自己要吃饭啊!我想我是该好好的处理一下这二者的关系. 转载于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

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

顶级数据恢复_顶级R数据科学图书馆

顶级数据恢复Data science is the discipline of making data useful数据科学是使数据有用的学科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系统oracle数据库,Oracle10g 数据库的安装基于windowsXP

Oracle的安装一、首先去官网下载自身系统相对应的数据库软件http://www.oracle.com/cn/index.htmlOracle软件本身是免费的,个人用途完全没关系,商业用途并被发现才会被Oracle所要求收费,收费买的不是软件,而是授权。何谓授权&…

了解React Native中的不同JavaScript环境

by Khoa Pham通过Khoa Pham 了解React Native中的不同JavaScript环境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布与并行计算—生命游戏(Java)

生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮…

正确认识 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…

oracle修改物化视图字段,获取物化视图字段的修改矢量(一)

当表建立了物化视图日志之后,表的DML修改会被记录到物化视图日志中,而物化视图日志则包含了一个修改矢量,来记录哪个列被修改。在文章列的修改矢量可以通过2的N次方来获得,也就是POWER(2, N)。而N的值,就是列的位置。但…

聚合 数据处理_R中聚合的简介:强大的数据处理工具

聚合 数据处理by Satyam Singh Chauhan萨蒂扬辛格乔汉(Satyam Singh Chauhan) R中聚合的简介:强大的数据处理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …

大数据 notebook_Dockerless Notebook:数据科学期待已久的未来

大数据 notebookData science is hard. Data scientists spend hours figuring out how to install that Python package on their laptops. Data scientists read many pages of Google search results to connect to that database. Data scientists write a detailed docume…

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

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

分布与并行计算—并行计算π(Java)

并行计算π public class pithread extends Thread {private static long mini1000000000;private long start,diff;double sum0;double cur1/(double)mini;public pithread(long start,long diff) {this.startstart;this.diffdiff;}Overridepublic void run() {long istart;f…

linux复制文件跳过相同,Linux cp指令,怎么跳过相同的文件

1、使用cp命令的-n参数即可跳过相同的文件 。2、cp命令使用详解:1)、用法:cp [选项]... [-T] 源文件 目标文件或:cp [选项]... 源文件... 目录或:cp [选项]... -t 目录 源文件...将源文件复制至目标文件,或将多个源文件…