




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中南大学操作系统实验报告姓名:学号:班级:进程模拟与主存分配回收一、实验内容1. 设计进程管理中数据结构的内容;2. 设计一个优先权调度算法,实现进程调度;3. 设计至少两个临界资源的同步管理模拟。4. 主存存储器空间的分配和回收二、实验目的a) 加深对进程概念及进程管理各部分内容的理解;b) 熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构和同步机构的实现过程。c) 帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收三、实验要求1. 最好采用图形界面;2. 可随时增加进程;3. 规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道数,可自动从后备队4. 列中调度作
2、业进入。被阻塞进程入阻塞队列,设置唤醒功能用于将指定阻塞进程唤醒进入就绪队列;5. 每次调度完成,显示各进程状态;6. 设置至少两个临界资源阻塞队列和公共变量,模拟同步过程;7. 设置时间片中断操作;8. 自行假设主存空间大小,预设操作系统所占大小并构造未分分区表。9. 采用最先适应算法分配主存空间10. 进程完成后,分配主存,并与相邻空闲分区合并。四、具体实现将实验一与实验二结合在一起。所以整合成了一分实验报告。 在这里统一给出自己实现的思想。1.流程图开始就绪队列外存队列内存是否够用阻塞队列临界可以使用是否完成释放资源部分进程进入就绪队列2. 关键代码:1. 利用冒泡法实现优先级的排序/优
3、先级的排序public void sort(ArrayList<PCB> arraylist)(for ( int i=0;i<arraylist.size();i+)for ( int j=i+1;j<arraylist.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);
4、)2. 自动从后备队列中往就绪队列中增加进程/若内存中进程少于规定道数,可从后备队列中调度作业进入 public void checkPCB(ArrayList<PCB> ready,ArrayList<PCB> pool)( while (ready.size()<4&&pool.size()>0) ready.add(pool.get(0);System. out .println( "从后备队列往就绪队列中加入进程”);pool.get(0).getAll(); pool.remove(0); ) )3. 内存不够时,移入外存
5、队列public void move(PCB PCB,ArrayList externStore,ArrayListPCBready)if (PCB.isGetStore()= false ) externStore.add(PCB); PCBready.remove(PCB); ) )五、实验总结1. 通过此次实验,对于操作系统的模拟有了更深的理解。进程的调度,在开始做第一个 实验时,由于设计上的漏洞,导致临界资源一直被占用,结果造成了死锁。在实践中,更加 理解了死锁的涵义。同时,也提醒着自己要不断的总结,注意数据结构方面的设计问题。2. 对于实验内容的理解,我在这方面产生了点困难。刚开始,
6、不知道如何来模拟临界资 源。在请教了老师之后,慢慢开始摸索。3.,接触到第二个实验,对于主存空间的模拟又产生了困难。不知道该用什么来模拟。最终采用了投机取巧的方式。用了ArrayList.这样,就不用担心主存的回收问题了。但是这样,不太符合实际情况。六、源代码package os_check_1;import java.util.ArrayList;import java.util.Scanner;public class CPU static boolean source = false;static ArrayList<PCB> PCBready = new ArrayList
7、<PCB>();/ 这里才是真正的就绪队列static ArrayList<PCB> poolQueue = new ArrayList<PCB>();/ 后备队列static ArrayList<PCB> blockQueue = new ArrayList<PCB>();/阻塞队列static ArrayList<PCB> endQueue = new ArrayList<PCB>();/ 结束队列static ArrayList<PCB> externStore = new ArrayList
8、<PCB>();/ 放入外存的队列 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);CheckBlock();OutPut();ms.show();pi.
9、checkPCB(PCBready, poolQueue);pi.sort(PCBready);/对可能发生的就绪队列进行优先级排序System.out.println("*longxiao*");剩余运行的时间public int time()int time = 0;for(int i=0;i<PCBready.size();i+)/ 改变时间。time= time+PCBready.get(i).getTime();return time;/从就绪队列中调入优先级最高的运行。public void CPUuse(ArrayList<PCB> read
10、y)if(ready.size()>0)ready.get(0).setState(1);/W 状态设置为运行状态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)(/ 临界资源没有被使用runl(ready);System.out.println("进程”+ready.get(0).getPID()+”执行"
11、;);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
12、<PCB> ready)for(int x =0;x<=2;x+)/ 设置时间片为 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()+"占用");不需要临界资源的进程的运行
13、public void run2(ArrayList<PCB> ready)for(int x =0;x<=2;x+)/ 设置时间片为 3ready.get(0).run();/ 开始执行if(ready.get(0).getTime()=0)(break;是否应进入结束队列,从就绪队列中移除public void CheckEnd(ArrayList<PCB> ready)(for(int i=0;i<ready.size();i+)if(ready.get(i).getTime()=0)(ms.release(ready.get(i);/释放所正在使用的
14、内存 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);/判断阻塞队列中是否能够进入就绪队列/前提是占用临界资源的那个进程已经结束pu
15、blic void CheckBlock()pi.sort(blockQueue);/对阻塞队列中的进程进行优先级排序if(source = false&&blockQueue.size()>0)System.out.println("test : checkblock");/当临界资源出现空闲时,可以从阻塞队列中移除,进入就绪队列。PCBready.add(blockQueue.get(0);blockQueue.remove(0);public void OutPut()System.out.println("就绪队列中有:"+
16、PCBready.size();for(int i=0;i<PCBready.size();i+)PCBready.get(i).getAll();System.out.println("阻塞队列中有:"+blockQueue.size();for(int i=0;i<blockQueue.size();i+)blockQueue.get(i).getAll();System.out.println("完成队列中有:"+endQueue.size();for(int i=0;i<endQueue.size();i+)endQueue.g
17、et(i).getAll();if(blockQueue.size()!=0)System.out.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 v
18、oid wakeUp()System.out.println("请输入需要唤醒进程的ID号");int id = sc.nextInt();for(int i=0;i<blockQueue.size();i+)if(blockQueue.get(i).getPID()=id)for(int j=0;j<PCBready.size();j+)if(PCBready.get(j).getUseSource()=true)PCBready.get(j).setUseSource(false);/ 解除 j 进程对临界资源占 用。以便让i进程进入就绪队列PCBready
19、.add(blockQueue.get(i);blockQueue.remove(i);package os_check_1;import java.util.ArrayList;public class MainStore static ArrayList<Integer> mainStore = new ArrayList<Integer>();MainStore()for(int i=0;i<10;i+) / 设置主存大小为10.利用mainStore的大小表示主存。mainStore.add(0);/构造未分分区表。即设置所有的值为0。值为1代表该内存被占
20、用。得到某一块空闲分区的大小,并且占用。将其置 1public void GetEmpty(PCB PCB)int first = 0;int last = 0;for(int i=0;i<mainStore.size();i+) last+;if(mainStore.get(i)=1|i=mainStore.size()-1)if(last-first>=PCB.getSize()PCB.setFirstlndex(first);System.out.println("进程"+PCB.getPID()+"进入主存");PCB.setGetS
21、tore(true); else first = i; if(PCB.isGetStore()=true)int a = PCB.getFirstIndex();int b = PCB.getSize();for(;a<b;a+)mainStore.set(a, 1);/将被使用的主存置1if(PCB.isGetStore()=false)System.out.println("内存不足"+PCB.getPID()+"进程将被移入外存"); 释放空闲分区public void release(PCB PCB)(int a = PCB.getFirs
22、tIndex();int b = PCB.getSize();for(;a<b;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);内存何时够用pub
23、lic void check(ArrayList<PCB> externStore,ArrayList<PCB> PCBready)for(int i=0;i<externStore.size();i+)GetEmpty(externStore.get(i);/ 检查是否能够得到内存if(externStore.get(i).isGetStore()=true)/ 得到内存时PCBready.add(externStore.get(i);/ 将其再次加入就绪队列System.out.println("进程"+PCBready.get(i).ge
24、tPID()+"从外存进入内存");public void show()System.out.println(”主存使用情况为:");for(int i=0;i<mainStore.size();i+)System.out.print(mainStore.get(i);System.out.println();package os_check_1;public class PCB private int PID;/ID 号private int time;/ 一共所需的运行时间private int priority;/ 优先级private int sta
25、te =0;/ 状态/ 0-就绪1-执行private boolean source = false;/ 占用的临界资源 private boolean useSource = false;/主存空间的分配和回收部分private int Size;private int firstIndex;private boolean getStore = false;public boolean isGetStore() return getStore;public void setGetStore(boolean getStore) this.getStore = getStore;public i
26、nt getSize() return Size;public void setSize(int size) Size = size;public int getFirstIndex() return firstIndex;public void setFirstIndex(int firstIndex) this.firstIndex = firstIndex;public int getPID() return PID;public void setPID(int pID) PID = pID;public int getTime() return time;public void set
27、Time(int time) this.time = time;public int getPriority() return priority;public void setPriority(int priority) this.priority = priority;public int getState() (return state;public void setState(int state) (this.state = state;public boolean getSource() (return source;public void setSource(boolean sour
28、ce) (this.source = source;public boolean getUseSource() (return useSource;public void setUseSource(boolean useSource) (this.useSource = useSource;public void run()(if(priority>0)this.priority-;if(time>0)this.time = time-1;/System.out.println(PID+”:执行");public void getAll()System.out.print
29、ln("PID : "+PID+"-"+time+"-"+priority+"-"+source);package os_check_1;import java.util.ArrayList;import java.util.Scanner;public class PCBinit static ArrayList<PCB> PCBready = new ArrayList<PCB>();static ArrayList<PCB> poolQueue = new ArrayLis
30、t<PCB>();Scanner sc = new Scanner(System.in);/初始化PCBinit()(System.out.println("请输入进程的数目");int PCBnum = sc.nextInt();for(int i=0;i<PCBnum;i+)PCBadd(PCBready);/在PCB队列中增加进程poolQueue();/初始化后备队列checkPCB(PCBready,poolQueue);sort(PCBready);后备队列初始化public void poolQueue()System.out.println("请输入后备队列的数目");int poolnum = sc.nextInt();for(int i=0;i<poolnum;i+)PCBadd(poolQueue);若内存中进程少于规定道数,可从后备队列中调度作业进入public void checkPCB(ArrayList<PCB> ready,ArrayList<PCB> pool
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏造价员考试题及答案
- 工厂数字化展厅触摸屏展示方案
- 建筑业时政考试题及答案
- 数据分析驱动的展示内容优化方案
- 宠物美容师员工合同7篇
- 危险源识别在建筑装修工程中的应用
- 桥梁工程现场施工质量控制方案
- 电气工程技术交底文档标准范本
- 工商业储能项目信息化管理方案
- 给水工程考试试题及答案
- 电商企业考勤管理制度
- 《WPS AI智能办公应用大全》全套教学课件
- 2024年湖北省科学技术馆度招聘真题
- 医院科室奖罚管理办法
- 《习作:缩写故事》教学课件
- 2025年5月24日福建省税务遴选笔试真题及解析
- 延缓慢性肾脏病进展临床管理指南(2025年)解读课件
- 钻芯法检测混凝土强度技术规程JGJ-T384-2024
- 公司保密培训课件下载
- 人货场的培训课件
- 图书馆寻宝活动方案
评论
0/150
提交评论