操作系统课程设计——Spooling假脱机输入输出模拟——附源程序_第1页
操作系统课程设计——Spooling假脱机输入输出模拟——附源程序_第2页
操作系统课程设计——Spooling假脱机输入输出模拟——附源程序_第3页
操作系统课程设计——Spooling假脱机输入输出模拟——附源程序_第4页
操作系统课程设计——Spooling假脱机输入输出模拟——附源程序_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 需求分析一 需求分析 设计一个 SP00LING 输出进程和两个请求输出的用户进程 以及一个 SP00LING 输出服务程序 当请求输出的用户进程希望输出一系列信息时 调 用输出服务程序 由输出服务程序将该信息送入输出井 待遇到一个输出结束 标志时 表示进程该次的输出文件输出结束 之后 申请一个输出请求块 用来 记录请求输出的用户进程的名字 信息在输出井中的位置 要输出信息的长度 等 等待 SP00LING 进程进行输出 SP00LING 输出进程工作时 根据请求块 记录的各进程要输出的信息 把信息输出到文本框里 进程调度采用随机算法 这与进程输出信息的随机性相一致 两个请求输 出的用户进程的调度概率各为 45 SP00LING 输出进程为 10 这由随机数 发生器产生的随机数来模拟决定 编码实现的平台环境是 JCreator4 50 Pro 实现语言是 Java 为每个进程建立一个 pcb 记录进程信息 进程有 5 种状态 0 为可执行态 1 为等待状态 1 表示输出井满 请求输出的用户进程等待 2 为等待状态 2 表示请求输出井空 SP00LING 输出进程等待 3 为等待状态 3 表示请求输出井满 请求输出的用户进程等待 4 为结束态 进程执行完成 二 整体功能及设计二 整体功能及设计 1 数据结构 数据结构 1 进程控制块 进程控制块 PCB class Pcb int id 进程标识数 int status 进程状态 int count 要输出的文件数 int x 进程输出时的临时变量 2 请求输出块 请求输出块 Reqblock class Reqblock int repname 请求进程名 int length 本次输出信息长度 int addr 信息在输出井的首地址 3 输出井 BUFFER int buffer 3 100 buffer 1 100 为用户进程 1 的输出井 buffer 2 100 为用户进程 2 的输出井 4 其他主要的控制变量和指针 其他主要的控制变量和指针 int c1 3 c1 1 为输出井 buffer 1 的空间 c1 2 为输出井 buffer 2 的空间 1 int c2 3 2 c2 1 0 c2 2 0 为输出井 buffer i 第一个空闲指针 c2 1 1 c2 2 1 为输出井 buffer i 第一个满指针 int c3 reqblock 的剩余个数 int pt1 要输出的第一个 reqblock 指针 int pt2 第一个空闲 reqblock 指针 2 主要类及其函数 主要类及其函数 1 主类 主类 public class Spooling public Spooling 构造函数 生成界面 为按钮添加事件监听器 public void actionPerformed ActionEvent e 单击事件响应函数 public void begin 点击 重置 按钮时 重新初始化界面 public void run 点击运行时 转入调度函数 public static void main String args 生成 Spooling 类的对象 2 调度实施类 调度实施类 class Manage public Manage Spooling spooling1 构造函数 对进程的数据初始 化 public void run SP00LING 输出模拟系统主控函数 用随机数来 决定调度的进程 使得两个请求输出的用户进程的调度概率各为 45 SP00LING 输出进程为 10 public int user int name int out JTextArea textarea JTextField field SP00LING 输出服务程序 当请求输出的用户进程希望输出一系列信息时 通 过传参调用输出服务程序 由输出服务程序将该信息送入输出井 public void spooling1 SPOOLING 输出进程 根据请求块记录的各进程要输出的信息 把信息输 出到文本框里 2 3 流程图 流程图 1 SP00LING 输出模拟系统主控流程图如图输出模拟系统主控流程图如图 1 所示 所示 N Y X 0 9 且 SPOOLING 进 程为执行态 0 45 X 0 9 且进 程 2 为执行 态 X 0 45 且进程 1 为执行态 开始 对各进程的 PCB 输出 请求快 输出井初始化 生成 0 1 随机数 X 判断 X 的值及进程的状 态 执行请求输出 用户进程 user 1 执行请求输出 用户进程 user 2 执行 SPOOLING 进程 spooling 进程都结束了吗 结束返回 图 1 SP00LING 输出模拟系统主控流程图 3 2 SP00LING 输出服务程序流程图如图输出服务程序流程图如图 2 所示 所示 开始 调用进程 PCB i 的随机输出量送 PCB i x 输出井满 C1 0 0 吗 进程的输出信息 PCB i x 送 buffer i C2 i 0 C1 i C1 i 1 修改空缓冲区指针 C2 i 0 C2 i 0 1 调用进程的一个文件 输出结束了吗 PCB i x 0 还有空闲请求块 吗 请求输出的进程 等待 3 送 PCB i status 转进程调 度 请求输出的进 程等待 1 送 PCB i STAT US 转进程调 度 将文件在输出井的位置和长 度填入空闲请求块 将进程名 i 填 入请求块 修改空闲请求块指针 空闲请求块数减 1 Y Y N N SPOOLING 进程是等待状 态吗 N Y 唤醒 SPOOLING 进程 进程所以输出文件全部输出 完 N 进程 i 运行结束 Y 转进程调度 N Y 图 2 输出请求服务的程序框图 4 3 SPOOLING 输出进程流程图如图输出进程流程图如图 3 所示 所示 N Y N N N Y 开始 请求输出块空 吗 两个请求输 出的进程结束了 吗 按该请求输出信息块 reqlock 的指针 ptrl 将输出 井中的一个文件的内容输出 释放相应输出井 即修改相 应的输出井计数 按请求输出块 中进程号修改 C1 数组和 C2 数组 有等待输出 井空的进程吗 释放该请求输出块 修改请求信息 块 reqlock 的指针 ptrl ptrl 1 C3 C3 1 有等待输 出块的进程吗 唤醒相应 进程 转进程调 度 SPOOLIN G 进程等待 SPOOLIN G 进程结束 返回返回 唤醒相应 进程 转进程调 度 YY 图 3 SP00LING 输出进程流程图 5 三 编程实现三 编程实现 import java awt import javax swing import java awt event import java lang Math import java util Random 1 主类 主类 public class Spooling public Spooling 构造函数 生成界面 为按钮添加事件监听器 public void actionPerformed ActionEvent e 单击事件响应函数 public void begin 点击 重置 按钮时 重新初始化界面 public void run 点击运行时 转入调度函数 public static void main String args 生成 Spooling 类的对象 public class Spooling extends JFrame implements ActionListener Runnable JPanel panel1 panel2 panel3 JTextField field1 field2 JScrollPane p1 p2 p3 p4 JTextArea textarea1 textarea2 textarea3 textarea4 JButton button1 button2 button3 Manage spoo public Spooling 界面构造函数 spoo new Manage this Container c this getContentPane c setLayout new BorderLayout field1 new JTextField 3 设置 panel1 field2 new JTextField 3 button1 new JButton 运行 button2 new JButton 关闭 button3 new JButton 重置 button1 addActionListener this button2 addActionListener this button3 addActionListener this panel1 new JPanel 6 panel1 setLayout new FlowLayout panel1 add new JLabel 用户进程 1 文件数 SwingConstants RIGHT panel1 add field1 panel1 add new JLabel 用户进程 2 文件数 SwingConstants RIGHT panel1 add field2 panel1 add button1 panel1 add button3 panel1 add button2 设置 panel1 完毕 textarea1 new JTextArea 80 100 设置 panel2 textarea2 new JTextArea 112 400 textarea3 new JTextArea 112 400 textarea1 append 用户进程 1 的输出 n textarea2 append 用户进程 2 的输出 n textarea3 append Spooling 的调度 n p1 new JScrollPane textarea3 p2 new JScrollPane textarea1 p3 new JScrollPane textarea2 panel2 new JPanel panel2 setLayout new GridLayout 1 3 panel2 add p1 panel2 add p2 panel2 add p3 设置 panel2 完毕 textarea4 new JTextArea 10 150 设置 panel3 textarea4 append 主程序调度过程 n p4 new JScrollPane textarea4 panel3 new JPanel panel3 setLayout new GridLayout 1 1 panel3 add p4 设置 panel3 完毕 c add panel1 BorderLayout NORTH 设置窗口 c add panel2 BorderLayout CENTER c add panel3 BorderLayout SOUTH this setSize 1200 600 this setLocation 100 100 this setTitle Spooling 7 this setVisible true this setDefaultCloseOperation JFrame EXIT ON CLOSE 设置窗 口完毕 public void actionPerformed ActionEvent e if e getSource button1 点击运行按钮 run run if e getSource button2 点击重置按钮 begin System exit 0 if e getSource button3 点击推出按钮 退出 begin public void begin field1 setText 点击重置 重新初始化界面 field2 setText textarea1 setText 用户进程 1 的输出 n textarea2 setText 用户进程 2 的输出 n textarea3 setText Spooling 的调度 n textarea4 setText 主程序调度过程 n public void run 点击运行时 转入调度函数 spoo start public static void main String args Spooling spooling new Spooling 8 2 调度实施类 调度实施类 class Manage public Manage Spooling spooling1 构造函数 对进程的数据初始 化 public void run SP00LING 输出模拟系统主控函数 用随机数来 决定调度的进程 使得两个请求输出的用户进程的调度概率各为 45 SP00LING 输出进程为 10 public int user int name int out JTextArea textarea JTextField field SP00LING 输出服务程序 当请求输出的用户进程希望输出一系列信息时 通 过传参调用输出服务程序 由输出服务程序将该信息送入输出井 public void spooling1 SPOOLING 输出进程 根据请求块记录的各进程要输出的信息 把信息输出到 文本框里 class Manage extends Thread Pcb pcb Reqblock reqblock int buffer int c1 可使用的输出井 buffer 空间 int c2 输出井 buffer 空闲和满指针 int c3 reqblock 的剩余个数 int pt1 要输出的第一个 reqblock 指针 int pt2 第一个空闲 reqblock 指针 double random 用于调度三个进程的控制随机数 int out1 用户进程 1 已生成的文件数 int out2 用户进程 2 已生成的文件数 int out 1 用户进程 1 已输出的文件数 int out 2 用户进程 2 已输出的文件数 int x 随机生成的数据 0 9 int i 临时控制变量 Random x1 辅助生成随机数据 x 0 9 Spooling spooling public Manage Spooling spooling1 对各进程的数据初始化 out1 0 out2 0 out 1 0 out 2 0 pcb new Pcb 4 reqblock new Reqblock 10 buffer new int 3 100 c1 new int 3 c1 1 100 c1 2 100 c2 new int 3 2 c2 1 0 0 c2 2 0 0 c3 10 pt1 0 9 pt2 0 x1 new Random for i 0 i 4 i pcb i new Pcb for i 0 i 10 i reqblock i new Reqblock for i 1 i 3 i pcb i status 0 spooling spooling1 对各进程的数据初始化完毕 public void run 进程调度 do while 循环 random Math random 产生一个随机数 控制 进程调度 令用户进程概率为 45 Spooling 进程为 10 if random0 45 else c1 name c1 name 100 c2 name 1 c2 name 0 c2 name 0 c2 name 1 11 textarea append 第 out 1 个文件缺少输出井 textarea append 进入等待状态 1 n try sleep 1000 catch InterruptedException e e printStackTrace return out else 若输出井没满 buffer name c2 name 0 pcb name x 进程的 输出信息 PCB i x 送 buffer i C2 i 0 c1 name c1 name 1 输出井空闲个数减 1 c2 name 0 c2 name 0 1 100 修改空缓冲 区指针 C2 i 0 前进 1 while x 0 判断进程的一个文件是否输出完毕的 while 循环结束 textarea append 第 out 1 个文件已放入输出井 c2 name 1 c2 name 0 1 剩余空间 c1 name try sleep 1000 catch InterruptedException e e printStackTrace out if c3 0 若没有空闲请求输出块 转为等待状态 3 pcb name status 3 if c2 name 0 c2 name 1 c1 name c1 name c2 name 0 c2 name 1 else c1 name c1 name 100 c2 name 1 c2 name 0 c2 name 0 c2 name 1 out textarea append 缺少请求输出块 textarea append 进入等待状态 3 n try sleep 1000 catch InterruptedException e e printStackTrace 12 out return out else 若有空闲请求输出块 reqblock pt2 addr c2 name 1 将文件在输出井的位置填 入空闲请求块 if c2 name 0 c2 name 1 将文件在输出井的长度填 入空闲请求块 reqblock pt2 length c2 name 0 c2 name 1 else reqblock pt2 length 100 c2 name 1 c2 name 0 reqblock pt2 repname name 将进程名 i 填入请求块 textarea append 获得请求输出块 Integer toString pt2 1 n pt2 pt2 1 10 修改空闲请求块指针 c3 空闲请求块数减 1 if pcb 3 status 2 若 SPOOLING 进程是等待状态 则唤醒 SPOOLING 进程 pcb 3 status 0 判断进程所要输出的文件是否输出完毕的 while 循环结束 textarea append 进程 name 输出完毕 文件输出完毕 修改状态为结束 转进程调度 pcb name status 4 return out public void spooling1 while c3 10 判断请求输出块是否为空的 while 循环 若请求输出块不为空 StringBuffer buffer1 new StringBuffer 100 for i 0 i reqblock pt1 length i 按该请求输出信 息块 reqlock 的指针 ptrl 将输出井中的一个文件的内容放入临时 buffer1 中 buffer1 append buffer reqblock pt1 repname reqblock pt1 addr reqblock pt1 addr reqblock pt1 addr 1 100 13 if reqblock pt1 repname 1 out 1 spooling textarea3 append 输出进程 1 第 out 1 个 文件的内容 else out 2 spooling textarea3 append 输出进程 2 第 out 2 个 文件的内容 spooling textarea3 append buffer1 toString n try sleep 1000 catch InterruptedException e e printStackTrace 释放相应输出井 即修改相应的输出井计数 c1 c1 reqblock pt1 repname c1 reqblock pt1 repname reqblock pt1 l ength pt1 pt1 1 10 c3 int k for k 1 k 2 k if pcb k status 1 有等待输出井的进程 唤醒相应进程 转进程调度 pcb k status 0 return for k 1 k 2 k if pcb k status 3 有等待请求输出块的进程 唤醒相 应进程 pcb k status 0 return 14 判断请求输出块是否为空的 while 循环结束 if pcb 1 status 4 spooling textarea3 append Spooling 输出进程结束 return else 输出 进程等待 pcb 3 status 2 return class Pcb int id 进程标识数 int status 进程状态 int count 要输出的文件数 int x 进程输出时的临时变量 class Reqblock int repname 请求进程名 int length 本次输出信息长度 int addr 信息在输出井的首地址 四 使用说明四 使用说明 运行界面如下图 1 所示 15 图 1 运行结果 1 在 用户进程 1 文件数 和 用户进程 2 文件数 的文本框里填入要输 出的文件数 2 点击 运行 按钮开始运行 3 最底下的 主程序调度过程 文本区会显示每次调度的进程 4 左边的 Spooling 的调度 文本区会把请求输出块的指针所示的信息输 出 5 中间的 用户进程 1 的输出 文本区会显示用户进程 1 每个文件的占用 输出井和请求输出块的情况 6 右边的 用户进程 2 的输出 文本区会显示用户进程 2 每个文件的占用 输出井和请求输出块的情况 7 点击 重置 按钮 回到最初界面 8 点击 关闭 按钮 关闭运行窗口 五 结果分析五 结果分析 在 用户进程 1 文件数 和 用户进程 2 文件数 的文本框里分别填入 3 和 11 点击 运行 按钮 得到的结果如上图 1 所示 每次的调度都用 隔开 从图中的数据可以分析出运行的顺序为 1 主程序选择调度用户进程 2 用户进程 2 的输出 显示第 1 10 个文 件成功得到输出井资源 buffer 2 0 71 和请求输出块资源 reqblock 0 9 第 11 个文件缺少 reqblock 申请失败 进入等待状态 3 转调度函数 2 主程序选择调度用户进程 1 用户进程 1 的输出 显示第 1 个文件缺 少 reqblock 申请失败 进入等待状态 3 转调度函数 16 3 用户进程 1 2 都处于等待状态 3 主程序只能选择调度 Spooling 进程 Spooling 的调度 显示第 1 10 个 reqblock 所指的信息 即用户进程 2 的第 1 10 个文件 唤醒等待输出井和请求块的进程 用户进程 1 2 都变为执行状 态 0 4 主程序选择调度用户进程 1 用户进程 1 的输出 显示第 1 3 个文件 成功得到输出井资源 buffer 1 0 23 和请求输出块资源 reqblock 0 2 进程 1 输 出完毕 转调度函数 5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论