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