您的当前位置:首页正文

中南大学操作系统实验报告

来源:华拓网
中南大学

操作系统实验报告

姓名:学号:班级:

1

进程模拟与主存分配回收

一、 实验内容

1.设计进程管理中数据结构的内容; 2.设计一个优先权调度算法,实现进程调度; 3.设计至少两个临界资源的同步管理模拟。 4.主存存储器空间的分配和回收

二、 实验目的

a) 加深对进程概念及进程管理各部分内容的理解;

b) 熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构和同步机构的实现过程。

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

三、 实验要求

1.最好采用图形界面; 2.可随时增加进程;

3.规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道数,可自动从后备队4.列中调度作业进入。被阻塞进程入阻塞队列,设置唤醒功能用于将指定阻塞进程唤醒进入就绪队列;

5.每次调度完成,显示各进程状态;

6.设置至少两个临界资源阻塞队列和公共变量,模拟同步过程; 7.设置时间片中断操作;

8.自行假设主存空间大小,预设操作系统所占大小并构造未分分区表。 9.采用最先适应算法分配主存空间

10.进程完成后,分配主存,并与相邻空闲分区合并。

四、 具体实现

将实验一与实验二结合在一起。所以整合成了一分实验报告。在这里统一给出自己实现的思想。

1. 流程图

2

开始就绪队列外存队列内存是否够用阻塞队列是否有临界资源可以使用结束队列是否完成释放资源2.关键代码:

1.

}

}

2.

内存不够时,移入外存队列

public void move(PCB PCB,ArrayList externStore,ArrayList PCBready){

if()==false){ }

} (PCB); (PCB);

部分进程进入就绪队列利用冒泡法实现优先级的排序

etAll();

etPriority()<(j).getPriority()){

(0);

3

五、 实验总结

1.通过此次实验,对于操作系统的模拟有了更深的理解。进程的调度,在开始做第一个实验时,由于设计上的漏洞,导致临界资源一直被占用,结果造成了死锁。在实践中,更加理解了死锁的涵义。同时,也提醒着自己要不断的总结,注意数据结构方面的设计问题。

2.对于实验内容的理解,我在这方面产生了点困难。刚开始,不知道如何来模拟临界资源。在请教了老师之后,慢慢开始摸索。

3.,接触到第二个实验,对于主存空间的模拟又产生了困难。不知道该用什么来模拟。最终采用了投机取巧的方式。用了ArrayList.这样,就不用担心主存的回收问题了。但是这样,不太符合实际情况。

六、 源代码

package os_check_1;

import class CPU { static boolean source = false; static ArrayList PCBready = new ArrayList();etTime(); } return time; } etState(1);sGetStore()==true){ if(0).getSource()==true){etUseSource()==true){etPID()+\"执行\"); }else { (0));etPID()+\"执行\"); } } else {会占用临界资源 public void run1(ArrayList ready){ for(int x =0;x<=2;x++){un();etTime()==0){ break; } else { source = true;etUseSource(true); } } if(0).getUseSource() == true){ \"临界资源被\"+(0).getPID()+\"占用\"); } }

4

un();etTime()==0){ break; } } } etTime()==0){ (i));etUseSource()==true){etPID()+\"释放临界资源\"); source = false;etAll(); } \"阻塞队列中有:\"+()); for(int i=0;i<();i++){ (i).getAll(); } \"完成队列中有:\"+()); for(int i=0;i<();i++){ (i).getAll(); }

if()!=0){ \"是否需要从阻塞队列中唤醒进程\"); int choose = (); if(choose==1){ wakeUp(); } } \"是否需要增加进程\");etPID()==id){ for(int j=0;j<();j++){ if(j).getUseSource()==true){ (j).setUseSource(false);用mainStore的大小表示主存。 (0);sGetStore()==true){etPID()+\"从外存进入内存\"); } } } public void show(){ \"主存使用情况为:\"); for(int i=0;i<();i++){ } } }

package os_check_1;

5

public class PCB { private int PID;etAll(); (0); } } etPriority()<(j).getPriority()){ etAll(); } } }

package os_check_1;

import class Test { public static void main(String[] args){ CPU cpu = new CPU(); } }

6

因篇幅问题不能全部显示,请点此查看更多更全内容