模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。预计程序所能达到的功能:
进程管理模拟:实现操作系统进程管理功能,如实现进程的控制(进程调度,进程创建与撤销,状态转换,进程唤醒),进程并发执行。
存储管理模拟:实现内存空间的分配和回收、存储保护。
设备管理模拟:主要包括设备的分配和回收。
文件管理和用户接口:主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。
文件管理模块由以下3个类组成
1.MyFile类
该类是操作系统的基本文件单位,这个类包含了文件的数据内容,名字,属性以及磁盘的起始扇区和长度等,构成一个基本的文件。利用输入的属性和数据来初始化文件,同时提供了getter和setter方法可以对文件的属性进行访问和修改。
该类通过预设的二进制代码生成可执行的文件。这个类中保存了10个可执行的程序的代码,通过调用文件系统中创建文件的方法,将这些代码转换成操作系统内部的文件,同时将文件名和路径记录在这个类中。
该类用于管理整个文件系统。通过读取磁盘文件,利用FileSamplesGenerator类生成可执行文件和利用DirTreeParser类生成目录树进行初始化,包含了查找磁盘空闲扇区和分配空闲扇区的功能接口,以实现将FAT中的数据直接写入磁盘或直接对磁盘盘块进行写入操作,以及可以对操作系统内的文件直接进行查找和访问。对外提供了创建、打开、读取、写入、关闭、删除文件的功能方法,并且可以获取路径下的子目录,并且修改文件的属性。
进程控制及内存管理模块由以下4个类组成
1.ExcuteTask类
该类是操作系统的进程调度的类,这个类包含了进程创建、进程销毁、进程阻塞、进程唤醒等功能,模拟一个进程的生命周期及维护相应的就绪和阻塞队列,并且调用其他类来模拟申请内存与释放内存、查看当前内存详情和获取正在执行的指令等
2.MenoryBlock类
该类是内存块类,获取具体被分配的线程id的属性和大小,提供了getter和setter方法可以对内存块的属性进行访问和修改。
3.MemoryController类
该类是内存空间的管理类,用于维护一个内存块队列,比如添加一个新内存块、删除一个内存卡、获取当前内存块队列,提供了getter和setter方法可以对内存的属性进行访问和修改。
4.SimulationThread类
该类是进程的一个模拟类,通过进程的id或者对应的可执行文件来启动或者新建一个进程、包括获取进程id和获取进程阻塞原因,同时提供了getter和setter方法可以对进程的属性进行访问和修改。
硬件实现及管理模块由以下8个类组成:
HardDevice类
该类为抽象类,默认无任何模仿功能,类中封装了硬件设备的状态,ID和名字等成员变量,同时提供getStatus、getID和getName方法对硬件设备的三个成员进行访问,该类需要被所有除CPU以外的硬件类继承。
Peripheral类
该类继承了HardDevice类,定义了interval用以表示外围设备被占用倒计时的计时器;同时提供了方法allocate用以申请占用外围设备time个计时周期;refresh方法用以更新设备状态,并在每个CPU周期开始时执行,设备之前若处于中断状态,则取消中断,若已被占用,则扣除clock个计时周期;reset方法用于重置设备的计时器和状态。
Memory类
该类继承了HardDevice类,定义了私有变量storage用数组模拟内存,用maxCapacity表示内存的最大容量。同时,类中包含了方法read用以从address地址的内存中读取一字节的数据;方法write用以向address地址的内存中写入一字节的数据;方法getMaxCapacity用以访问内存的最大容量。
Disk类
该类继承了HardDevice类,类中包含了storage表示内存,filename表示磁盘数据存储的文件名,即虚拟磁盘,maxCapacity表示磁盘的最大存储量,sectorSize表示磁盘中块的容量,sectorCount表示硬盘中块的数量。同时提供了方法read从磁盘中读取第address块的64字节数据;方法write将64字节的数据写入磁盘的第address块中;方法load从实际硬盘中试图加载制定名字的虚拟磁盘,并读取其中的数据,该方法用在Disk类的构造方法中;方法initialize在未找到虚拟磁盘文件时,则建立指定名字的文件,该方法用在Disk类的构造方法中;方法store用以将暂存于内存中的数据存入虚拟磁盘实际的数据文件中;以及方法getMaxCapacity,getSectorSize,getSectorCount分别对磁盘的最大容量,最大块长度和块的数量进行访问。
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用以重置外设状态。总的来说,该类主要执行的是检查各硬件的状态,在各时钟周期内不断地完成读写等操作,完成存储管理和设备管理的任务。在该类的函数中,每次执行指令前,均检查设备的状态,判断是否有中断,如有中断先进行取消,再执行其他的操作。
用户界面交互模块主要由以下个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设置。
1.Compiler类
Compiler类用于创建编译器对象,主要实现对创建的“可执行文件”进行汇编/编译的功能,其中“可执行文件”中所能编译通过执行的指令只有5中,包括:
ASSIGNMENT:x=?,对x进行赋值,其中x为两位数。
ADD:x++ x加1(x小于等于255,大于等于1)
DEL:x- - x减一
USEHARD:I/O指令
FINISH:终止运算,表示可执行文件结束
Shell提供用户命令接口,通过终端窗口接受用户从键盘键入的命令,并对用户输入的命令进行处理并返回处理结果。
实现的命令如下:
3.DirTreeParser类
DirTreeParser类实现生成JSON格式的系统目录,供文件系统FileSystem通过生成对象调用getJsonTree生成系统文件目录,目录结构采用树型目录结构,目录名或文件名:3个字节,拓展名:1个字节。根目录位置固定为OS。
程序开始时会创立一个主界面,包含了系统所有功能的入口,通过对界面组件事件的监听,可以响应用户的请求,显示用户需要的窗口,或者可以通过终端窗口,用户可以根据终端指南窗口的提示,对文件进行操作,用户可以通过磁盘,文件目录界面对操作系统内的文件情况进行观察,同时可以通过对cpu,内存,设备状态界面来观察可执行文件运行时,操作系统的内在状况。也可以通过更换夜间模式,更换壁纸和分辨率选择用户界面的样式。
文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout
文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件
文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"
文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules
文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure
文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板
文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server
文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d
文章浏览阅读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
文章浏览阅读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 ...
文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy
文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos