目录
1 实践内容与目标 3
1.1实践内容 3
1.2实践目标 3
2 系统功能与 API 函数说明 4
2.1处理机管理 4
2.2 存储器管理与文件系统管理 6
2.3 I/O设备管理 7
3 硬件仿真设计 8
3.1 CPU 8
3.2内存 8
3.3时钟中断 9
3.4设备中断 9
3.5MMU 10
3.6硬盘 10
4 数据结构与基础操作的抽象与实现 10
4.1 作业控制块 10
4.2 程序指令集 12
4.3 内存块结构 12
4.4 MMU结构 13
4.5 硬盘盘块结构 14
4.6 PCB 14
4.7 OS原语核心操作 15
5 程序整体结构及模块功能的实现 18
5.1 程序整体结构 18
5.2 系统运行模块 19
5.3 界面模块 20
6 测试与分析 23
6.1 单作业CPU指令 23
6.2 单作业多指令 31
6.3 多作业CPU指令 40
6.4 多作业多指令 43
6.5 溢出作业运行 46
6.6 创建作业运行 49
7 技术问题及解决方案 51
8 实践心得 51
参考文献 52
1 实践内容与目标
1.1实践内容
以计算机操作系统原理为指导,利用面向对象程序设计技术仿真 OS 内核的作业管理、 连续内存管理、页式虚存管理、进程同步与互斥、缓冲技术、磁盘管理和文件管理的 API 功 能,可视化显示操作系统工作过程,完成操作系统课程设计的程序设计、开发、测试,答辩 以及撰写实践报告。
1.2实践目标
任务实现:
本时间选择了难度3,基础实现了基础设计硬件部分的仿真、作业管理、并发请求文件设计、用户程序段指令文件的设计、作业运行及操作系统运行详细记录的文件的保存、进程控制块PCB设计。实现了作业并发环境下,MMU 地址变换、作业调度算法、进程原语、优先级+时间片轮转进程调度算法,位示图法实现连续空间动态分配管理。并把连续空间分配过程可视化实现。我最先选择是构造CPU类的基本变量,int型的时间变量,使用static方式使其成为CPU的固定属性。然后就可以开始设计时钟这一类。时钟类作为一个线程,需要使用sleep方法来模拟每秒一次的时钟中断,在一开始设计的时候我并未考虑多进程同步,我选择以一线程,其他类都设计为函数的方式来实现。在设计好时钟类后,就可以测试每秒CPU时间的输出,在后续设计好其他的类后,可以把这些类的方法都写在时钟类的主要run函数里,就可以实现单线程的执行,不过在后续与界面的执行中和要求的多方面参考,我添加了锁的方法来控制多进程的执行。然后我开始设计PCB本属性,把所需要的就绪队列和阻塞队列作为静态变量存放于PCB类里,从而就可以开始设计时间调度,其本质上就是根据每秒CPU状态和队列状态来执行不同的操作,我经过参考和讨论,选择设计以process类来继承pcb类,从而进程就可以使用pcb的所有方法,或者可以把pcb当成一个进程来看,这样极其方便了在对进程切换的处理,也使进程本身所包含的数据与进程运行时的数据分割开来,成为一个独立的模块。在实现调度后需要的就是CPU方法的细化和文件的读取等,还有关中断、开中断等模式化操作。在实现上述操作后,首先通过println函数测试输出是否有细节上的问题,然后再设计界面。本实验要求可以开关进程的执行,并随时创建新作业,这些代码也需要再创建界面时实现。同时界面本身作为一个进程,与时钟线程无法以单线程的方式实现,需要重新定义时钟类来配合界面的实现。而界面主要使用window builder来辅助实现,界面最少包括一个输出的区域,开始和暂停按钮,和保存按钮。
1.2.1 硬件仿真
仿真了基础的硬件模块CPU(CPU类)。
内存(Memory、MemoryDataS、MemoryP、MemoryTable,MemoryDataS仿真了内存块,Memory仿真了内存,MemoryP和MemoryTable为内存的可视化输出类)。
仿真模拟了时钟中断(TimeThread类)。
仿真模拟了设备中断(KeyBoard类和Screen类)。
仿真模拟了MMU(MMU和MMUu类)。
仿真模拟了缺页中断(MissingPageInterrupt类)。
仿真模拟了缓冲区(内置于Memory类中)。
本实验未考虑中级调度,所以没有仿真硬盘交换区。
仿真模拟了磁盘(HardDisk和Disk类,WriteFile和ReadFile类)。
1.2.2 调度仿真
模拟实现了作业创建(NewTask)线程。
模拟实现了作业调度(JobSchedule)线程。
模拟实现了进程调度(ProcessSchedule)线程。
1.2.3 文件读取类
实现了指令输入输出类(IO)。
1.2.4 控制块与作业进程
作业类与作业控制块(Job和JCB)。
指令类(Instructions)。
进程类和进程控制块(Process和PCB)。
1.2.5 界面
仿真了界面类(GUI类来可视化运行过程)。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;import com.ibm.icu.impl.CharacterPropertiesImpl;import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.awt.event.ActionEvent;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.FlowLayout;public class GUI extends JFrame {public static JPanel contentPane;public static JTextArea textArea=new JTextArea();public static JScrollPane scrollPane=new JScrollPane();public static JPanel panel;static Lock Lock = new ReentrantLock();static Condition Condition = Lock.newCondition();private JButton btnNewButton_1;private JButton btnNewButton_2;static JTextArea textArea_1 = new JTextArea();public static int COUNT=0;static String filename="test/ProcessResults-";static String filename1=".txt";static JLabel lblNewLabel;static JTextField textField =new JTextField();static JLabel lblNewLabel_1;static JTextField textField_1 =new JTextField();static JLabel lblNewLabel_2;static JTextField textField_2=new JTextField();static JLabel lblNewLabel_3;static JTextField textField_3=new JTextField();static JLabel lblNewLabel_4;static JTextField textField_4=new JTextField();static JTextField textField_5=new JTextField();static JTextField textField_6=new JTextField();static JTextField textField_7 = new JTextField();static JTextField textField_8 = new JTextField();private JLabel lblNewLabel_8;static JOptionPane jop=new JOptionPane();private JButton btnNewButton_4;private JButton btnNewButton_5;private JLabel lblNewLabel_9;static JTextField textField_9;private JLabel lblNewLabel_5;private JTextField textField_10;private JLabel lblNewLabel_6;static JTextField textField_11;Memoryp p=new Memoryp();public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {GUI frame=new GUI();frame.setVisible(true);} catch (NumberFormatException e) {jop.showMessageDialog(null, "请输入CPU运行速度", "请输入CPU运行速度", JOptionPane.ERROR_MESSAGE);e.printStackTrace();}}});}public GUI() {setResizable(false);setForeground(Color.DARK_GRAY);setBackground(Color.ORANGE);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 780, 442);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);scrollPane.setBounds(0, 0, 353, 393);contentPane.add(scrollPane);textArea.setColumns(10);scrollPane.setViewportView(textArea);panel = new JPanel();panel.setBounds(353, 0, 436, 40);contentPane.add(panel);JButton btnNewButton = new JButton("\u5F00\u59CB/\u7EE7\u7EED");btnNewButton.setFont(new Font("宋体", Font.PLAIN, 10));btnNewButton.addActionListener(new ActionListener() {  //开始进程,或者继续public void actionPerformed(ActionEvent e) {TimeThread.GO();TimeThread a=new TimeThread();NewTask b=new NewTask();ProcessSchedule c=new ProcessSchedule();JobSchedule d=new JobSchedule();KeyBoard e1=new KeyBoard();Screen f=new Screen();ReadFile g=new ReadFile();WriteFile h =new WriteFile();//MissingPageInterrupt i=new MissingPageInterrupt();b.start();d.start();e1.start();f.start();g.start();h.start();c.start();a.start();//i.start();}});panel.add(btnNewButton);btnNewButton_1 = new JButton("\u6682\u505C");btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {  //暂停当前TimeThread.STOP();}});btnNewButton_1.setFont(new Font("宋体", Font.PLAIN, 10));panel.add(btnNewButton_1);btnNewButton_2 = new JButton("\u521B\u5EFA\u65B0\u8FDB\u7A0B");btnNewButton_2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {  //新建作业,指令数目随机生成,优先级生成,指令随机生成int id=6;id+=COUNT++;int Priority=(int)(Math.random()*5);int InTimes=CPU.GetTime();int InsNum=(int)(Math.random()*50)+1;new JCB(id,Priority,InTimes,InsNum);}});btnNewButton_2.setFont(new Font("宋体", Font.PLAIN, 10));panel.add(btnNewButton_2);JButton btnNewButton_3 = new JButton("\u4FDD\u5B58");btnNewButton_3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {  //保存输出的文件Save();}});btnNewButton_3.setFont(new Font("宋体", Font.PLAIN, 10));panel.add(btnNewButton_3);JScrollPane scrollPane_1 = new JScrollPane();scrollPane_1.setBounds(353, 239, 322, 154);contentPane.add(scrollPane_1);scrollPane_1.setViewportView(textArea_1);JPanel panel_1 = new JPanel();panel_1.setBounds(353, 35, 188, 206);contentPane.add(panel_1);panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));lblNewLabel = new JLabel("\u5C31\u7EEA\u961F\u52171");panel_1.add(lblNewLabel);textField = new JTextField();panel_1.add(textField);textField.setColumns(10);lblNewLabel_1 = new JLabel("\u963B\u585E\u961F\u52171");panel_1.add(lblNewLabel_1);textField_1 = new JTextField();panel_1.add(textField_1);textField_1.setColumns(10);lblNewLabel_2 = new JLabel("\u963B\u585E\u961F\u52172");panel_1.add(lblNewLabel_2);textField_2 = new JTextField();panel_1.add(textField_2);textField_2.setColumns(10);lblNewLabel_3 = new JLabel("\u963B\u585E\u961F\u52173");panel_1.add(lblNewLabel_3);textField_3 = new JTextField();textField_3.setColumns(10);panel_1.add(textField_3);lblNewLabel_9 = new JLabel("\u963B\u585E\u961F\u52174");panel_1.add(lblNewLabel_9);textField_9 = new JTextField();textField_9.setColumns(10);panel_1.add(textField_9);lblNewLabel_5 = new JLabel("\u963B\u585E\u961F\u52175");panel_1.add(lblNewLabel_5);textField_10 = new JTextField();textField_10.setColumns(10);panel_1.add(textField_10);lblNewLabel_6 = new JLabel("\u7F13\u51B2\u533A       ");panel_1.add(lblNewLabel_6);textField_11 = new JTextField();textField_11.setColumns(10);panel_1.add(textField_11);JLabel lblNewLabel_7 = new JLabel("CPU\u8FD0\u884C\u901F\u5EA6");lblNewLabel_7.setBounds(585, 35, 108, 29);contentPane.add(lblNewLabel_7);textField_7.setText("1000");textField_7.setBounds(595, 76, 65, 29);contentPane.add(textField_7);textField_7.setColumns(10);lblNewLabel_8 = new JLabel("CPU\u8FD0\u884C\u72B6\u6001");lblNewLabel_8.setBounds(585, 117, 108, 29);contentPane.add(lblNewLabel_8);textField_8.setColumns(10);textField_8.setBounds(595, 158, 65, 29);contentPane.add(textField_8);btnNewButton_4 = new JButton("\u4F4D\u793A\u56FE");btnNewButton_4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {p.setVisible(true);}});btnNewButton_4.setBounds(681, 239, 79, 40);contentPane.add(btnNewButton_4);btnNewButton_5 = new JButton("\u5185\u5B58\u56FE");btnNewButton_5.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {MemoryTable t=new MemoryTable();t.setVisible(true);}});btnNewButton_5.setBounds(681, 291, 79, 40);contentPane.add(btnNewButton_5);JButton btnNewButton_5_1 = new JButton("QA");btnNewButton_5_1.setBounds(681, 339, 79, 40);contentPane.add(btnNewButton_5_1);lblNewLabel_4 = new JLabel("CPU\u65F6\u95F4   ");lblNewLabel_4.setBounds(701, 81, 59, 18);contentPane.add(lblNewLabel_4);textField_4 = new JTextField();textField_4.setBounds(695, 117, 65, 29);contentPane.add(textField_4);textField_4.setColumns(10);}public static void aaa() {Date date=new Date();SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");  String temp= format.format(date);temp=filename+temp+filename1;try{FileOutputStream out=new FileOutputStream(temp);String okk=textArea.getText();byte buffer[]=okk.getBytes();out.write(buffer,0,buffer.length);out.flush();out.close();System.out.print("保存成功\n");}catch(Exception a) {a.printStackTrace();}}public static void Save() {String temp= String.valueOf(CPU.GetTime()-1);temp=filename+temp+filename1;try{FileOutputStream out=new FileOutputStream(temp);String okk=textArea.getText();byte buffer[]=okk.getBytes();out.write(buffer,0,buffer.length);out.flush();out.close();System.out.print("保存成功\n");}catch(Exception a) {a.printStackTrace();}}
}





















模拟一个具有基本功能的操作系统(JavaGUI)相关推荐

  1. 操作系统课设——设计模拟一个SPOOLING假脱机输出程序

    广州大学操作系统课程设计报告 要求:书写课程设计报告,报告中应该包含如下内容: 一.课程设计题目及内容 课程设计题目:题目三: 设计模拟一个SPOOLING假脱机输出程序 (1) 系统设计要求:设计一 ...

  2. 高频模拟混频器模块,功能为一个AD835乘法器+后级一个10KHz的低通滤波器,输入可以撑到100MHz,输出带宽10KHz

    高频模拟混频器模块,功能为一个AD835乘法器+后级一个10KHz的低通滤波器,输入可以撑到100MHz,输出带宽10KHz ID:62119638128398781UncleJack

  3. 高频模拟混频器模块,功能为一个AD835乘法器+后级一个10KHz的低通滤波器

    高频模拟混频器模块,功能为一个AD835乘法器+后级一个10KHz的低通滤波器,输入可以撑到100MHz,输出带宽10KHz ID:62119638128398781

  4. 通过JavaFX模拟实现的多道程序单用户操作系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85788346 资源下载地址:https://download.csdn.net/downl ...

  5. 在ASP.NET Core使用Middleware模拟Custom Error Page功能

    一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...

  6. account表里有什么 银行_模拟一个银行账户类Account,账户类中包括所有者、账号、余额、账户总数、存款、取款等信息。_学小易找答案...

    [单选题]廉价磁盘冗余阵列RAID利用冗余技术实现高可靠性,其中RAID1的磁盘利用率为() . [简答题]与直流调速相比,交流调速有何优点? [论述题]方法 [单选题]以<老子注>一书驰 ...

  7. element 搜索匹配_如何在Element-ui中实现一个远程搜索功能

    如何在Element-ui中实现一个远程搜索功能 发布时间:2021-01-29 14:50:00 来源:亿速云 阅读:87 作者:Leah 这篇文章给大家介绍如何在Element-ui中实现一个远程 ...

  8. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  9. java提升权限运行_提升代码的运行权限,实现模拟管理员身份的功能

    SPSecurity.RunWithElevatedPrivileges(delegate() { // implementation details omitted }); 可以提升代码的运行权限, ...

最新文章

  1. CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒)
  2. Python 内存分配时的小秘密
  3. sql 2008 找不到本地服务器名称,出现在 sys.servers 中找不到服务器 apos;***\SQLEXPRESS’。请验证指定的服务器名称是否正确的解决方法 – 龙生时代...
  4. # 遍历删除字典元素_第六章 字典
  5. 【设计模式 00】设计模式的六大原则
  6. Axure谷歌浏览器Chrome扩展程序下载及安装方法
  7. 智能音箱,你在窃听我吗?
  8. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before@After...
  9. linux消息队列默认长度,Linux 消息队列长度处理
  10. petalinux - 修改fsbl
  11. 基于HTML+CSS+JavaScript制作服装商城网站设计毕业论文源码
  12. 快速选择(QuickSelect)的平均时间复杂度分析
  13. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画
  14. vba设置Excel单元格左对齐、右对齐、居中对齐、字体、字号、字型
  15. SourceTree + Gerrit
  16. Hello Redis,我有7个问题想请教你!
  17. Arduino初初教程7——模拟量采集
  18. (转)贝莱德的“阿拉丁”神灯
  19. 嵌入式软件测试项目管理
  20. 图像分割-区域分裂合并算法

热门文章

  1. 刷脸支付技术成熟能够为安全问题保驾护航
  2. 取消win7共享打印机等需要输入密码
  3. 亚马逊测评:亚马逊账号申诉,账号解封实例分享
  4. 行车记录仪效果由=方案(主控芯片)+镜头+图像传感器
  5. Rasa原文-编写对话数据
  6. 专访前C#编译器组首席工程师Eric Lippert
  7. HITS算法--从原理到实现
  8. 蓝桥杯单片机比赛模板
  9. 【shell笔记】Linux Shell脚本编程入门知识点全面涵盖
  10. 什么是跨境电商ERP系统