操作系统实验一

更新时间:2023-10-02 04:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中南大学

操作系统实验报告

姓名: 学号: 班级: 软件工程 指导老师: 胡志刚 完成时间: 2014-11

实验1《CPU Scheduling》

实验学时: 2 实验地点: 二综204 实验日期: 2014/11/19

一、实验目的

多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,加深了解处理机调度的工作过程。

二、实验内容

选择或者自行设计一个调度算法,实现处理机调度。 构建PCB,内容至少涵盖: 要求运行时间(单位时间); 优先权; 状态: PCB指针;

1、可随机输入若干进程,并按优先权排序 2、采用动态优先权调度,从就绪队首选进程运行: 优先权-1/要求运行时间-1 要求运行时间为0时,撤销该进程 3、重新排序,进行下轮调度 4、最好采用图形界面 5、可动态增加进程

6、规定道数,设置后备队列和挂起状态

7、如果内存中进程数少于规定道数,可自动从后备队列通过作业调度选择一作业进入,8、作业调度算法可自行选择

9、被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂并入就绪队列 10、每次调度后,显示各进程状态。

三、实验要求

进程名/PID;

四、实验代码

Pcb:进程控制块,用于保存进程的信息)

2

Reading:就绪队列,进入cpu中执行,6,按优先级顺序,时间片为1s Reserve:后备队列,存放进程,当就绪队列中进程数不足6个,从该队列调出 Suspend:挂起队列,就绪队列中的进程挂起后进入该队列 PcbGUI:程序界面以及执行的核心

}

类Pcb:

public class Pcb {

private String name; //进程名称 private int time; //时间

private int priority; //优先级,越大表明优先级越高 public Pcb(String n , int t, int p){ }

public String getName() { }

public void setName(String name) { }

public int getTime() { }

public void setTime(int time) { }

public int getPriority() { }

public void setPriority(int priority) { }

public void change(){ }

public String toString() { }

return this.getName() + \this.time--; this.priority--; this.priority = priority; return priority; this.time = time; return time; this.name = name; return name; this.name=n; this.time=t; this.priority=p;

3

类Reading:

import java.util.ArrayList; import java.util.Iterator;

public class Reading implements Iterable {

private ArrayList readlist;

}

return this.readlist;

public ArrayList getPCBItems() {

public Reading() {

}

this.readlist = new ArrayList();

public void addItem(Pcb PcbItem) {

}

this.readlist.add(PcbItem);

public void removeItem(Pcb PCbItem) {

}

this.readlist.remove(PCbItem);

public Pcb getItem(Pcb processPCB) {

}

for (Pcb pcBItem : this.readlist) {

if (pcBItem.getName().equals(pid)) { return pcBItem;

for (Pcb pCbItem : this.readlist) {

if (pCbItem.equals(processPCB)) { return pCbItem; } }

return null;

public Pcb getItem(String pid) {

4

}

} }

return null;

public int getNumberOfItems() {

public String[] getItemsProperties() {

String itemsProperties[] = new String[getNumberOfItems()]; int i = 0; }

return this.readlist.size();

for(Iterator iterator1 = readlist.iterator(); iterator1.hasNext();) { }

return itemsProperties; }

类Reserve:

import java.util.ArrayList; import java.util.Iterator;

public class Reserve implements Iterable{

private ArrayList reservelist; public Reserve(){ }

public Iterator iterator(){

return this.reservelist.iterator(); reservelist = new ArrayList(); public Iterator iterator() { }

return this.readlist.iterator(); }

Pcb stu_Item = (Pcb)iterator1.next(); itemsProperties[i++] = stu_Item.toString();

5

}

}

public void add(Pcb o){ }

public Pcb getfirst(int i){ }

public Pcb getprocess(String n){ }

public int getNumberOfItems() { }

public void removeItem(Pcb PCbItem) { }

public String[] getItemsProperties() {

String itemsProperties[] = new String[getNumberOfItems()]; int i = 0;

this.reservelist.remove(PCbItem);

return this.reservelist.size(); for(Pcb o : reservelist){ }

return null;

if(n.equals(o.getName()))

return o;

return reservelist.get(i); reservelist.add(o);

for(Iterator iterator1 = reservelist.iterator(); iterator1.hasNext();) { }

return itemsProperties; }

Pcb stu_Item = (Pcb)iterator1.next(); itemsProperties[i++] = stu_Item.toString();

6

类Suspend:

import java.util.ArrayList; import java.util.Iterator;

public class Suspend implements Iterable{

private ArrayList suspendlist; public Suspend() { }

public void add(Pcb o){ }

public Iterator iterator() { }

public Pcb getprocess(String n){ }

public int getNumberOfItems() { }

public void removeItem(Pcb PCbItem) { }

public String[] getItemsProperties() {

String itemsProperties[] = new String[getNumberOfItems()]; int i = 0;

this.suspendlist.remove(PCbItem); return this.suspendlist.size(); for(Pcb o : suspendlist){ }

return null;

if(n.equals(o.getName()))

return o;

return this.suspendlist.iterator(); this.suspendlist.add(o);

suspendlist = new ArrayList();

for(Iterator iterator1 = suspendlist.iterator(); iterator1.hasNext();) { }

Pcb stu_Item = (Pcb)iterator1.next(); itemsProperties[i++] = stu_Item.toString();

7

return itemsProperties; }

类PcbGUI: import java.awt.*; import java.util.*; import java.awt.event.*;

import javax.swing.*; import javax.swing.event.*;

public class PcbGUI extends JPanel{

/* Window height in pixels */ static private int HEIGHT = 600 ;

static private int RESERVE_LIST_SIZE = 110; static private int RESERVE_LIST_ROWS = 15; static private int READ_LIST_SIZE = 110; static private int READ_LIST_ROWS = 15; static private int SUSPEND_LIST_SIZE = 110; /* Window width in pixels */ static private int WIDTH = 830; }

public Pcb getItem(String pid) { }

for (Pcb pcBItem : this.suspendlist) {

if (pcBItem.getName().equals(pid)) { return pcBItem; } }

return null;

8

static private int SUSPEND_LIST_ROWS = 14; static private int MEMORY_LIST_SIZE = 110; static private int MEMORY_LIST_ROWS = 15; private static JTextField PnameTextField; private JTextField PtimeTextField; private JTextField PpriorityTextField; private JTextField LimitTextField; private JTextField run; private JTextArea STextArea; private JButton Addbutton; private JButton Beginbutton; private JButton Pausebutton; private JButton Suspendbutton; private JButton Exitbutton; private JButton Hsbutton; private JList ReserveList; private JList ReadList; private JList SuspendList; private JList MemoryList;

private Reserve reslist; //后备队列 private Reading realist; //就绪队列 private Suspend slist; //挂起队列

private int Pause; //Pause=1表示运行,Pause=0表示暂停 private boolean flag = false; //控制线程运行 public static void main(String[] args) { }

public PcbGUI(){

Pause = 1;

reslist = new Reserve();

// TODO Auto-generated method stub

JFrame frame = new JFrame(\frame.setContentPane(new PcbGUI());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(WIDTH, HEIGHT); frame.setResizable(true); frame.setVisible(true);

frame.setLocationRelativeTo(null); PnameTextField.requestFocus();

9

realist = new Reading(); slist = new Suspend();

Font x = new Font(\Font f=new Font(\楷体\//设置后备队列

ReserveList = new JList();

ReserveList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ReserveList.setVisibleRowCount(RESERVE_LIST_ROWS); ReserveList.setFixedCellWidth(RESERVE_LIST_SIZE); JPanel ProcessPanel1 = new JPanel();

ProcessPanel1.setBorder(BorderFactory.createTitledBorder(\ProcessPanel1.add (

new JScrollPane(ReserveList,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));

ProcessPanel1.setBounds(10, 10, 150, 370); ProcessPanel1.setBackground(null);

//设置就绪队列 ReadList = new JList();

ReadList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ReadList.setVisibleRowCount(READ_LIST_ROWS); ReadList.setFixedCellWidth(READ_LIST_SIZE); JPanel ProcessPanel2 = new JPanel();

ProcessPanel2.setBorder(BorderFactory.createTitledBorder(\ProcessPanel2.add (

//设置运行框

JPanel Run = new JPanel();

Run.setBorder(BorderFactory.createTitledBorder(\run = new JTextField(8);

run.setHorizontalAlignment(JTextField.CENTER);

new JScrollPane(ReadList,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));

ProcessPanel2.setBounds(160, 10, 150, 370);

10

run.setBorder(BorderFactory.createEmptyBorder());

run.setFont(x); run.setEditable(false); Run.add(run);

Run.setBounds(310, 10, 200, 80);

//设置添加

JPanel AddPanel = new JPanel(); AddPanel.setLayout(null);

AddPanel.setBorder(BorderFactory.createTitledBorder(\AddPanel.setBounds(310,100,200,280); Addbutton = new JButton(\添加(A)\Addbutton.setMnemonic(KeyEvent.VK_A); Addbutton.setFont(f);

Addbutton.setBounds(65, 220, 90, 35); PnameTextField = new JTextField(5); PtimeTextField = new JTextField(5); PpriorityTextField = new JTextField(5); LimitTextField = new JTextField(5);

PnameTextField.setHorizontalAlignment(JTextField.CENTER); PtimeTextField.setHorizontalAlignment(JTextField.CENTER); PpriorityTextField.setHorizontalAlignment(JTextField.CENTER); LimitTextField.setHorizontalAlignment(JTextField.CENTER); PnameTextField.setBounds(110, 35, 60, 23); PtimeTextField.setBounds(110, 75, 60, 23); PpriorityTextField.setBounds(110, 115, 60, 23); LimitTextField.setBounds(110, 155, 60, 23); JLabel NameLabel = new JLabel(\JLabel TimeLabel = new JLabel(\JLabel PriorityLabel = new JLabel(\JLabel LimitLabel = new JLabel(\NameLabel.setBounds(30, 35, 60, 23); TimeLabel.setBounds(30, 75, 60, 23); PriorityLabel.setBounds(30, 115, 60, 23); LimitLabel.setBounds(30, 155, 60, 23); AddPanel.add(Addbutton);

11

AddPanel.add(PnameTextField); AddPanel.add(PtimeTextField); AddPanel.add(PpriorityTextField); AddPanel.add(LimitTextField); AddPanel.add(NameLabel); AddPanel.add(TimeLabel); AddPanel.add(PriorityLabel); AddPanel.add(LimitLabel);

//设置挂起队列

SuspendList = new JList();

SuspendList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); SuspendList.setVisibleRowCount(SUSPEND_LIST_ROWS); SuspendList.setFixedCellWidth(SUSPEND_LIST_SIZE); JPanel ProcessPanel3 = new JPanel();

ProcessPanel3.setBorder(BorderFactory.createTitledBorder(\JPanel ProcessPanel4 = new JPanel(); ProcessPanel4.add (

new JScrollPane(SuspendList,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));

Hsbutton = new JButton(\解挂(U)\Hsbutton.setMnemonic(KeyEvent.VK_U); Hsbutton.setFont(f);

ProcessPanel3.add(ProcessPanel4,BorderLayout.NORTH); ProcessPanel3.add(Hsbutton,BorderLayout.SOUTH); ProcessPanel3.setBounds(510, 10, 150, 370);

//设置开始按钮

Beginbutton = new JButton(\开始(B)\Beginbutton.setBounds(650, 415, 90, 35); Beginbutton.setFont(f);

Beginbutton.setMnemonic(KeyEvent.VK_B);

12

//设置暂停按钮

Pausebutton = new JButton(\暂停(P)\Pausebutton.setBounds(470, 415, 90, 35); Pausebutton.setFont(f);

Pausebutton.setMnemonic(KeyEvent.VK_P);

//设置挂起按钮

Suspendbutton = new JButton(\挂起(S)\Suspendbutton.setBounds(470, 490, 90, 35); Suspendbutton.setFont(f);

Suspendbutton.setMnemonic(KeyEvent.VK_S);

//设置退出按钮

Exitbutton = new JButton(\退出(X)\Exitbutton.setBounds(650, 490, 90, 35); Exitbutton.setFont(f);

Exitbutton.setMnemonic(KeyEvent.VK_X);

//设置备注

STextArea = new JTextArea(); STextArea.setBounds(20,18,310,115);

STextArea.setFont(new Font(\STextArea.setBackground(null); STextArea.setEditable(false); JPanel SPanel = new JPanel(); SPanel.setLayout(null);

SPanel.setBorder(BorderFactory.createTitledBorder(\SPanel.setBounds(10, 390, 350, 140); SPanel.add(STextArea);

setLayout(null);

add(ProcessPanel1); add(ProcessPanel2); add(Run); add(AddPanel); add(ProcessPanel3); add(Beginbutton);

13

}

add(Pausebutton); add(Suspendbutton); add(Exitbutton);

//初始添加一些进程

realist.addItem(new Pcb(\realist.addItem(new Pcb(\realist.addItem(new Pcb(\sortReadyPCB();

reslist.add(new Pcb(\reslist.add(new Pcb(\reslist.add(new Pcb(\reslist.add(new Pcb(\reslist.add(new Pcb(\

ReserveList.setListData(reslist.getItemsProperties());

//消息响应函数

Addbutton.addActionListener(new AddListener()); Exitbutton.addActionListener(new ExitListener()); Beginbutton.addActionListener(new BeginListener()); Suspendbutton.addActionListener(new SuspendListener()); Pausebutton.addActionListener(new PauseListener()); Hsbutton.addActionListener(new HsListener());

ReadList.addListSelectionListener(new DisplayListener()); ReserveList.addListSelectionListener(new DisplayListener2()); SuspendList.addListSelectionListener(new DisplayListener1());

//对就绪队列按优先级进行排序 public void sortReadyPCB() {

Reading currentReadyPCB = new Reading(); int num = realist.getNumberOfItems(); if(num > 0) {

for(int i=num; i>=1; i--) {

Iterator readyIterator = realist.iterator(); Pcb currentItem = (Pcb) readyIterator.next(); for( ; readyIterator.hasNext(); ) {

14

}

}

}

}

Pcb nowItem = (Pcb) readyIterator.next();

if(currentItem.getPriority() < nowItem.getPriority()) { }

currentItem = null; currentItem = nowItem;

currentReadyPCB.addItem(currentItem); realist.removeItem(currentItem);

realist = null;

realist = currentReadyPCB;

ReadList.setListData(realist.getItemsProperties());

//线程,CPU处理进程

class newthread extends Thread{

int t;

int TimeSlice; boolean Flag = true; public void run(){

while(Flag){

if(getPause() == 1){ }

if(realist.getNumberOfItems() < 6){

if(reslist.getNumberOfItems() > 0) {

while(realist.getNumberOfItems() < 6) {

if(reslist.getNumberOfItems() > 0) {

while(getPause() == 1){ }

try { }

new Thread().sleep(1000);

// TODO Auto-generated catch block e.printStackTrace();

} catch (InterruptedException e) {

15

}

}

}

Iterator bwackupPCBIterator = reslist.iterator(); Pcb newItem = (Pcb) bwackupPCBIterator.next(); while(bwackupPCBIterator.hasNext() ) {

newItem = (Pcb) bwackupPCBIterator.next(); if(newItem == null) break; if(newItem != null) { Pcb

nowItem

=

new

Pcb(newItem.getName(), newItem.getTime(), newItem.getPriority());

realist.addItem(nowItem); reslist.removeItem(newItem);

ReserveList.setListData(reslist.getItemsProperties());

}

} else break;

sortReadyPCB();

ReserveList.setListData(reslist.getItemsProperties()); Iterator readyIterator = realist.iterator(); Pcb runningItem = null; if(readyIterator.hasNext()) { }

if(runningItem != null) {

t = runningItem.getTime(); TimeSlice = 1;

for(int i=TimeSlice; i>0; i--) {

if(t > 0) {

runningItem.change();

run.setText(runningItem.getName()); t--;

sortReadyPCB(); try {

Thread.sleep(1000);

runningItem = (Pcb) readyIterator.next();

16

}

}

}

}

}

} catch (Exception ee) { }

ee.printStackTrace();

if(t <= 0) { }

if(realist.getNumberOfItems() > 0)

Flag = getFlag(); else Flag = false;

Flag = false;

realist.removeItem(runningItem); runningItem = null; sortReadyPCB();

} else Flag = false; if(Pause == 1) { }

if(getPause() == 0) Flag = true;

while(getPause()==1) { }

try { }

Thread.sleep(1000); ee.printStackTrace(); } catch (Exception ee) {

public boolean getFlag() { }

public int getPause(){ }

//添加按钮的消息响应函数

return Pause; return this.flag;

17

class AddListener implements ActionListener { }

//退出按钮的消息响应函数

class ExitListener implements ActionListener { }

//开始按钮的消息响应函数

class BeginListener implements ActionListener { }

//挂起按钮的消息响应函数

public void actionPerformed(ActionEvent event) { }

ReadList.setListData(realist.getItemsProperties()); Pause = 0;

Thread run = new newthread();

flag = true; run.start();

public void actionPerformed(ActionEvent event) { }

System.exit(0);

public void actionPerformed(ActionEvent event){ }

String str1 = PnameTextField.getText();

int n1 = Integer.parseInt(PtimeTextField.getText()); int n2 = Integer.parseInt(PpriorityTextField.getText()); if(realist.getNumberOfItems()<6){

realist.addItem(new Pcb(str1,n1,n2)); }else{

reslist.add(new Pcb(str1,n1,n2)); }

ReadList.setListData(realist.getItemsProperties()); ReserveList.setListData(reslist.getItemsProperties()); PnameTextField.requestFocus(); PnameTextField.selectAll();

18

class SuspendListener implements ActionListener { public void actionPerformed(ActionEvent event) { String selectedReadyItem = null; String pid = \

if(realist.getNumberOfItems() != 0){ try{ selectedReadyItem = (String) ReadList.getSelectedValue(); if(selectedReadyItem != null) {

StringTokenizer stringtokenizer

=

StringTokenizer(selectedReadyItem, \

pid = stringtokenizer.nextToken(); Pcb selectedItem = realist.getItem(pid); if(selectedItem != null){ Pcb boolItem = slist.getItem(pid);

while(boolItem != null) { pid = \

boolItem = slist.getItem(pid);

} Pcb

newPcb

=

new

selectedItem.getTime(),selectedItem.getPriority())

slist.add(newPcb);

realist.removeItem(selectedItem); sortReadyPCB();

SuspendList.setListData(slist.getItemsProperties());

}

}

} catch (RuntimeException e1) {

// TODO Auto-generated catch block

}

}

}

}

//暂停按钮的消息响应函数

class PauseListener implements ActionListener { public void actionPerformed(ActionEvent event) {

if(Pause == 0){

19 new

Pcb(pid,

}

}

}

flag = false;

Pausebutton.setText(\继续(P)\Pause = 1;

else{ }

flag = true; Pause =0;

Pausebutton.setText(\暂停(P)\

//解挂按钮的消息响应函数

class HsListener implements ActionListener {

public void actionPerformed(ActionEvent event) {

String selectedReadyItem = null; String pid = \

if(slist.getNumberOfItems() != 0){

try{

selectedReadyItem = (String) SuspendList.getSelectedValue(); if(selectedReadyItem != null) {

StringTokenizer

stringtokenizer

=

new

StringTokenizer(selectedReadyItem, \

pid = stringtokenizer.nextToken(); Pcb selectedItem = slist.getItem(pid); if(selectedItem != null){

}else {

reslist.add(new

Pcb(pid,

if(realist.getNumberOfItems() < 6) {

int

realist.addItem(new

n

=

Pcb(pid,

MemoryAllocation(selectedItem.getLimit()); selectedItem.getTime(),

selectedItem.getPriority()

ReadList.setListData(realist.getItemsProperties());

20

selectedItem.getTime(),selectedItem.getPriority()));

}

slist.removeItem(selectedItem);

ReserveList.setListData(realist.getItemsProperties());

}

// TODO Auto-generated catch block

}

SuspendList.setListData(slist.getItemsProperties());

}

}

} catch (RuntimeException e1) { }

}

//display就绪队列中的进程

class DisplayListener implements ListSelectionListener{

public void valueChanged(ListSelectionEvent event) {

if (! ReadList.getValueIsAdjusting()) {

String selectedReadyItem = null; String pid = \String ptime = \String pp = \

selectedReadyItem = (String) ReadList.getSelectedValue(); if(selectedReadyItem != null) { }

StringTokenizer

stringtokenizer1

=

new

StringTokenizer(selectedReadyItem, \

}

pid = stringtokenizer1.nextToken(); ptime = stringtokenizer1.nextToken(); pp = stringtokenizer1.nextToken(); String b = stringtokenizer1.nextToken(); String l = stringtokenizer1.nextToken();

STextArea.setText(\

\

21

}

}

//display挂起队列中的进行

class DisplayListener1 implements ListSelectionListener{

public void valueChanged(ListSelectionEvent event) {

if (! SuspendList.getValueIsAdjusting()) {

String selectedReadyItem = null; String pid = \String ptime = \String pp = \

selectedReadyItem = (String) SuspendList.getSelectedValue(); if(selectedReadyItem != null) { }

StringTokenizer

stringtokenizer1

=

new

StringTokenizer(selectedReadyItem, \

}

//display后备队列中的消息响应函数

class DisplayListener2 implements ListSelectionListener{

public void valueChanged(ListSelectionEvent event) {

if (! ReserveList.getValueIsAdjusting()) {

String selectedReadyItem = null; String pid = \String ptime = \String pp = \

selectedReadyItem = (String) ReserveList.getSelectedValue(); if(selectedReadyItem != null) {

}

}

pid = stringtokenizer1.nextToken(); ptime = stringtokenizer1.nextToken(); pp = stringtokenizer1.nextToken(); String b = stringtokenizer1.nextToken(); String l = stringtokenizer1.nextToken();

STextArea.setText(\

\

22

}

StringTokenizer

stringtokenizer1 = new

StringTokenizer(selectedReadyItem, \ }

}

}

}

pid = stringtokenizer1.nextToken(); ptime = stringtokenizer1.nextToken(); pp = stringtokenizer1.nextToken(); String b = stringtokenizer1.nextToken(); String l = stringtokenizer1.nextToken();

STextArea.setText(\

\

五、程序展示

23

24

25

本文来源:https://www.bwwdw.com/article/t05d.html

Top