《中南大学操作系统实验报告(共14页).doc》由会员分享,可在线阅读,更多相关《中南大学操作系统实验报告(共14页).doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上中南大学操作系统实验报告姓名: 学号: 班级: 进程模拟与主存分配回收一、 实验内容1.设计进程管理中数据结构的内容;2.设计一个优先权调度算法,实现进程调度;3.设计至少两个临界资源的同步管理模拟。4.主存存储器空间的分配和回收二、 实验目的a) 加深对进程概念及进程管理各部分内容的理解;b) 熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构和同步机构的实现过程。c) 帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收三、 实验要求1.最好采用图形界面;2.可随时增加进程;3.规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道数,可自动
2、从后备队4.列中调度作业进入。被阻塞进程入阻塞队列,设置唤醒功能用于将指定阻塞进程唤醒进入就绪队列;5.每次调度完成,显示各进程状态;6.设置至少两个临界资源阻塞队列和公共变量,模拟同步过程;7.设置时间片中断操作;8.自行假设主存空间大小,预设操作系统所占大小并构造未分分区表。9.采用最先适应算法分配主存空间10.进程完成后,分配主存,并与相邻空闲分区合并。四、 具体实现将实验一与实验二结合在一起。所以整合成了一分实验报告。在这里统一给出自己实现的思想。1. 流程图2.关键代码:1. 利用冒泡法实现优先级的排序/优先级的排序public void sort(ArrayList arrayli
3、st)for(int i=0;iarraylist.size();i+)for(int j=i+1;jarraylist.size();j+)if(arraylist.get(i).getPriority()arraylist.get(j).getPriority()/根据冒泡法来优先级排序PCB temp = arraylist.get(i);arraylist.set(i, arraylist.get(j);arraylist.set(j, temp);2. 自动从后备队列中往就绪队列中增加进程/若内存中进程少于规定道数,可从后备队列中调度作业进入public void checkPCB(
4、ArrayList ready,ArrayList pool)while(ready.size()0)ready.add(pool.get(0);System.out.println(从后备队列往就绪队列中加入进程);pool.get(0).getAll();pool.remove(0);3. 内存不够时,移入外存队列public void move(PCB PCB,ArrayList externStore,ArrayList PCBready)if(PCB.isGetStore()=false)externStore.add(PCB);PCBready.remove(PCB);五、 实验总
5、结1.通过此次实验,对于操作系统的模拟有了更深的理解。进程的调度,在开始做第一个实验时,由于设计上的漏洞,导致临界资源一直被占用,结果造成了死锁。在实践中,更加理解了死锁的涵义。同时,也提醒着自己要不断的总结,注意数据结构方面的设计问题。2.对于实验内容的理解,我在这方面产生了点困难。刚开始,不知道如何来模拟临界资源。在请教了老师之后,慢慢开始摸索。3.,接触到第二个实验,对于主存空间的模拟又产生了困难。不知道该用什么来模拟。最终采用了投机取巧的方式。用了ArrayList.这样,就不用担心主存的回收问题了。但是这样,不太符合实际情况。六、 源代码package os_check_1;impo
6、rt java.util.ArrayList;import java.util.Scanner;public class CPU static boolean source = false;static ArrayList PCBready = new ArrayList();/这里才是真正的就绪队列static ArrayList poolQueue = new ArrayList();/后备队列static ArrayList blockQueue = new ArrayList();/阻塞队列static ArrayList endQueue = new ArrayList();/结束队
7、列static ArrayList externStore = new ArrayList();/放入外存的队列PCBinit pi = new PCBinit();Scanner sc = new Scanner(System.in);MainStore ms = new MainStore(); CPU() this.PCBready = pi.PCBready; this.poolQueue = pi.poolQueue;while(time()0)fun(); /模拟进程的调度 public void fun() CPUuse(PCBready); CheckEnd(PCBready)
8、; CheckBlock(); OutPut(); ms.show(); pi.checkPCB(PCBready, poolQueue); pi.sort(PCBready);/对可能发生的就绪队列进行优先级排序 System.out.println(*longxiao*); /剩余运行的时间 public int time() int time = 0; for(int i=0;iPCBready.size();i+)/改变时间。 time= time+PCBready.get(i).getTime(); return time; /从就绪队列中调入优先级最高的运行。public void
9、 CPUuse(ArrayList ready)if(ready.size()0)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);System.out.println(进程+ready.get(0).getPID()+执行)
10、;else blockQueue.add(ready.get(0);/将其加入阻塞队列ready.remove(0);/将其从就绪队列中移除else/不需要使用临界资源的进程run2(ready);/开始执行System.out.println(进程+ready.get(0).getPID()+执行);else /移入外存ms.move(ready.get(0), externStore, PCBready);/设置时间片为3,开始运行。如果在运行过程中,时间一直不为0.则会占用临界资源public void run1(ArrayList ready)for(int x =0;x=2;x+)/
11、设置时间片为3ready.get(0).run();/开始执行if(ready.get(0).getTime()=0)break; else source = true;/从此,临界资源被使用ready.get(0).setUseSource(true);if(ready.get(0).getUseSource() = true)System.out.println(临界资源被+ready.get(0).getPID()+占用);/不需要临界资源的进程的运行public void run2(ArrayList ready)for(int x =0;x=2;x+)/设置时间片为3ready.ge
12、t(0).run();/开始执行if(ready.get(0).getTime()=0)break; /是否应进入结束队列,从就绪队列中移除public void CheckEnd(ArrayList ready)for(int i=0;i0)System.out.println(test:checkblock);/当临界资源出现空闲时,可以从阻塞队列中移除,进入就绪队列。PCBready.add(blockQueue.get(0);blockQueue.remove(0);public void OutPut()System.out.println(就绪队列中有:+PCBready.size
13、();for(int i=0;iPCBready.size();i+)PCBready.get(i).getAll();System.out.println(阻塞队列中有:+blockQueue.size();for(int i=0;iblockQueue.size();i+)blockQueue.get(i).getAll();System.out.println(完成队列中有:+endQueue.size();for(int i=0;iendQueue.size();i+)endQueue.get(i).getAll();if(blockQueue.size()!=0)System.out
14、.println(是否需要从阻塞队列中唤醒进程(1.YES/ELSE.NO);int choose = sc.nextInt();if(choose=1)wakeUp();System.out.println(是否需要增加进程(1.YES/ELSE.NO);/加入的进程先放入后备队列。然后由后备队列自动的添加到就绪队列中int choose = sc.nextInt();if(choose =1)pi.PCBadd(poolQueue);public void wakeUp()System.out.println(请输入需要唤醒进程的ID号);int id = sc.nextInt();for
15、(int i=0;iblockQueue.size();i+)if(blockQueue.get(i).getPID()=id)for(int j=0;jPCBready.size();j+)if(PCBready.get(j).getUseSource()=true)PCBready.get(j).setUseSource(false);/解除j进程对临界资源占用。以便让i进程进入就绪队列PCBready.add(blockQueue.get(i);blockQueue.remove(i);package os_check_1;import java.util.ArrayList;publi
16、c class MainStore static ArrayList mainStore = new ArrayList();MainStore()for(int i=0;i10;i+) /设置主存大小为10.利用mainStore的大小表示主存。mainStore.add(0);/构造未分分区表。即设置所有的值为0。值为1代表该内存被占用。/得到某一块空闲分区的大小,并且占用。将其置1public void GetEmpty(PCB PCB)int first = 0;int last = 0;for(int i=0;i=PCB.getSize()PCB.setFirstIndex(firs
17、t);System.out.println(进程+PCB.getPID()+进入主存);PCB.setGetStore(true); else first = i;if(PCB.isGetStore()=true)int a = PCB.getFirstIndex();int b = PCB.getSize();for(;ab;a+)mainStore.set(a, 1);/将被使用的主存置1if(PCB.isGetStore()=false)System.out.println(内存不足+PCB.getPID()+进程将被移入外存);/释放空闲分区public void release(PC
18、B PCB)int a = PCB.getFirstIndex();int b = PCB.getSize();for(;ab;a+)mainStore.set(a, 0);System.out.println(进程+PCB.getPID()+释放内存+PCB.getSize();/内存不够时,移入外存。进入外存队列public void move(PCB PCB,ArrayList externStore,ArrayList PCBready)if(PCB.isGetStore()=false)externStore.add(PCB);PCBready.remove(PCB);/内存何时够用
19、public void check(ArrayList externStore,ArrayList PCBready)for(int i=0;iexternStore.size();i+)GetEmpty(externStore.get(i);/检查是否能够得到内存if(externStore.get(i).isGetStore()=true)/得到内存时PCBready.add(externStore.get(i);/将其再次加入就绪队列System.out.println(进程+PCBready.get(i).getPID()+从外存进入内存);public void show()Syst
20、em.out.println(主存使用情况为:);for(int i=0;i0)this.priority-;if(time0)this.time = time-1;/System.out.println(PID+:执行);public void getAll()System.out.println(PID:+PID+-+time+-+priority+-+source);package os_check_1;import java.util.ArrayList;import java.util.Scanner;public class PCBinit static ArrayList PCB
21、ready = new ArrayList();static ArrayList poolQueue = new ArrayList();Scanner sc = new Scanner(System.in);/初始化PCBinit()System.out.println(请输入进程的数目);int PCBnum = sc.nextInt();for(int i=0;iPCBnum;i+)PCBadd(PCBready);/在PCB队列中增加进程poolQueue();/初始化后备队列checkPCB(PCBready,poolQueue);sort(PCBready);/后备队列初始化pub
22、lic void poolQueue()System.out.println(请输入后备队列的数目);int poolnum = sc.nextInt();for(int i=0;ipoolnum;i+)PCBadd(poolQueue);/若内存中进程少于规定道数,可从后备队列中调度作业进入public void checkPCB(ArrayList ready,ArrayList pool)while(ready.size()0)ready.add(pool.get(0);System.out.println(从后备队列往就绪队列中加入进程);pool.get(0).getAll();po
23、ol.remove(0);/在队列中增加进程public void PCBadd(ArrayList arraylist)PCB p = new PCB();System.out.println(请输入进程名,运行时间,优先级,是否需要使用临界资源(1.YES/ELSE.NO),占用内存大小);p.setPID(sc.nextInt();p.setTime(sc.nextInt();p.setPriority(sc.nextInt();p.setState(0);if(sc.nextInt()=0)p.setSource(false);else p.setSource(true);p.setS
24、ize(sc.nextInt();arraylist.add(p);/优先级的排序public void sort(ArrayList arraylist)for(int i=0;iarraylist.size();i+)for(int j=i+1;jarraylist.size();j+)if(arraylist.get(i).getPriority()arraylist.get(j).getPriority()/根据冒泡法来优先级排序PCB temp = arraylist.get(i);arraylist.set(i, arraylist.get(j);arraylist.set(j, temp); /测试,显示public void display(ArrayList arraylist)for(int i=0;iarraylist.size();i+)arraylist.get(i).getAll();package os_check_1;import java.util.Scanner;public class Test public static void main(String args)CPU cpu = new CPU();专心-专注-专业