欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    中南大学操作系统实验报告(共14页).doc

    • 资源ID:8604840       资源大小:194KB        全文页数:14页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    中南大学操作系统实验报告(共14页).doc

    精选优质文档-倾情为你奉上中南大学操作系统实验报告姓名: 学号: 班级: 进程模拟与主存分配回收一、 实验内容1.设计进程管理中数据结构的内容;2.设计一个优先权调度算法,实现进程调度;3.设计至少两个临界资源的同步管理模拟。4.主存存储器空间的分配和回收二、 实验目的a) 加深对进程概念及进程管理各部分内容的理解;b) 熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构和同步机构的实现过程。c) 帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收三、 实验要求1.最好采用图形界面;2.可随时增加进程;3.规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道数,可自动从后备队4.列中调度作业进入。被阻塞进程入阻塞队列,设置唤醒功能用于将指定阻塞进程唤醒进入就绪队列;5.每次调度完成,显示各进程状态;6.设置至少两个临界资源阻塞队列和公共变量,模拟同步过程;7.设置时间片中断操作;8.自行假设主存空间大小,预设操作系统所占大小并构造未分分区表。9.采用最先适应算法分配主存空间10.进程完成后,分配主存,并与相邻空闲分区合并。四、 具体实现将实验一与实验二结合在一起。所以整合成了一分实验报告。在这里统一给出自己实现的思想。1. 流程图2.关键代码:1. 利用冒泡法实现优先级的排序/优先级的排序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);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. 内存不够时,移入外存队列public void move(PCB PCB,ArrayList externStore,ArrayList PCBready)if(PCB.isGetStore()=false)externStore.add(PCB);PCBready.remove(PCB);五、 实验总结1.通过此次实验,对于操作系统的模拟有了更深的理解。进程的调度,在开始做第一个实验时,由于设计上的漏洞,导致临界资源一直被占用,结果造成了死锁。在实践中,更加理解了死锁的涵义。同时,也提醒着自己要不断的总结,注意数据结构方面的设计问题。2.对于实验内容的理解,我在这方面产生了点困难。刚开始,不知道如何来模拟临界资源。在请教了老师之后,慢慢开始摸索。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<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<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.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> 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()+"执行");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<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()+"占用");/不需要临界资源的进程的运行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);/释放所正在使用的内存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);/判断阻塞队列中是否能够进入就绪队列/前提是占用临界资源的那个进程已经结束public 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("就绪队列中有:"+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.get(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 void 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.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代表该内存被占用。/得到某一块空闲分区的大小,并且占用。将其置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.setFirstIndex(first);System.out.println("进程"+PCB.getPID()+"进入主存");PCB.setGetStore(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.getFirstIndex();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);/内存何时够用public 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).getPID()+"从外存进入内存");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 state =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 int 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 setTime(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 source) 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.println("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 ArrayList<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)while(ready.size()<4&&pool.size()>0)ready.add(pool.get(0);System.out.println("从后备队列往就绪队列中加入进程");pool.get(0).getAll();pool.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.setSize(sc.nextInt();arraylist.add(p);/优先级的排序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); /测试,显示public void display(ArrayList<PCB> arraylist)for(int i=0;i<arraylist.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();专心-专注-专业

    注意事项

    本文(中南大学操作系统实验报告(共14页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开