操作系统优先级和时间片调度+内存管理_第1页
操作系统优先级和时间片调度+内存管理_第2页
操作系统优先级和时间片调度+内存管理_第3页
操作系统优先级和时间片调度+内存管理_第4页
操作系统优先级和时间片调度+内存管理_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统实验报告 进程调度的模拟与内存管理一、 实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。二、实验要求 1、可随机输入若干进程,并按优先权排序; 2、从就绪队首选进程运行:优先权-1/要求运行时间-1 要求运行时间=0时,撤销该进程3、重新排序,进行下轮调度。4、可随时增加进程;5、规定道数,设置后备队列和挂起状态。若内存中进程

2、少于规定道数,可自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。6、每次调度后,显示各进程状态。7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表; 表目内容:起址、长度、状态(未分/空表目) 8、结合以上实验,PCB增加为:PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置, PCB指针 9、采用最先适应算法分配主存空间;10、进程完成后,回收主存,并与相邻空闲分区合并。11、采用图形界面;三、实验内容选择一个调度算法,实现处理机调度。1、设计一个按优先权调度算法实现处理机调度的程序;2、设计按时间片轮转实现处理机调度

3、的程序。3、主存储器空间的分配和回收。在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。四、实验原理该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:按优先权调度和按时间片轮转调度。每个进程可能有5种状态:新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。当创建进程时,如果内存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果内存中进程数已

4、经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。Ø 按优先级调度: 当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进

5、程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。Ø 按时间片轮转调度:当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。Ø 内存管理该实验基于实验一完成,核心是内存的分配和回收,在实验一的基础上增加内存管理部分,在新建进程的时候增加一个输入内存大小的输入框,在进程进入内存时要

6、分配内存,在进程销毁时要回收内存,如果进入内存时内存不足,则将进程插入到后备队列等待下次调度。系统维护一个内存表,每个表项代表一个空间,每个空间保存了该空间的起始地址和空间大小以及空间使用状态。初始时只有一个空间,当CPU启动时要分配内存,内存分配采用最先适应算法。回收内存时如果有相邻空闲空间,则要进行空闲空间合并。五、源程序CPU调度代码和内存管理:package Final;/这是进程类public class ProcessPCB / backupBAK 后备 ready 就绪 suspend 挂起 memory内存 private String PID; private int Req

7、uiredTime; private int Priority; private String Status; private int MwmoryBase = 0000; private int MemoryLimit; public ProcessPCB(String initpID, int initRTime, int initpriority, String status, int initBase, int initLimit) this.PID = initpID; this.RequiredTime = initRTime; this.Priority = initpriori

8、ty; this.Status = status; this.MwmoryBase = initBase; this.MemoryLimit = initLimit; public String getPID() if(this.PID = null) return " " else return this.PID; public int getRequiredTime() return this.RequiredTime; public int getPriority() return this.Priority; public String getStatus() if

9、(this.Status = null) return " " else return this.Status; public int getMemoryBase() return this.MwmoryBase; public int getMemoryLimit() return this.MemoryLimit; public boolean equals(ProcessPCB pcb) if(pcb.getPID() = this.getPID() return true; else return false; public String toString() re

10、turn this.getPID() + "_" + this.getRequiredTime() + "_" + this.getPriority() + "_" + this.getStatus() + "_" + this.getMemoryBase() + "_" + this.getMemoryLimit() + "n" public void run() if(this.RequiredTime!=0) this.RequiredTime = this.Requi

11、redTime-1; this.Priority = this.Priority-1; /这是进程存放和添加迭代器的类package Final;import java.util.ArrayList; import java.util.Iterator; public class PCBRecords implements Iterable<ProcessPCB> private ArrayList<ProcessPCB> PCBItems; public ArrayList<ProcessPCB> getPCBItems() return this.PCB

12、Items; public PCBRecords() this.PCBItems = new ArrayList<ProcessPCB>(); public void addItem(ProcessPCB PcbItem) this.PCBItems.add(PcbItem); public void removeItem(ProcessPCB PCbItem) this.PCBItems.remove(PCbItem); public ProcessPCB getItem(ProcessPCB processPCB) for (ProcessPCB pCbItem : this.

13、PCBItems) if (pCbItem.equals(processPCB) return pCbItem; return null; public ProcessPCB getItem(String pid) for (ProcessPCB pcBItem : this.PCBItems) if (pcBItem.getPID().equals(pid) return pcBItem; return null; public int getNumberOfItems() return this.PCBItems.size(); public String getItemsProperti

14、es() String itemsProperties = new StringgetNumberOfItems(); int i = 0; for(Iterator iterator1 = PCBItems.iterator(); iterator1.hasNext();) ProcessPCB stu_Item = (ProcessPCB)iterator1.next(); itemsPropertiesi+ = stu_Item.toString(); return itemsProperties; public Iterator<ProcessPCB> iterator()

15、 return this.PCBItems.iterator(); /这是内存管理类package Final;public class MemoryItem private int memoryBase=0;private int memoryLimit=0;private int availableStatus=0;public MemoryItem(int initMemoryBase, int initMemoryLimit) this.memoryBase = initMemoryBase;this.memoryLimit = initMemoryLimit;public int g

16、etMemoryBase() return this.memoryBase; public int getMemoryLimit() return this.memoryLimit; public int getStatus() return this.availableStatus; public String toString() return "已分配内存"+this.getMemoryBase() + "_剩余内存" + this.getMemoryLimit() + "n" /这是内存保存和添加迭代器的类package Fi

17、nal;import java.util.ArrayList;import java.util.Iterator;public class MemoryRecords implements Iterable<MemoryItem> private ArrayList<MemoryItem> memoryItems;public Iterator<MemoryItem> iterator() return this.memoryItems.iterator(); public ArrayList<MemoryItem> getMemoryItems

18、() return this.memoryItems; public MemoryRecords() this.memoryItems = new ArrayList<MemoryItem>(); public void addItem(MemoryItem newMemoryItem) this.memoryItems.add(newMemoryItem); public void removeItem(MemoryItem momoryItem) this.memoryItems.remove(momoryItem); public MemoryItem getMomoryIt

19、em(MemoryItem item) for(MemoryItem mItem : this.memoryItems) if(mItem.equals(item) return mItem; return null; public MemoryItem getMemoryItem(int base) for(MemoryItem mItem : this.memoryItems) if(mItem.getMemoryBase() = base) return mItem; return null; public int getNumberOfItems() return this.memor

20、yItems.size(); public String getItemsProperties() String itemsProperties = new StringgetNumberOfItems(); int i=0; for(Iterator iterator1 = this.memoryItems.iterator(); iterator1.hasNext(); ) MemoryItem mmItem = (MemoryItem) iterator1.next(); itemsPropertiesi+ = mmItem.toString(); if(itemsProperties

21、= null) itemsProperties0 = " " return itemsProperties; /这是界面的主函数,和相关实现的类package Final;import java.applet.Applet;import java.applet.AudioClip;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Cursor;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;

22、import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.File;import java.io.IOException;import java.i

23、o.PrintWriter;import java.util.Iterator;import java.util.StringTokenizer;import javax.swing.BorderFactory;import javax.swing.ButtonGroup;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane

24、;import javax.swing.JPanel;import javax.swing.JProgressBar;import javax.swing.JRadioButton;import javax.swing.JRootPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.ListSelectionModel;import javax.swing.event.L

25、istSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.table.DefaultTableCellRenderer;public class CPUScheduling extends JFrame /* * 定义变量 */private static final long serialVersionUID = -6748846647033499999L;/放歌对象private AudioClip clip;/内存占用情况private static int rate=0;pri

26、vate static JProgressBar jpr = new JProgressBar(0,1000);static private PrintWriter stdErr = new PrintWriter(System.err, true);private boolean bflag=false;static private int WIDTH = 1000, HEIGHT = 730; / the size of the Frame 主面板 /* 各列表对应的面板规格*/*对应各名词释义 backupBAK 后备 ready 就绪 suspend 挂起 memory内存 */sta

27、tic private int BackupBAK_CELL_SIZE = 250, BackupBAK_LIST_ROWS = 10;/后备队列static private int Suspend_CELL_SIZE = 250, Suspend_LIST_ROWS = 10; /挂起队列static private int Ready_CELL_SIZE = 200, Ready_LIST_ROWS = 6; /就绪队列static private int Memory_CELL_SIZE = 200, Memory_LIST_ROWS = 4; /内存队列static private i

28、nt CPU_ROWS =3, CPU_COLS = 2; /CPU面板static private int STATUS_ROWS = 7, STATUS_COLS = 45; /系统状态面板 private int timeslice = 1; /设置时间片大小 private int systemStatus=0; /设置系统状态 0系统预备状态,等待开始,1系统运行状态,2系统暂停状态static private int TOTAL_TEXTFIELD_SIZE = 10; / Size total text field 记录各队列元素个数private JList backupLis

29、t, suspendList, readyList, memoryList; /各队列相对应的数组列表 /进程添加框中的"添加至后备队列","添加至就绪队列","重置"Buttonprivate JButton addToBAKButton, addToReadyButton, resetButton; /就绪队列框中的"挂起",挂起队列框中的"解挂","删除"Buttonprivate JButton suspendButton, umountButton, removeB

30、utton; /Status面板中的"启动系统","重置系统"Button,帮助按钮private JButton startButton, pauseButton, resetSyatemButton,helpButton; /优先级和时间片单选钮及时间片显示框private JRadioButton priorityJRB, timesliceJRB;private JLabel timesliceSizeLabel; private JTextField timesliceJtf; /后备面板、进程添加面板、挂起面板、内存面板private JPa

31、nel backupBAKPanel, PCBItemPanel, suspendedPanel, memoryPanel; /后备队列、挂起队列元素总数标签private JLabel backupTotalLabel, suspendTotalLabel; /进程信息标签 进程编号PID,所需运行时间requiredTime,优先级priority,当前状态statues,内存中的基址base,所需内存大小limitprivate JLabel PIDLabel, requiredTimeLabel, priorityLabel, statuesLabel, baseLabel, limi

32、tLabel; /后备队列、挂起队列元素总数文本框(不可编辑)private JTextField backupTotalTextField, suspendTotalTextField;/进程信息文本框 PID(可编辑),requiredTime(可编辑),priority(可编辑),status(不可编辑),base(不可编辑),limit(可编辑)private JTextField PIDTextField, requiredTimeTextField, priorityTextField, statusTextField, baseTextField, limitTextField;

33、 /CPU状态显示文本域(不可编辑),status信息文本域(用于现实程序每一步的操作和影响,不可编辑)private JTextArea CPUTextArea, statuesTextArea;/后备队列PCB数组,就绪、挂起,内存(可分分区表)PCBRecords backupPCB, readyPCB, suspendedPCB;private MemoryRecords memoryItems;private boolean flag = false;/* * 主函数 * param args * throws IOException */public static void mai

34、n(String args) throws IOException new CPUScheduling().initFrame();/初始化Framepublic void initFrame() backupList = new JList();backupList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);backupList.setVisibleRowCount(BackupBAK_LIST_ROWS);backupList.setFixedCellWidth(BackupBAK_CELL_SIZE);suspendLis

35、t = new JList();suspendList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);suspendList.setVisibleRowCount(Suspend_LIST_ROWS);suspendList.setFixedCellWidth(Suspend_CELL_SIZE);readyList = new JList();readyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);readyList.setVisibleRowCount(Re

36、ady_LIST_ROWS);readyList.setFixedCellWidth(Ready_CELL_SIZE);memoryList = new JList();memoryList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);memoryList.setVisibleRowCount(Memory_LIST_ROWS);memoryList.setFixedCellWidth(Memory_CELL_SIZE);suspendButton = new JButton("挂起(3)");addToBAK

37、Button = new JButton("加入后备(1)");addToReadyButton = new JButton("加入就绪(2)");resetButton = new JButton("重置(0)");umountButton = new JButton("解挂(4)");removeButton = new JButton("移除(5)");startButton = new JButton("调度开始(Enter)");pauseButton = new

38、JButton("暂停(Pause)");resetSyatemButton = new JButton("重置系统(Backspace)");helpButton = new JButton("帮助(H)");priorityJRB = new JRadioButton("优先级(Page Up)", true);timesliceJRB = new JRadioButton("时间片(Page Down)");suspendButton.setToolTipText("双击进程可以

39、直接挂起!");umountButton.setToolTipText("双击解挂按钮的正上方的进程,可以直接解挂!");removeButton.setToolTipText("双击移除按钮的正上方的进程,可以直接移除!");startButton.setBackground(Color.GREEN);pauseButton.setBackground(new Color(0,150,255);resetSyatemButton.setBackground(Color.RED);backupTotalLabel = new JLabel(&q

40、uot;总计:");backupTotalTextField = new JTextField("0", TOTAL_TEXTFIELD_SIZE);backupTotalTextField.setEditable(false);suspendTotalLabel = new JLabel("总计:");suspendTotalTextField = new JTextField("0", TOTAL_TEXTFIELD_SIZE);suspendTotalTextField.setEditable(false);times

41、liceSizeLabel = new JLabel("时间片:");timesliceJtf = new JTextField("3", 5);timesliceJtf.setEditable(true);CPUTextArea = new JTextArea(CPU_ROWS, CPU_COLS);CPUTextArea.setEditable(false);statuesTextArea = new JTextArea(STATUS_ROWS, STATUS_COLS);statuesTextArea.setEditable(false);/* n

42、orth panel*/JPanel northPanel = new JPanel(new GridLayout(1, 3);PCBItemPanel = new JPanel(new FlowLayout();PCBItemPanel.setBorder(BorderFactory.createTitledBorder("PCB项目信息");JPanel PCBItemButtonJPanel = new JPanel(new GridLayout(1, 3);PCBItemButtonJPanel.add(addToBAKButton);PCBItemButtonJP

43、anel.add(addToReadyButton);PCBItemButtonJPanel.add(resetButton);PCBItemPanel.add(this.initPCBItemPanel();PCBItemPanel.add(PCBItemButtonJPanel); /backupBAKList Panel backupBAKPanel = new JPanel(new BorderLayout();JTable jtb = new JTable(1, 6);jtb.setRowHeight(30);jtb.setEnabled(false);jtb.setGridColo

44、r(Color.BLUE);/设置jtable中的数据居中显示DefaultTableCellRenderer r = new DefaultTableCellRenderer(); r.setHorizontalAlignment(JLabel.CENTER); jtb.setDefaultRenderer(Object.class,r);jtb.setFont(new Font("",Font.BOLD,14);String str ="name","time","priority","status&

45、quot;,"base","limit"for(int i = 0;i<6;i+)jtb.setValueAt(stri, 0, i);backupBAKPanel.setBorder(BorderFactory.createTitledBorder("后备队列");backupList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); JPanel backupTotalPAnel = new JPanel(); backupTotalPAnel.add(bac

46、kupTotalLabel); backupTotalPAnel.add(backupTotalTextField); backupBAKPanel.add(jtb,BorderLayout.NORTH); backupList.setFont(new Font(null, Font.BOLD,18); backupBAKPanel.add (new JScrollPane(backupList,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.C

47、ENTER); backupBAKPanel.add(backupTotalPAnel, BorderLayout.SOUTH); / SuspendList Panel suspendedPanel = new JPanel(new BorderLayout(); suspendedPanel.setBorder(BorderFactory.createTitledBorder("挂起队列"); JPanel suspendedTotalPAnel = new JPanel(); suspendedTotalPAnel.add(suspendTotalLabel); su

48、spendedTotalPAnel.add(suspendTotalTextField); JPanel suspendComponentPanel = new JPanel(new GridLayout(1, 2); suspendComponentPanel.add(umountButton); suspendComponentPanel.add(removeButton); suspendedPanel.add (suspendedTotalPAnel, BorderLayout.NORTH); suspendList.setFont(new Font(null, Font.BOLD,1

49、8); suspendList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); suspendedPanel.add (new JScrollPane(suspendList,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); suspendedPanel.add(suspendComponentPanel, BorderLayout.SOUTH); /* cent

50、er Panel*/ JPanel centrelPanel = new JPanel(new GridLayout(1, 3); / readyList panel JPanel readyListPanel = new JPanel(new BorderLayout(); readyListPanel.setBorder(BorderFactory.createTitledBorder("就绪队列"); readyList.setFont(new Font(null, Font.BOLD,18); readyList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); readyListPanel.a

温馨提示

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

评论

0/150

提交评论