操作系统优先级和时间片调度+内存管理.docx
- 文档编号:25743022
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:74
- 大小:536.66KB
操作系统优先级和时间片调度+内存管理.docx
《操作系统优先级和时间片调度+内存管理.docx》由会员分享,可在线阅读,更多相关《操作系统优先级和时间片调度+内存管理.docx(74页珍藏版)》请在冰豆网上搜索。
操作系统优先级和时间片调度+内存管理
操作系统实验报告
进程调度的模拟与内存管理
一、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。
帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。
二、实验要求
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启动时要分配内存,内存分配采用最先适应算法。
回收内存时如果有相邻空闲空间,则要进行空闲空间合并。
五、源程序
CPU调度代码和内存管理:
packageFinal;
//这是进程类
publicclassProcessPCB{
//backupBAK后备ready就绪suspend挂起memory内存
privateStringPID;
privateintRequiredTime;
privateintPriority;
privateStringStatus;
privateintMwmoryBase=0000;
privateintMemoryLimit;
publicProcessPCB(StringinitpID,intinitRTime,intinitpriority,
Stringstatus,intinitBase,intinitLimit){
this.PID=initpID;
this.RequiredTime=initRTime;
this.Priority=initpriority;
this.Status=status;
this.MwmoryBase=initBase;
this.MemoryLimit=initLimit;
}
publicStringgetPID(){
if(this.PID==null)
return"";
else
returnthis.PID;
}
publicintgetRequiredTime(){
returnthis.RequiredTime;
}
publicintgetPriority(){
returnthis.Priority;
}
publicStringgetStatus(){
if(this.Status==null)
return"";
else
returnthis.Status;
}
publicintgetMemoryBase(){
returnthis.MwmoryBase;
}
publicintgetMemoryLimit(){
returnthis.MemoryLimit;
}
publicbooleanequals(ProcessPCBpcb){
if(pcb.getPID()==this.getPID()){
returntrue;
}
elsereturnfalse;
}
publicStringtoString(){
returnthis.getPID()+"_"+this.getRequiredTime()+"_"+this.getPriority()+"_"
+this.getStatus()+"_"+this.getMemoryBase()+"_"+this.getMemoryLimit()+"\n";
}
publicvoidrun(){
if(this.RequiredTime!
=0){
this.RequiredTime=this.RequiredTime-1;
this.Priority=this.Priority-1;}
}
}
//这是进程存放和添加迭代器的类
packageFinal;
importjava.util.ArrayList;
importjava.util.Iterator;
publicclassPCBRecordsimplementsIterable
privateArrayList
publicArrayList
returnthis.PCBItems;
}
publicPCBRecords(){
this.PCBItems=newArrayList
}
publicvoidaddItem(ProcessPCBPcbItem){
this.PCBItems.add(PcbItem);
}
publicvoidremoveItem(ProcessPCBPCbItem){
this.PCBItems.remove(PCbItem);
}
publicProcessPCBgetItem(ProcessPCBprocessPCB){
for(ProcessPCBpCbItem:
this.PCBItems){
if(pCbItem.equals(processPCB)){
returnpCbItem;
}
}
returnnull;
}
publicProcessPCBgetItem(Stringpid){
for(ProcessPCBpcBItem:
this.PCBItems){
if(pcBItem.getPID().equals(pid)){
returnpcBItem;
}
}
returnnull;
}
publicintgetNumberOfItems(){
returnthis.PCBItems.size();
}
publicString[]getItemsProperties(){
StringitemsProperties[]=newString[getNumberOfItems()];
inti=0;
for(Iteratoriterator1=PCBItems.iterator();iterator1.hasNext();)
{
ProcessPCBstu_Item=(ProcessPCB)iterator1.next();
itemsProperties[i++]=stu_Item.toString();
}
returnitemsProperties;
}
publicIterator
returnthis.PCBItems.iterator();
}
}
//这是内存管理类
packageFinal;
publicclassMemoryItem{
privateintmemoryBase=0;
privateintmemoryLimit=0;
privateintavailableStatus=0;
publicMemoryItem(intinitMemoryBase,intinitMemoryLimit){
this.memoryBase=initMemoryBase;
this.memoryLimit=initMemoryLimit;
}
publicintgetMemoryBase(){
returnthis.memoryBase;
}
publicintgetMemoryLimit(){
returnthis.memoryLimit;
}
publicintgetStatus(){
returnthis.availableStatus;
}
publicStringtoString(){
return"已分配内存"+this.getMemoryBase()+"_剩余内存"+this.getMemoryLimit()+"\n";
}
}
//这是内存保存和添加迭代器的类
packageFinal;
importjava.util.ArrayList;
importjava.util.Iterator;
publicclassMemoryRecordsimplementsIterable
privateArrayList
publicIterator
returnthis.memoryItems.iterator();
}
publicArrayList
returnthis.memoryItems;
}
publicMemoryRecords(){
this.memoryItems=newArrayList
}
publicvoidaddItem(MemoryItemnewMemoryItem){
this.memoryItems.add(newMemoryItem);
}
publicvoidremoveItem(MemoryItemmomoryItem){
this.memoryItems.remove(momoryItem);
}
publicMemoryItemgetMomoryItem(MemoryItemitem){
for(MemoryItemmItem:
this.memoryItems){
if(mItem.equals(item)){
returnmItem;
}
}
returnnull;
}
publicMemoryItemgetMemoryItem(intbase){
for(MemoryItemmItem:
this.memoryItems){
if(mItem.getMemoryBase()==base){
returnmItem;
}
}
returnnull;
}
publicintgetNumberOfItems(){
returnthis.memoryItems.size();
}
publicString[]getItemsProperties(){
StringitemsProperties[]=newString[getNumberOfItems()];
inti=0;
for(Iteratoriterator1=this.memoryItems.iterator();iterator1.hasNext();){
MemoryItemmmItem=(MemoryItem)iterator1.next();
itemsProperties[i++]=mmItem.toString();
}
if(itemsProperties==null){
itemsProperties[0]="";
}
returnitemsProperties;
}
}
//这是界面的主函数,和相关实现的类
packageFinal;
importjava.applet.Applet;
importjava.applet.AudioClip;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Cursor;
importjava.awt.FlowLayout;
importjava.awt.Font;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.File;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Iterator;
importjava.util.StringTokenizer;
importjavax.swing.BorderFactory;
importjavax.swing.ButtonGroup;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JList;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JProgressBar;
importjavax.swing.JRadioButton;
importjavax.swing.JRootPane;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importjavax.swing.ListSelectionModel;
importjavax.swing.event.ListSelectionEvent;
importjavax.swing.event.ListSelectionListener;
importjavax.swing.table.DefaultTableCellRenderer;
publicclassCPUSchedulingextendsJFrame{
/**
*定义变量
*/
privatestaticfinallongserialVersionUID=-6748846647033499999L;
//放歌对象
privateAudioClipclip;
//内存占用情况
privatestaticintrate=0;
privatestaticJProgressBarjpr=newJProgressBar(0,1000);
staticprivatePrintWriterstdErr=newPrintWriter(System.err,true);
privatebooleanbflag=false;
staticprivateintWIDTH=1000,HEIGHT=730;//thesizeoftheFrame主面板
/*各列表对应的面板规格*/
/*对应各名词释义backupBAK后备ready就绪suspend挂起memory内存*/
staticprivateintBackupBAK_CELL_SIZE=250,BackupBAK_LIST_ROWS=10;//后备队列
staticprivateintSuspend_CELL_SIZE=250,Suspend_LIST_ROWS=10;//挂起队列
staticprivateintReady_CELL_SIZE=200,Ready_LIST_ROWS=6;//就绪队列
staticprivateintMemory_CELL_SIZE=200,Memory_LIST_ROWS=4;//内存队列
staticprivateintCPU_ROWS=3,CPU_COLS=2;//CPU面板
staticprivateintSTATUS_ROWS=7,STATUS_COLS=45;//系统状态面板
privateinttimeslice=1;//设置时间片大小
privateintsystemStatus=0;//设置系统状态0——系统预备状态,等待开始,1——系统运行状态,2——系统暂停状态
staticprivateintTOTAL__TEXTFIELD_SIZE=10;//Sizetotaltextfield记录各队列元素个数
privateJListbackupList,suspendList,readyList,memoryList;//各队列相对应的数组列表
//进程添加框中的"添加至后备队列","添加至就绪队列","重置"Button
privateJButtonaddToBAKButton,addToReadyButton,resetButton;
//就绪队列框中的"挂起",挂起队列框中的"解挂","删除"Button
privateJButtonsuspendButton,umountButton,removeButton;
//Status面板中的"启动系统","重置系统"Button,帮助按钮
privateJButtonstartButton,pauseButton,resetSyatemButton,helpButton;
//优先级和时间片单选钮及时间片显示框
privateJRadioButtonpriorityJRB,timesliceJRB;
privateJLabeltimesliceSizeLabel;
privateJTextFieldtimesliceJtf;
//后备面板、进程添加面板、挂起面板、内存面板
privateJPanelbackupBAKPanel,PCBItemPanel,suspendedPanel,memoryPanel;
//后备队列、挂起队列元
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 优先级 时间 调度 内存 管理