资源描述
操作系统实验报告
院系:
专业:
班级:
学号:
姓名:
指导老师:
进程调度得模拟与内存管理
一、 实验目得
在采用多道程序设计得系统中,往往有若干个进程同时处于就绪状态。当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器.实验模拟实现处理机调度,以加深了解处理机调度得工作,并体会优先级与时间片轮转调度算法得具体实施方法。帮助了解在不同得存储管理方式下,应怎样实现主存空间得分配与回收。
二、实验要求
1、可随机输入若干进程,并按优先权排序;
2、从就绪队首选进程运行:优先权-1/要求运行时间-1
要求运行时间=0时,撤销该进程
3、重新排序,进行下轮调度。
4、可随时增加进程;
5、规定道数,设置后备队列与挂起状态。若内存中进程少于规定道数,可自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。
6、每次调度后,显示各进程状态。
7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表;
表目内容:起址、长度、状态(未分/空表目)
8、结合以上实验,PCB增加为:
{PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,
PCB指针}
9、采用最先适应算法分配主存空间;
10、进程完成后,回收主存,并与相邻空闲分区合并。
11、采用图形界面;
三、实验内容
选择一个调度算法,实现处理机调度.
1、设计一个按优先权调度算法实现处理机调度得程序;
2、设计按时间片轮转实现处理机调度得程序。
3、主存储器空间得分配与回收.在可变分区管理方式下,采用最先适应算法实现主存空间得分配与回收。
四、实验原理
该模拟系统采用java语言实现,要实现得功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数与时间片大小可以由用户自己调整,有两种调度策略:按优先权调度与按时间片轮转调度。每个进程可能有5种状态:新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。每个状态都有一个队列用来存放处于该状态得进程,不同得调度策略采用不同得队列实现。当创建进程时,如果内存中得进程数还没达到规定道数,则将新建进程插入就绪队列,如果内存中进程数已经达到规定道数,则插到后备队列,后备队列中得进程得状态为new。CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。在系统运行过程中可以执行进程挂起操作,但执行得挂起操作时系统自动暂停运行,在弹出窗口选择要挂起得进程后,将选中得进程从原来得队列中删除并插入到挂起队列。进行解挂操作时将选中得进程从挂起队列中删除并插入该进程原来所处得队列。
Ø 按优先级调度:
当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程得优先权值越大代表优先级越高,优先队列中得进程按优先权从大到小排列,当新进程插入时根据该进程得优先权插入到队列中得合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务得规则.当要从队列中取出进程时总就是取队列中第一个进程,因为该进程得优先级最高。
Ø 按时间片轮转调度:
当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列得末尾,当要取进程时取队首进程,这样就实现了先进先出。
Ø 内存管理
该实验基于实验一完成,核心就是内存得分配与回收,在实验一得基础上增加内存管理部分,在新建进程得时候增加一个输入内存大小得输入框,在进程进入内存时要分配内存,在进程销毁时要回收内存,如果进入内存时内存不足,则将进程插入到后备队列等待下次调度。系统维护一个内存表,每个表项代表一个空间,每个空间保存了该空间得起始地址与空间大小以及空间使用状态。初始时只有一个空间,当CPU启动时要分配内存,内存分配采用最先适应算法.回收内存时如果有相邻空闲空间,则要进行空闲空间合并。
五、部分源程序
public class data {
private String name; //进程得名字
private int time; //要求得时间总与
private int priority; //进程得优先权,值越大优先级越高
private String state; //进程得状态
ﻩprivate int start;
ﻩprivate int length; //进程所占得内存空间
private int isIn; //进程所需内存大小
Ø 进程各项变量得初始化
public void setName(String name) {
ﻩthis、name = name;
ﻩ}
ﻩpublic void setPriority(int priority) {
ﻩ this、priority = priority;
ﻩ}
public void setState(String state) {
ﻩ this、state = state;
ﻩ}
ﻩpublic String getName() {
return (this、name);
}
ﻩpublic int getPriority() {
return (this、priority);
}
public String getState() {
ﻩﻩreturn (this、state);
ﻩ}
ﻩpublic void setTime(int time) {
ﻩthis、time = time;
}
public int getTime() {
ﻩ return (this、time);
}
ﻩpublic void setLength(int length) {
ﻩ this、length = length;
}
ﻩpublic int getLength() {
ﻩreturn (this、length);
}
ﻩpublic void setStart(int start) {
ﻩﻩthis、start = start;
ﻩ}
public int getStart() {
ﻩreturn (this、start);
ﻩ}
public void setIsIn(int isIn) {
ﻩ this、isIn = isIn;
}
ﻩpublic int getIsIn() {
ﻩreturn (this、isIn);
}
Ø 删除列表中第几个数据
public void update(ArrayList<Data> list, int num)
ﻩ{
ﻩsList、clear();
ﻩfor(int i = 0; i < list、size(); i++)
ﻩ{
ﻩﻩif(i != num)
ﻩ ﻩ{
ﻩﻩsList、add(list、get(i));
ﻩ }
}
ﻩ list、clear();
ﻩﻩfor(int i = 0; i < sList、size();i++)
ﻩﻩ{
ﻩﻩﻩlist、add(sList、get(i));
ﻩ}
}
public void update1(ArrayList〈Data_Memory〉 list, int num)
ﻩ{
ﻩ sList1、clear();
ﻩﻩfor(int i = 0; i < list、size(); i++)
ﻩﻩ{
ﻩ ﻩif(i != num)
ﻩﻩ{
ﻩﻩﻩ sList1、add(list、get(i));
}
ﻩ }
ﻩﻩlist、clear();
ﻩﻩfor(int i = 0; i < sList1、size();i++)
ﻩﻩ{
list、add(sList1、get(i));
ﻩ}
ﻩ}
Ø 放入内存
public void putInMemory()
ﻩ{
if(runningList、size()〉0)
ﻩ{
ﻩ if(runningList、get(0)、getIsIn()==0)
ﻩﻩﻩ{
ﻩ ﻩﻩfor(int i = 0; i 〈 unAssignList、size(); i++)
ﻩﻩ {
ﻩ ﻩif(unAssignList、get(i)、getLimit() >= runningList、get(0)、getLength())
ﻩ ﻩ ﻩ{
ﻩ ﻩ ﻩrunningList、get(0)、setStart(unAssignList、get(i)、getBase());
ﻩ runningList、get(0)、setIsIn(1);
ﻩﻩif(unAssignList、get(i)、getLimit() == runningList、get(0)、getLength())
ﻩﻩﻩ {
ﻩﻩ update1(unAssignList,i);
ﻩ ﻩ }
ﻩﻩﻩﻩ else
ﻩ ﻩ{
ﻩ ﻩﻩﻩﻩunAssignList、get(i)、setBase(unAssignList、get(i)、getBase()+runningList、get(0)、getLength());
ﻩﻩﻩﻩ unAssignList、get(i)、setLimit(unAssignList、get(i)、getLimit()-runningList、get(0)、getLength());
ﻩﻩ ﻩ}
ﻩ ﻩ break;
ﻩ ﻩ }
ﻩ ﻩ}
ﻩ ﻩ}
ﻩ}
ﻩ if(readyList、size()>0)
ﻩ {
ﻩﻩfor(int j = 0; j < readyList、size(); j++)
ﻩﻩﻩ{
ﻩ ﻩif(readyList、get(j)、getIsIn()==0)
ﻩ{
ﻩ for(int i = 0; i < unAssignList、size(); i++)
ﻩ ﻩ{
ﻩ ﻩﻩﻩ if(unAssignList、get(i)、getLimit() 〉= readyList、get(j)、getLength())
ﻩ {
ﻩﻩ ﻩﻩ readyList、get(j)、setStart(unAssignList、get(i)、getBase());
ﻩ ﻩﻩ ﻩ readyList、get(j)、setIsIn(1);
ﻩ ﻩﻩ if(unAssignList、get(i)、getLimit() == readyList、get(j)、getLength())
ﻩﻩ ﻩﻩ{
ﻩ ﻩ ﻩupdate1(unAssignList,i);
ﻩﻩﻩﻩﻩ }
ﻩ ﻩﻩﻩﻩﻩelse
ﻩ ﻩ {
ﻩ ﻩﻩ unAssignList、get(i)、setBase(unAssignList、get(i)、getBase()+readyList、get(j)、getLength());
ﻩ ﻩ ﻩﻩﻩunAssignList、get(i)、setLimit(unAssignList、get(i)、getLimit()-readyList、get(j)、getLength());
ﻩ ﻩﻩﻩ }
ﻩﻩ ﻩbreak;
ﻩ ﻩﻩ }
ﻩﻩﻩ ﻩ}
ﻩ }
ﻩﻩﻩ}
ﻩ }
ﻩ}
Ø 移除内存
public void putOutMemory(ArrayList〈Data> list, int num)
{
ﻩﻩlist、get(num)、setIsIn(0);
boolean flag1 = false;
ﻩ boolean flag2 = false;
for(int i = 0; i 〈 unAssignList、size(); i++)
ﻩﻩ{
ﻩ if(unAssignList、get(i)、getBase() == (list、get(num)、getLength()+list、get(num)、getStart()))
ﻩﻩ {
ﻩﻩ ﻩunAssignList、get(i)、setBase(list、get(num)、getStart());
ﻩ ﻩﻩunAssignList、get(i)、setLimit(list、get(num)、getLength()+unAssignList、get(i)、getLimit());
ﻩ ﻩ flag1 = true;
ﻩ break;
ﻩﻩﻩ}
ﻩ}
ﻩﻩfor(int i = 0; i 〈 unAssignList、size(); i++)
ﻩ{
ﻩ if((unAssignList、get(i)、getBase()+unAssignList、get(i)、getLimit()) == list、get(num)、getStart())
ﻩ ﻩ{
ﻩﻩﻩﻩif(!flag1)
ﻩ ﻩﻩ{
ﻩﻩ ﻩunAssignList、get(i)、setLimit(list、get(num)、getLength()+unAssignList、get(i)、getLimit());
ﻩ ﻩﻩflag2 = true;
ﻩﻩﻩ break;
ﻩﻩ }
ﻩﻩ else
ﻩﻩ {
ﻩ ﻩﻩunAssignList、get(i)、setLimit(unAssignList、get(i)、getLimit()+unAssignList、get(i+1)、getLimit());
ﻩ ﻩﻩupdate1(unAssignList,i+1);
ﻩﻩ }
}
ﻩ}
ﻩ if(flag1 || flag2)
ﻩ{}
ﻩ else
ﻩﻩ{
ﻩ ﻩint i = 0;
while(unAssignList、get(i)、getBase()〈list、get(num)、getStart())
ﻩ{
ﻩﻩﻩi++;
ﻩﻩ }
Data_Memory data = new Data_Memory();
ﻩdata、setBase(list、get(num)、getStart());
ﻩ data、setLimit(list、get(num)、getLength());
ﻩﻩﻩsList1、clear();
ﻩ ﻩfor(int j = 0; j 〈 i; j++)
{
ﻩ sList1、add(unAssignList、get(j));
ﻩﻩ }
ﻩﻩsList1、add(data);
ﻩ for(int j = i; j < unAssignList、size(); j++)
ﻩ {
ﻩ ﻩﻩsList1、add(unAssignList、get(j));
}
ﻩunAssignList、clear();
for(int j = 0; j 〈 sList1、size(); j++)
ﻩﻩ{
ﻩ unAssignList、add(sList1、get(j));
ﻩ }
ﻩ }
}
Ø 对内存管理调度得操作
private class MyRenderer extends DefaultListCellRenderer
ﻩ{
ﻩ public ponent getListCellRendererponent(JList list, Object value,int index, boolean isSelected, boolean cellHasFocus)
{
ﻩﻩﻩsuper、getListCellRendererponent(list, value, index, isSelected,cellHasFocus);
ﻩsetBackground(Color、gray);
ﻩﻩﻩfor(int i = 0; i < unAssignList、size(); i++)
ﻩ {
ﻩ ﻩfor(int j = unAssignList、get(i)、getBase()+6 ; j < unAssignList、get(i)、getLimit()+unAssignList、get(i)、getBase()+6; j++)
ﻩ ﻩ {
ﻩﻩif(index == j)
ﻩ ﻩ{
ﻩﻩ ﻩﻩﻩsetBackground(Color、white);//当没有内容变为白色
}
ﻩﻩ }
ﻩ }
ﻩreturn this;
}
}
public void timeManager()
{
ﻩﻩ//去掉time==0得,从waiting队列加入新得进程,排序,调整waitingList加入runningLIst
ﻩﻩ//去掉time==0得
ﻩﻩif(runningList、size()>0)
ﻩif(runningList、get(0)、getTime()==0)
ﻩ ﻩﻩrunningList、clear();
ﻩﻩsList、clear();
ﻩ for(int i = 0; i < readyList、size(); i++)
ﻩﻩ{
ﻩ if(readyList、get(i)、getTime()〉0)
ﻩ {
ﻩﻩ ﻩsList、add(readyList、get(i));
ﻩ}
ﻩ}
ﻩﻩreadyList、clear();
ﻩ for(int i =0; i < sList、size();i++)
ﻩ{
ﻩ readyList、add(sList、get(i));
ﻩ readyList、get(i)、setState("ready”);
}
//从waiting队列加入新得进程
ﻩﻩint j = 0;
int m = readyList、size();
ﻩfor(; m < 6 && j 〈 waitingList、size(); m++,j++)
ﻩ {
ﻩ readyList、add(waitingList、get(j));
ﻩ readyList、get(m)、setState(”ready");
ﻩ}
ﻩﻩ // sort(readyList);
ﻩ //调整waitingList
ﻩ sList、clear();
ﻩﻩfor(int i = j; i < waitingList、size(); i++)
{
sList、add(waitingList、get(i));ﻩ
ﻩ }
ﻩﻩwaitingList、clear();
ﻩfor(int i =0; i < sList、size();i++)
ﻩﻩ{
ﻩﻩwaitingList、add(sList、get(i));
ﻩ }
ﻩ//加入runningLIst
if(runningList、size()==0)
ﻩﻩ{
ﻩﻩﻩif(readyList、size()>0)
{
ﻩﻩrunningList、add(readyList、get(0));
ﻩrunningList、get(0)、setState("running”);
ﻩﻩ ﻩupdate(readyList,0);
ﻩﻩﻩif(waitingList、size()>0)
ﻩ ﻩ {
ﻩﻩ ﻩ readyList、add(waitingList、get(0));
ﻩﻩﻩ ﻩreadyList、get(5)、setState(”ready");
ﻩ ﻩ }
ﻩ ﻩﻩupdate(waitingList,0);
ﻩ}
}
ﻩelse //if(runningList、size()>0)
{
ﻩ if(readyList、size()〉0)
ﻩﻩ {
ﻩﻩreadyList、add(runningList、get(0));
ﻩﻩ runningList、clear();
ﻩ readyList、get(0)、setState("running”);
ﻩreadyList、get(readyList、size()-1)、setState(”ready");
ﻩ ﻩrunningList、add(readyList、get(0));
ﻩﻩ update(readyList,0);
ﻩﻩ }
ﻩﻩ}
ﻩputInMemory();
ﻩsub();
ﻩ display();
jtf1、grabFocus();
}
public void PManager()
ﻩ {
ﻩﻩ if(runningList、size()〉0)
ﻩ ﻩﻩif(runningList、get(0)、getTime()==0)
ﻩ ﻩrunningList、clear();
sList、clear();
ﻩ ﻩfor(int i = 0; i 〈 readyList、size(); i++)
ﻩ {
if(readyList、get(i)、getTime()〉0)
ﻩﻩ ﻩ {
ﻩﻩ ﻩﻩ sList、add(readyList、get(i));
ﻩ ﻩﻩ}
ﻩ ﻩ}
ﻩﻩ ﻩreadyList、clear();
ﻩfor(int i =0; i < sList、size();i++)
ﻩ ﻩ{
ﻩﻩreadyList、add(sList、get(i));
ﻩﻩ readyList、get(i)、setState("ready”);
ﻩ }
ﻩ ﻩint j = 0;
ﻩint m = readyList、size();
ﻩﻩ for(; m < 6 && j < waitingList、size(); m++,j++)
ﻩﻩ ﻩ{
ﻩ readyList、add(waitingList、get(getFirstW(waitingList)-1));
ﻩreadyList、get(m)、setState(”ready”);
ﻩ update(waitingList,getFirstW(waitingList)-1);
ﻩ }
ﻩﻩ ﻩ//调整waitingList
ﻩ //加入runningLIst
ﻩﻩ ﻩif(runningList、size()==0)
ﻩﻩ ﻩ{
ﻩ if(readyList、size()〉0)
ﻩ{
ﻩ ﻩ runningList、add(readyList、get(getFirstW(readyList)-1));
ﻩ ﻩﻩ runningList、get(0)、setState("running”);
ﻩ ﻩ update(readyList,getFirstW(readyList)-1);
ﻩ ﻩﻩﻩif(waitingList、size()〉0)
ﻩ ﻩﻩﻩ{
ﻩ ﻩ readyList、add(waitingList、get(getFirstW(waitingList)-1));
ﻩ ﻩ ﻩreadyList、get(readyList、size()—1)、setState(”ready”);
ﻩﻩ }
ﻩﻩ ﻩ update(waitingList,getFirstW(waitingList)-1);
ﻩﻩ ﻩﻩ}
ﻩ ﻩ}
ﻩﻩ ﻩelse
ﻩﻩ ﻩ{
ﻩﻩ ﻩif(readyList、size()>0)
ﻩﻩ ﻩ {
ﻩ boolean flag = false;
ﻩﻩ ﻩ int a = runningList、get(0)、getPriority();
ﻩint b = readyList、get(getFirstW(readyList)-1)、getPriority();
ﻩ ﻩﻩﻩif(a > b)
ﻩ {
ﻩﻩ ﻩﻩ ﻩsList、clear();
ﻩ sList、add(readyList、get(getFirstW(readyList)-1));
ﻩ ﻩ ﻩ ﻩflag = true;
ﻩ }
ﻩﻩ if(flag)
ﻩ ﻩﻩ{
ﻩ ﻩﻩﻩﻩrunningList、get(0)、setState("ready”);
ﻩ ﻩ readyList、add(runningList、get(0));
ﻩ ﻩﻩ ﻩﻩrunningList、clear();
ﻩ ﻩrunningList、add(sList、get(0));
ﻩ ﻩ runningList、get(0)、setState(”running");
ﻩ ﻩﻩupdate(readyList,getFirstW(readyList)-1);
ﻩﻩ ﻩﻩ }
ﻩ ﻩﻩ}
ﻩﻩ ﻩ}
putInMemory();
ﻩsub1();
ﻩﻩ display();
jtf1、grabFocus();
ﻩ }
}
六、程序运行图
图1 进程界面
图2 新建进程
图3 进程得挂起与解挂
图4、 进程得删除
图5 进程运行中
七、实验总结
为了完成这个程序,我参考了课本,互联网以及相关资料.由于我对java语言比较陌生,因此虽然这个试验比较简单,并且不就是我一人独立完成,但也花费了我大量时间.通过这个实验,我更加形象得了解了进程得调度过程,加深了对于优先权调度与时间片轮转调度得理解,并不像从前一样仅仅停留在概念上。除此之外让我对java语言也有了进一步得了解。
由于实验要求就是将内存管理实验与以上实验结合起来,因此在做此试验时,将此实验得代码直接放在第一个实验得界面之上,因此此实验就大大减小了难度,做起来也会比较顺利。通过次实验,我对内存分配与内存回收有了更深刻得了解,我们平时用电脑时简单得一个动作对内存来说却要做出如此多得反应,找到一个空闲并且大小合适得空间进行内存分配。本次实验使我对内存分配得了解有了很大得帮助。在这次编程中我也出现了很多程序上得简单错误,都就是因为我动手写程序比较少造成得,这也让我了解到要多次锻炼才能顺手成章。以后我会努力加强锻炼,争取越来越好。
展开阅读全文