操作系统实验报告 进程管理 java编写相关的界面.docx
《操作系统实验报告 进程管理 java编写相关的界面.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 进程管理 java编写相关的界面.docx(16页珍藏版)》请在冰豆网上搜索。
![操作系统实验报告 进程管理 java编写相关的界面.docx](https://file1.bdocx.com/fileroot1/2023-2/23/01ccda9a-7263-48ad-89da-3fb95e3a0d23/01ccda9a-7263-48ad-89da-3fb95e3a0d231.gif)
操作系统实验报告进程管理java编写相关的界面
操作系统实验报告
计算机学院(院、系)专业班组课
学号20姓名Tracy实验日期教师评定
实验一进程管理
一、实验目的
通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。
基本能达到下列具体的目标:
1.理解进程PCB的概念,以及PCB如何实现、如何组织以及管理。
2.复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实现进程的管理。
二、实验内容
1、建立一个结点,即PCB块包括用户标识域、状态域(执行、等待、就绪)、link域。
2、建立三个队列(执行队列、就绪队列、等待队列)。
3、根据进程状态转换实现对三个队列的具体操作。
具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换
4、用java编写相关的界面。
三、实验步骤
1.通过java的awt和swing包进行相关界面的布局,相关代码为:
Panelp1=newPanel(newFlowLayout(FlowLayout.LEFT));
Panelp2=newPanel(newFlowLayout());
//三个显示进程的文本框
JTextFieldreadyList,runningList,waitingList,input;
//三个进程的链表
ArrayListreList=newArrayList();
ArrayListruList=newArrayList();
ArrayListwaList=newArrayList();
IteratoriterRunning,iterReady,iterWaiting;
publicMyFrame(){
this.setLayout(newBorderLayout());
this.add(p1,BorderLayout.NORTH);
this.add(p2,BorderLayout.CENTER);
init();
this.setTitle("进程三态转换");
setBounds(300,300,500,300);
setVisible(true);
}
voidinit(){
Boxbox1=Box.createHorizontalBox();
box1.add(newJLabel("进程就绪队列:
"));
readyList=newJTextField(35);
readyList.setEditable(false);
box1.add(readyList);
Boxbox2=Box.createHorizontalBox();
box2.add(newJLabel("进程阻塞队列:
"));
waitingList=newJTextField(35);
waitingList.setEditable(false);
box2.add(waitingList);
Boxbox3=Box.createHorizontalBox();
box3.add(newJLabel("进程运行队列:
"));
runningList=newJTextField(35);
runningList.setEditable(false);
box3.add(runningList);
BoxbaseBox1=Box.createVerticalBox();
baseBox1.add(box1);
baseBox1.add(Box.createVerticalStrut(10));
baseBox1.add(box2);
baseBox1.add(Box.createVerticalStrut(10));
baseBox1.add(box3);
p1.add(baseBox1);
Buttonb1=newButton("执行—>就绪");
Buttonb2=newButton("就绪—>执行");
Buttonb3=newButton("执行—>阻塞");
Buttonb4=newButton("阻塞—>就绪");
Buttonexit=newButton("清空所有进程");
this.add(exit,BorderLayout.SOUTH);
b1.addActionListener(newreadyListener());
b2.addActionListener(newrunningListener());
b3.addActionListener(newwaitingListener());
b4.addActionListener(newready2Listener());
exit.addActionListener(newclearListener());
Boxbox4=Box.createHorizontalBox();
box4.add(b1);
box4.add(b2);
Boxbox5=Box.createHorizontalBox();
box5.add(b3);
box5.add(b4);
Boxbox6=Box.createHorizontalBox();
input=newJTextField(20);
input.addActionListener(newinputListener());
box6.add(newLabel("请输入进程名字,按回车确认"));
box6.add(input);
BoxbaseBox2=Box.createVerticalBox();
baseBox2.add(box6);
baseBox2.add(Box.createVerticalStrut(10));
baseBox2.add(box4);
baseBox2.add(Box.createVerticalStrut(10));
baseBox2.add(box5);
p2.add(baseBox2);
}
运行的总体界面如下图所示:
图1总体布局
2.分别为“执行—》就绪”,“就绪—》执行”,“执行—》阻塞”,“阻塞—》就绪”四个按钮添加监听器,监听队列的三种状态。
输入进程也要相关的监听器。
输入进程名字的监听器主要代码:
classinputListenerimplementsActionListener{
Strings="";
publicvoidactionPerformed(ActionEvente){
if(input.getText().equals("")){
JOptionPane.showMessageDialog(null,"请输入进程名字","警告对话框",
JOptionPane.WARNING_MESSAGE);
}else{
ProcessnewPro=newProcess();
newPro.setName(input.getText());
reList.add(newPro);//把输入的进程放进就绪队列
s=readyList.getText();
readyList.setText(s+newPro.getName()+"");
input.setText("");
}
}
}
当输入的进程名字为空时,弹出警告输入框:
图2进程名字不能为空
输入正确显示在就绪队列中(名字分别为:
“第一个进程”,“第二个进程”,第三个进程):
图3输入三个进程后
就绪到执行状态的监听器主要代码:
classrunningListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
iterReady=reList.iterator();
iterRunning=ruList.iterator();
Strings="";
if(iterReady.hasNext()){
//当就绪进程不为空而且没有进程运行时
if(iterRunning.hasNext()==false){
//把就绪的第一个进程变为运行状态
ProcessnewPro=reList.remove(0);
ruList.add(newPro);
runningList.setText(newPro.getName());
//重新输出就绪状态
iterReady=reList.iterator();
while(iterReady.hasNext()){
ProcessPro=iterReady.next();
s=s.concat(Pro.getName()).concat("");
}
readyList.setText(s);
}else{
JOptionPane.showMessageDialog(null,"已有进程运行中',不能进行该操作",
"警告对话框",JOptionPane.WARNING_MESSAGE);
}
}else{
JOptionPane.showMessageDialog(null,"没有任何进程在'就绪队列中',不能进行该操作",
"警告对话框",JOptionPane.WARNING_MESSAGE);
}
}
}
当就绪队列为空时:
图4就绪态没有任何进程
就绪队列有进程时,单机“就绪—》执行”按钮:
图5就绪—》执行
当有进程在运行时:
图6已有进程运行
执行到阻塞状态的监听器主要代码:
classwaitingListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
iterRunning=ruList.iterator();
iterWaiting=waList.iterator();
if(iterRunning.hasNext()==false){
JOptionPane.showMessageDialog(null,"没有正在执行的进程","警告对话框",
JOptionPane.WARNING_MESSAGE);
}else{
ProcessnewPro=ruList.remove(0);
waList.add(newPro);
runningList.setText("");
//重新读取阻塞的进程
iterWaiting=waList.iterator();
Strings="";
while(iterWaiting.hasNext()){
ProcessPro=iterWaiting.next();
s=s.concat(Pro.getName()).concat("");
}
waitingList.setText(s);
}
}
}
执行队列有进程执行是,单击“执行—》阻塞”:
图7执行到阻塞状态
执行队列没进程,弹出警告对话框:
图8没有进程执行
执行到就绪态监听器主要代码:
classreadyListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
iterRunning=ruList.iterator();
iterReady=reList.iterator();
if(iterRunning.hasNext()==false){
JOptionPane.showMessageDialog(null,"没有正在执行的进程","警告对话框",
JOptionPane.WARNING_MESSAGE);
}else{
ProcessnewPro=ruList.remove(0);
reList.add(newPro);
runningList.setText("");
//重新读取就绪的进程
iterReady=reList.iterator();
Strings="";
while(iterReady.hasNext()){
ProcessPro=iterReady.next();
s=s.concat(Pro.getName()).concat("");
}
readyList.setText(s);
}
}
}
没有进程在执行,弹出警告对话框:
图9没有进程执行
执行队列有进程执行是,单击“执行—》就绪”:
图10执行到就绪
阻塞到就绪态监听器主要代码:
classready2ListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
iterReady=reList.iterator();
iterWaiting=waList.iterator();
if(iterWaiting.hasNext()==false){
JOptionPane.showMessageDialog(null,"没有阻塞的进程","警告对话框",
JOptionPane.WARNING_MESSAGE);
}else{
ProcessnewPro=waList.remove(0);
reList.add(newPro);
//重新读取阻塞的进程
iterWaiting=waList.iterator();
Strings="";
while(iterWaiting.hasNext()){
ProcessPro=iterWaiting.next();
s=s.concat(Pro.getName()).concat("");
}
waitingList.setText(s);
//重新读取就绪的进程
iterReady=reList.iterator();
Stringt="";
while(iterReady.hasNext()){
ProcessPro=iterReady.next();
t=t.concat(Pro.getName()).concat("");
}
readyList.setText(t);
}
}
}
当有进程阻塞时,单击“阻塞—》就绪“按钮:
图11阻塞到就绪
清空所有进程监听器代码:
图12清空所有进程
四、实验总结
本次实验通过用java的链表来表示进程的状态,程序中分别用三个不同的链表来表示“就绪“、”执行“、”阻塞“的三种状态。
当有状态转换时,就把相应链表中的第一个对象去除,再在另外的链表中增加去除的对象,这样就相当于状态的转换。
实验通过java的相关包来进行布局,使程序更加人性话与直观化,状态的转移通过不同的监听器而来实现。
通过本次实验,我更加加深了对增加链表、增加节点、删除节点方面的印象,并且掌握了进程不同状态转换的实质。