操作系统实验报告.docx

上传人:b****0 文档编号:9573011 上传时间:2023-05-20 格式:DOCX 页数:16 大小:267.89KB
下载 相关 举报
操作系统实验报告.docx_第1页
第1页 / 共16页
操作系统实验报告.docx_第2页
第2页 / 共16页
操作系统实验报告.docx_第3页
第3页 / 共16页
操作系统实验报告.docx_第4页
第4页 / 共16页
操作系统实验报告.docx_第5页
第5页 / 共16页
操作系统实验报告.docx_第6页
第6页 / 共16页
操作系统实验报告.docx_第7页
第7页 / 共16页
操作系统实验报告.docx_第8页
第8页 / 共16页
操作系统实验报告.docx_第9页
第9页 / 共16页
操作系统实验报告.docx_第10页
第10页 / 共16页
操作系统实验报告.docx_第11页
第11页 / 共16页
操作系统实验报告.docx_第12页
第12页 / 共16页
操作系统实验报告.docx_第13页
第13页 / 共16页
操作系统实验报告.docx_第14页
第14页 / 共16页
操作系统实验报告.docx_第15页
第15页 / 共16页
操作系统实验报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告.docx

《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(16页珍藏版)》请在冰点文库上搜索。

操作系统实验报告.docx

操作系统实验报告

操作系统实验报告

 

院系:

专业:

班级:

学号:

姓名:

指导老师:

进程调度的模拟与内存管理

一、实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。

帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。

二、实验要求

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启动时要分配内存,内存分配采用最先适应算法。

回收内存时如果有相邻空闲空间,则要进行空闲空间合并。

五、部分源程序

publicclassdata{

privateStringname;etIsIn()==0)

{

for(inti=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(intj=0;j<();j++)

{

if(j).getIsIn()==0)

{

for(inti=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;

}

}

}

}

}

}

移除内存

publicvoidputOutMemory(ArrayListlist,intnum)

{

(num).setIsIn(0);

booleanflag1=false;

booleanflag2=false;

for(inti=0;i<();i++)

{

if(i).getBase()==(num).getLength()+(num).getStart()))

{

(i).setBase(num).getStart());

(i).setLimit(num).getLength()+(i).getLimit());

flag1=true;

break;

}

}

for(inti=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

{

inti=0;

while(i).getBase()<(num).getStart())

{

i++;

}

Data_Memorydata=newData_Memory();

(num).getStart());

(num).getLength());

();

for(intj=0;j

{

(j));

}

(data);

for(intj=i;j<();j++)

{

(j));

}

();

for(intj=0;j<();j++)

{

(j));

}

}

}

对内存管理调度的操作

privateclassMyRendererextendsDefaultListCellRenderer

{

publicComponentgetListCellRendererComponent(JListlist,Objectvalue,intindex,booleanisSelected,booleancellHasFocus)

{

(list,value,index,isSelected,cellHasFocus);

setBackground;

for(inti=0;i<();i++)

{

for(intj=(i).getBase()+6;j<(i).getLimit()+(i).getBase()+6;j++)

{

if(index==j)

{

setBackground;etTime()==0)

();

();

for(inti=0;i<();i++)

{

if(i).getTime()>0)

{

(i));

}

}

();

for(inti=0;i<();i++)

{

(i));

(i).setState("ready");

}

etState("ready");

}

etState("running");

update(readyList,0);

if()>0)

{

(0));

(5).setState("ready");

}

update(waitingList,0);

}

}

elseetState("running");

()-1).setState("ready");

(0));

update(readyList,0);

}

}

putInMemory();

sub();

display();

();

}

publicvoidPManager()

{

if()>0)

if(0).getTime()==0)

();

();

for(inti=0;i<();i++)

{

if(i).getTime()>0)

{

(i));

}

}

();

for(inti=0;i<();i++)

{

(i));

(i).setState("ready");

}

intj=0;

intm=();

for(;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)

{

booleanflag=false;

inta=(0).getPriority();

intb=(getFirstW(readyList)-1).getPriority();

if(a>b)

{

();

(getFirstW(readyList)-1));

flag=true;

}

if(flag)

{

(0).setState("ready");

(0));

();

(0));

(0).setState("running");

update(readyList,getFirstW(readyList)-1);

}

}

}

putInMemory();

sub1();

display();

();

}

}

六、程序运行图

图1进程界面

图2新建进程

图3进程的挂起与解挂

图4.进程的删除

图5进程运行中

七、实验总结

为了完成这个程序,我参考了课本,互联网以及相关资料。

由于我对java语言比较陌生,因此虽然这个试验比较简单,并且不是我一人独立完成,但也花费了我大量时间。

通过这个实验,我更加形象的了解了进程的调度过程,加深了对于优先权调度和时间片轮转调度的理解,并不像从前一样仅仅停留在概念上。

除此之外让我对java语言也有了进一步的了解。

由于实验要求是将内存管理实验与以上实验结合起来,因此在做此试验时,将此实验的代码直接放在第一个实验的界面之上,因此此实验就大大减小了难度,做起来也会比较顺利。

通过次实验,我对内存分配和内存回收有了更深刻的了解,我们平时用电脑时简单的一个动作对内存来说却要做出如此多的反应,找到一个空闲并且大小合适的空间进行内存分配。

本次实验使我对内存分配的了解有了很大的帮助。

在这次编程中我也出现了很多程序上的简单错误,都是因为我动手写程序比较少造成的,这也让我了解到要多次锻炼才能顺手成章。

以后我会努力加强锻炼,争取越来越好。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2