中南大学操作系统实验报告Word文件下载.docx
- 文档编号:19346128
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:19
- 大小:135.07KB
中南大学操作系统实验报告Word文件下载.docx
《中南大学操作系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《中南大学操作系统实验报告Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
PCB>
arraylist){
for(inti=0;
i<
arraylist.size();
i++){
for(intj=i+1;
j<
j++){
if(arraylist.get(i).getPriority()<
arraylist.get(j).getPriority()){
//根据冒泡法来优先级排序
PCBtemp=arraylist.get(i);
arraylist.set(i,arraylist.get(j));
arraylist.set(j,temp);
}
}
}
}
2.自动从后备队列中往就绪队列中增加进程
//若内存中进程少于规定道数,可从后备队列中调度作业进入
publicvoidcheckPCB(ArrayList<
ready,ArrayList<
pool){
while(ready.size()<
4&
&
pool.size()>
0){
ready.add(pool.get(0));
System.out.println("
从后备队列往就绪队列中加入进程"
);
pool.get(0).getAll();
pool.remove(0);
3.内存不够时,移入外存队列
publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){
if(PCB.isGetStore()==false){
externStore.add(PCB);
PCBready.remove(PCB);
五、实验总结
1.通过此次实验,对于操作系统的模拟有了更深的理解。
进程的调度,在开始做第一个实验时,由于设计上的漏洞,导致临界资源一直被占用,结果造成了死锁。
在实践中,更加理解了死锁的涵义。
同时,也提醒着自己要不断的总结,注意数据结构方面的设计问题。
2.对于实验内容的理解,我在这方面产生了点困难。
刚开始,不知道如何来模拟临界资源。
在请教了老师之后,慢慢开始摸索。
3.,接触到第二个实验,对于主存空间的模拟又产生了困难。
不知道该用什么来模拟。
最终采用了投机取巧的方式。
用了ArrayList.这样,就不用担心主存的回收问题了。
但是这样,不太符合实际情况。
六、源代码
packageos_check_1;
importjava.util.ArrayList;
importjava.util.Scanner;
publicclassCPU{
staticbooleansource=false;
staticArrayList<
PCBready=newArrayList<
();
//这里才是真正的就绪队列
poolQueue=newArrayList<
//后备队列
blockQueue=newArrayList<
//阻塞队列
endQueue=newArrayList<
//结束队列
externStore=newArrayList<
//放入外存的队列
PCBinitpi=newPCBinit();
Scannersc=newScanner(System.in);
MainStorems=newMainStore();
CPU(){
this.PCBready=pi.PCBready;
this.poolQueue=pi.poolQueue;
while(time()>
fun();
//模拟进程的调度
publicvoidfun(){
CPUuse(PCBready);
CheckEnd(PCBready);
CheckBlock();
OutPut();
ms.show();
pi.checkPCB(PCBready,poolQueue);
pi.sort(PCBready);
//对可能发生的就绪队列进行优先级排序
System.out.println("
***********longxiao************"
//剩余运行的时间
publicinttime(){
inttime=0;
PCBready.size();
i++){//改变时间。
time=time+PCBready.get(i).getTime();
returntime;
//从就绪队列中调入优先级最高的运行。
publicvoidCPUuse(ArrayList<
ready){
if(ready.size()>
ready.get(0).setState
(1);
//将状态设置为运行状态
ms.GetEmpty(ready.get(0));
if(ready.get(0).isGetStore()==true){
if(ready.get(0).getSource()==true){//当需要使用临界资源时
if(source==false||ready.get(0).getUseSource()==true){//临界资源没有被使用
run1(ready);
进程"
+ready.get(0).getPID()+"
执行"
}else{
blockQueue.add(ready.get(0));
//将其加入阻塞队列
ready.remove(0);
//将其从就绪队列中移除
}else{//不需要使用临界资源的进程
run2(ready);
//开始执行
else{//移入外存
ms.move(ready.get(0),externStore,PCBready);
}
//设置时间片为3,开始运行。
如果在运行过程中,时间一直不为0.则会占用临界资源
publicvoidrun1(ArrayList<
for(intx=0;
x<
=2;
x++){//设置时间片为3
ready.get(0).run();
if(ready.get(0).getTime()==0){
break;
}else{
source=true;
//从此,临界资源被使用
ready.get(0).setUseSource(true);
}
if(ready.get(0).getUseSource()==true){
临界资源被"
占用"
//不需要临界资源的进程的运行
publicvoidrun2(ArrayList<
}
//是否应进入结束队列,从就绪队列中移除
publicvoidCheckEnd(ArrayList<
ready){
ready.size();
if(ready.get(i).getTime()==0){
ms.release(ready.get(i));
//释放所正在使用的内存
ms.check(externStore,PCBready);
System.out.println("
test:
checkEnd"
endQueue.add(ready.get(i));
if(ready.get(i).getUseSource()==true){//如果正在使用临界资源
System.out.println("
+ready.get(i).getPID()+"
释放临界资源"
source=false;
//释放临界资源
ready.remove(i);
//判断阻塞队列中是否能够进入就绪队列
//前提是占用临界资源的那个进程已经结束
publicvoidCheckBlock(){
pi.sort(blockQueue);
//对阻塞队列中的进程进行优先级排序
if(source==false&
blockQueue.size()>
checkblock"
//当临界资源出现空闲时,可以从阻塞队列中移除,进入就绪队列。
PCBready.add(blockQueue.get(0));
blockQueue.remove(0);
publicvoidOutPut(){
就绪队列中有:
"
+PCBready.size());
PCBready.get(i).getAll();
阻塞队列中有:
+blockQueue.size());
blockQueue.size();
blockQueue.get(i).getAll();
完成队列中有:
+endQueue.size());
endQueue.size();
endQueue.get(i).getAll();
if(blockQueue.size()!
=0){
是否需要从阻塞队列中唤醒进程(1.YES/ELSE.NO)"
intchoose=sc.nextInt();
if(choose==1){
wakeUp();
是否需要增加进程(1.YES/ELSE.NO)"
//加入的进程先放入后备队列。
然后由后备队列自动的添加到就绪队列中
intchoose=sc.nextInt();
if(choose==1){
pi.PCBadd(poolQueue);
publicvoidwakeUp(){
请输入需要唤醒进程的ID号"
intid=sc.nextInt();
if(blockQueue.get(i).getPID()==id){
for(intj=0;
if(PCBready.get(j).getUseSource()==true){
PCBready.get(j).setUseSource(false);
//解除j进程对临界资源占用。
以便让i进程进入就绪队列
}
PCBready.add(blockQueue.get(i));
blockQueue.remove(i);
}
publicclassMainStore{
Integer>
mainStore=newArrayList<
MainStore(){
10;
i++){//设置主存大小为10.利用mainStore的大小表示主存。
mainStore.add(0);
//构造未分分区表。
即设置所有的值为0。
值为1代表该内存被占用。
//得到某一块空闲分区的大小,并且占用。
将其置1
publicvoidGetEmpty(PCBPCB){
intfirst=0;
intlast=0;
mainStore.size();
last++;
if(mainStore.get(i)==1||i==mainStore.size()-1){
if(last-first>
=PCB.getSize()){
PCB.setFirstIndex(first);
+PCB.getPID()+"
进入主存"
PCB.setGetStore(true);
}else{
first=i;
if(PCB.isGetStore()==true){
inta=PCB.getFirstIndex();
intb=PCB.getSize();
for(;
a<
b;
a++){
mainStore.set(a,1);
//将被使用的主存置1
内存不足"
进程将被移入外存"
//释放空闲分区
publicvoidrelease(PCBPCB){
inta=PCB.getFirstIndex();
intb=PCB.getSize();
for(;
mainStore.set(a,0);
释放内存"
+PCB.getSize());
//内存不够时,移入外存。
进入外存队列
publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){
//内存何时够用
publicvoidcheck(ArrayList<
externStore,ArrayList<
PCBready){
externStore.size();
GetEmpty(externStore.get(i));
//检查是否能够得到内存
if(externStore.get(i).isGetStore()==true){//得到内存时
PCBready.add(externStore.get(i));
//将其再次加入就绪队列
+PCBready.get(i).getPID()+"
从外存进入内存"
publicvoidshow(){
主存使用情况为:
System.out.print(mainStore.get(i));
System.out.println();
publicclassPCB{
privateintPID;
//ID号
privateinttime;
//一共所需的运行时间
privateintpriority;
//优先级
privateintstate=0;
//状态
//0-就绪1-执行
privatebooleansource=false;
//占用的临界资源
privatebooleanuseSource=false;
//主存空间的分配和回收部分
privateintSize;
privateintfirstIndex;
privatebooleangetStore=false;
publicbooleanisGetStore(){
returngetStore;
publicvoidsetGetStore(booleangetStore){
this.getStore=getStore;
publicintgetSize(){
returnSize;
publicvoidsetSize(intsize){
Size=size;
publicintgetFirstIndex(){
returnfirstIndex;
publicvoidsetFirstIndex(intfirstIndex){
this.firstIndex=firstIndex;
publicintgetPID(){
returnPID;
publicvoidsetPID(intpID){
PID=pID;
publicintgetTime(){
publicvoidsetTime(inttime){
this.time=time;
publicintgetPriority(){
returnpriority;
publicvoidsetPriority(intpriority){
this.priority=priority;
publicintgetState(){
returnstate;
publicvoidsetState(intstate){
this.state=state;
publicbooleangetSource(){
returnsource;
publicvoidsetSource(booleansource){
this.source=source;
}
publicbooleangetUseSource(){
returnuseSource;
publicvoidsetUseSource(booleanuseSource){
this.useSource=useSource;
publicvoidrun(){
if(priority>
this.priority--;
if(time>
this.time=time-1;
//System.out.println(PID+"
:
publicvoidgetAll(){
PID:
+PID+"
-"
+time+"
+priority+"
+source);
publicclassPCBinit{
Scannersc=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 操作系统 实验 报告