进程模拟调度时间片和优先级.docx
- 文档编号:929727
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:24
- 大小:108KB
进程模拟调度时间片和优先级.docx
《进程模拟调度时间片和优先级.docx》由会员分享,可在线阅读,更多相关《进程模拟调度时间片和优先级.docx(24页珍藏版)》请在冰点文库上搜索。
进程模拟调度时间片和优先级
仲恺农业工程学院
课程设计
进程调度模拟算法实现(优先数算法和时间片算法)
课程名称计算机系统开发综合训练
(2)
姓名杜松耀
院(系)信息科学与技术学院
专业班级计算机科学与技术121
学号201210214104
指导教师史婷婷
1需求分析3
2概要设计3
2.1实验原理3
2.2数据结构4
2.3算法描述4
2.4算法流程图5
3详细设计6
3.1源程序代码6
4调试分析16
5总结17
1需求分析
本实验完成的系统是进程调度模拟算法实现(优先数算法和时间片算法),进程是操作系统中最基本、最重要的概念,是在多道程序系统出现后,为了刻画系统内部的动态状况、描述运行程序的活动规律而引进的新概念,所有多道程序设计操作系统程序设计操作系统都建立在进程的基础上。
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程执行时的间断性,决定了进程可能具有多种状态。
事实上,运行中的进程可能具有三种基本状态,分别是:
就绪状态、运行状态、阻塞状态。
(本实验为了突出调度模拟算法的主题——优先数和时间片算法,所以没有引入阻塞状态,阻塞态是指进程不具备运行条件,正在等待某个事件完成的状态)
优先数调度算法根据确定的优先级来选取进程或线程,总是选择就绪队列中的优先级最高者投入运行。
在进程或线程的运行过程中,如果就绪队列中出现优先级更高的进程或线程,系统可预先规定策略:
非剥夺式或剥夺式(本实验采用剥夺式策略)。
时间片调度算法,具体做法是:
调度程序每次把CUP分配给就绪队列首进程或线程使用规定的时间间隔,称为时间片,就绪队列中的每个进程或线程轮转流地运行一个时间片,当时间片耗尽时,就强迫当前运行进程或线程让出处理器,转而排列到就绪队列尾部,等候下一轮调度。
本实验所需完成功能如下:
(1)、新建进程按顺序进入系统,系统按优先数由大到小排序;
(2)、进程优先数和完成任务所需时间,以及CPU分配给队列时间片大小由用户指定并输入;
(3)、每个进程在规定队列时间片内没完成任务时,插入就绪队列尾部;若完成任务,则撤销进程。
2概要设计
2.1实验原理
本实验完成进程调度模拟算法实现(优先数算法和时间片算法),首先用户通过界面显示输入时间片大小、进程优先数和进程所需完成时间,然后可以点击运行开始,也可以再多新建几个进程;开始运行后,界面显示运行结果,用户可以在运行时新建进程,也可以在运行后新建进程,进程通过剥夺式策略获得资源插入运行态或就绪队列,当所有进程都完成任务后,运行结束。
新建进程按优先数由大到小排序,加入就绪队列,运行时通过javax.swing.Timer实现时间片的消耗,当用户再次新建进程时,系统将根据优先数由大到小的顺序插入就绪队列中;若进程优先数最大,将剥夺正在运行中的进程资源,并马上运行;当所有进程都完成任务后,运行结束。
2.2数据结构
(1)、进程控制块数据结构以及图示如下所示:
classPCB{
privateintprocessID;//进程标识
privateintcompleteTimes;//进程完成任务所需时间
privateintpriority;//优先数大小
privatePCBnext;//指向后一节点指针
}
图2.2–1进程控制块数据结构
(2)、进程队列数据结构如下:
classList{
privatePCBhead;//头结点
privateinttimes;//时间片大小
}
图2.2–1进程队列数据结构
2.3算法描述
首先是界面显示,用户通过界面显示输入时间片大小、进程优先数和进程所需完成时间,然后可以点击运行开始,也可以再多新建几个进程;开始运行后,界面显示运行结果,用户可以在运行时新建进程,也可以在运行后新建进程,进程通过剥夺式策略获得资源插入运行态或就绪队列,当所有进程都完成任务后,运行结束。
2.4算法流程图
算法流程图如下图所示:
否
是是
否
图2.4–1算法流程图
3详细设计
3.1源程序代码
(1)、进程控制块:
classPCB{
privateintprocessID;//进程标识
privateintcompleteTimes;//进程完成任务所需时间
privateintpriority;//优先数大小
privatePCBnext;//指向后一节点指针
publicPCB(){
priority=0;
next=null;
}
publicPCB(intprocessID,intpriority){
this.processID=processID;
this.priority=priority;
this.next=null;
}
publicPCB(intpriority,PCBnext){
this.priority=priority;
this.next=next;
}
publicintgetCompleteTimes(){
returncompleteTimes;
}
publicvoidsetCompleteTimes(intcompleteTimes){
pleteTimes=completeTimes;
}
publicintgetPriority(){
returnpriority;
}
publicvoidsetPriority(intpriority){
this.priority=priority;
}
publicPCBgetNext(){
returnnext;
}
publicvoidsetNext(PCBnext){
this.next=next;
}
publicintgetprocessID(){
returnprocessID;
}
publicvoidsetProcessID(intprocessID){
this.processID=processID;
}
}
(2)、进程队列:
classList{
privatePCBhead;//头结点
privateinttimes;//时间片大小
publicList(){
head=newPCB();
}
publicvoidinsert(PCBp){//进程加入队列
PCBtemp=head;
while(head.getNext()!
=null){
head=head.getNext();
}
head.setNext(p);
head=temp;
}
publicvoiddelete(intprocessID){//撤销指定进程
PCBp=head;
while(p.getNext()!
=null){
if(p.getNext().getprocessID()==processID){
p.setNext(p.getNext().getNext());
}else{
p=p.getNext();
}
}
}
publicvoidsort(intflag){//对进程进行按优先数大小排序
PCBp1=head;
PCBp2=p1.getNext();
PCBtemp1,temp2;
intn1,n2;
while(p1.getNext()!
=null){
while(p2.getNext()!
=null){
if(flag==0){
n2=p1.getNext().getprocessID();
n1=p2.getNext().getprocessID();
}else{
n1=p1.getNext().getPriority();
n2=p2.getNext().getPriority();
}
if(n1 temp1=p1.getNext(); temp2=p2.getNext().getNext(); p1.setNext(p2.getNext()); p2.setNext(temp1); p1.getNext().setNext(temp1.getNext()); temp1.setNext(temp2); } if(p2.getNext()! =null){ p2=p2.getNext(); } } p1=p1.getNext(); if(p1.getNext()! =null){ p2=p1.getNext(); } } } publicPCBgetHead(){ returnhead; } publicvoidsetHead(PCBp){ head=p; } publicvoidsetTimes(inttimes){ this.times=times; } publicintgetTimes(){ returntimes; } } (3)、排序算法: publicvoidsort(intflag){//对进程进行按优先数大小排序 PCBp1=head; PCBp2=p1.getNext(); PCBtemp1,temp2; intn1,n2; while(p1.getNext()! =null){ while(p2.getNext()! =null){ if(flag==0){ n2=p1.getNext().getprocessID(); n1=p2.getNext().getprocessID(); }else{ n1=p1.getNext().getPriority(); n2=p2.getNext().getPriority(); } if(n1 temp1=p1.getNext(); temp2=p2.getNext().getNext(); p1.setNext(p2.getNext()); p2.setNext(temp1); p1.getNext().setNext(temp1.getNext()); temp1.setNext(temp2); } if(p2.getNext()! =null){ p2=p2.getNext(); } } p1=p1.getNext(); if(p1.getNext()! =null){ p2=p1.getNext(); } } } (4)、新建进程插入队列: publicvoidinsert(PCBp){//进程加入队列 PCBtemp=head; while(head.getNext()! =null){ head=head.getNext(); } head.setNext(p); head=temp; } (5)、删除在队列中的进程: publicvoiddelete(intprocessID){//撤销指定进程 PCBp=head; while(p.getNext()! =null){ if(p.getNext().getprocessID()==processID){ p.setNext(p.getNext().getNext()); }else{ p=p.getNext(); } } } (6)、新建进程: button1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ if(anotherTextField1.getText().trim().equals("")||anotherTextField2.getText().trim().equals("")||anotherTextField3.getText().trim().equals("")){ JOptionPane.showMessageDialog(null,"请同时设置优先数和时间片,如果不想设置,可输入0! "); }else{ Stringstr1=anotherTextField1.getText(); Stringstr2=""; Stringstr3=anotherTextField3.getText(); intn1=Integer.parseInt(str1); intn3=Integer.parseInt(str3); intn4; PCBp1=newPCB(); p1.setPriority(n1); p1.setCompleteTimes(n3); processID+=1; p1.setProcessID(processID); n4=p1.getprocessID(); list.insert(p1); if(sign==1){ try{ FileWriterwriter=newFileWriter(file,true); writer.write("("+p1.getprocessID()+": "+p1.getPriority()+","+p1.getCompleteTimes()+")"); writer.close(); }catch(IOExceptionev){ JOptionPane.showMessageDialog(null,"请同时设置优先数和时间片,如果不想设置,可输入0! "); } } if(sign==0){ try{ list.sort(0); PrintWriterpw=newPrintWriter(file); pw.println("进程进入就绪队列序列如下,表示方式为(进程标识: 优先数大小,完成任务所需时间): "); p1=list.getHead().getNext(); while(p1! =null){ pw.print("("+p1.getprocessID()+": "+p1.getPriority()+","+p1.getCompleteTimes()+")->"); p1=p1.getNext(); } pw.println("null"); list.sort (1); pw.println("\n"); pw.println("按优先数由大到小排序后如下,表示方式同上: "); p1=list.getHead().getNext(); while(p1! =null){ pw.print("("+p1.getprocessID()+": "+p1.getPriority()+","+p1.getCompleteTimes()+")->"); p1=p1.getNext(); } pw.println("null"); pw.println("\n"); pw.println(""+"进程队列所分配时间片大小为: "+list.getTimes()); pw.println("\n"); pw.println("\n"); pw.println(""+"运行时新建进程如下: "); pw.close(); }catch(IOExceptionee){ JOptionPane.showMessageDialog(null,"请同时设置优先数和时间片,如果不想设置,可输入0! "); } } list.sort (1); if(sign==0){ PCBp2=list.getHead().getNext(); while(p2! =null){ str2+=""+p2.getprocessID()+"->"; p2=p2.getNext(); } textField1.setText(str2+"null"); button2.setEnabled(true); anotherTextField1.setText(""); anotherTextField3.setText(""); }else{ anotherTextField1.setText(""); anotherTextField3.setText(""); timer.start(); } } } }); (7)、运行进程: button2.addActionListener(newActionListener(){//按钮(运行)的相应事件 publicvoidactionPerformed(ActionEvente){ sign=1; PCBp=list.getHead().getNext(); Stringstr=""; textField2.setText(""+p.getprocessID()); textField1.setText(""); p=p.getNext(); while(p! =null){ str+=""+p.getprocessID()+"->"; p=p.getNext(); } textField3.setText(str+"null"); button2.setEnabled(false); timer=newTimer(100,newActionListener(){ publicvoidactionPerformed(ActionEvente){ if(list.getHead().getNext()==null){ timer.stop(); }else{ PCBp1; intn; p1=list.getHead().getNext(); n=p1.getCompleteTimes()-1; count++; p1.setCompleteTimes(n); Stringstr2=anotherTextField2.getText(); intn2=Integer.parseInt(str2); list.setTimes(n2); anotherTextField2.setEditable(false); if((count%list.getTimes())==0){ if(p1.getCompleteTimes()>0){ list.getHead().setNext(p1.getNext()); p1.setNext(null); list.insert(p1); }else{ list.delete(p1.getprocessID()); } }else{ if(p1.getCompleteTimes()<=0){ list.delete(p1.getprocessID()); } } p1=list.getHead().getNext(); if(p1==null){ textField2.setText(""); textField3.setText("");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 模拟 调度 时间 优先级