操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
操作系统课程设计报告
项目名称:
临界区资源模拟
小组成员:
AAA
BBB
CCC
DDD
年级专业:
11级计算机科学与技术
日期:
2014年3月12日
一需求分析
建立三个进程,模拟进入临界区,然后用一个进程进行管理。
设计技术参数:
1 实现wait、signal原语
2 产生3个进程,两个进程模拟需要进入临界区的用户进程。
当需要进入临界区时,显示:
“进程x请求进入临界区…”,同时向管理进程提出申请;
申请返回,表示进入了临界区。
在临界区中等待一段随机时间,并显示:
“进程x正在临界区…”;
当时间结束,显示:
“进程x退出临界区…”,同时向管理进程提出退出申请;
当申请返回,显示:
“进程x已退出临界区。
”
3 一个进程作为原语的管理进程,接受其他进程的临界区进入请求:
如果允许进入,则根据wait原语的操作步骤设置相应变量,然后返回;
如果不允许进入,则进入循环等待,直到允许为止;
退出时模拟signal操作。
4 进程间通信可以采用信号、消息传递、管道或网络通信方式。
二分析过程
本实验主要分为以下几个部分:
①进程的创建:
编写两个用户进程模拟需要进入临界区,同时还需编写一个进程作为原语的管理进程,其负责管理两个用户进程的进入。
②设计临界区及进程管理模块,让用户进程在其中访问时遵循空闲让进、忙则等待、有限等待、让权等待的准则。
③通信块及临界资源的设计,两个进程模拟用户进程进行通信。
④界面的设计
三开发过程
1.进程执行的间断性决定了进程可能具有多种状态,进程的状态反映进程执行的变化。
这些状态随着进程的执行和外界条件发生变化和转换。
对于处于就绪状态的进程,在调度程序为之分配处理机之后,该进程便可执行,相应地,他就由就绪状态转换执行状态。
正在执行的进程也称为当前进程,如果因为分配给它的时间片已经用完而被暂停执行,该进程便由执行状态回到了就绪状态;如果因为发生了某件事情而使进程执行受阻,使之无法继续执行,该进程便由执行状态变为阻塞状态。
下图给出了进程的三种基本状态以及各状态之间的转换关系。
2.Java实现
Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。
Java的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。
Java语言里,线程表现为线程类。
Thread()线程类封装了所有需要的线程操作控制。
在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。
在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。
线程类是控制线程行为的唯一的手段。
一旦一个Java程序启动后,就已经有一个线程在运行。
可通过调用Thread().currentThread()方法来查看当前运行的是哪一个线程。
3.唤醒原语
当等待队列中的进程所等待的事件发生时,等待该事件的所有进程都将被唤醒。
显然,一个处于阻塞状态的进程不可能自己唤醒自己,唤醒一个进程有两种方法:
一种是由系统进程唤醒。
另一种是由事件发生进程唤醒。
当由系统进程唤醒等待进程时,系统进程统一控制事件的发生并将“事件发生”这一消息通知等待进程。
从而使得该进程因等待事件已发生而进入就绪队列。
等待进程也可由事件发生进唤醒。
由事件发生进程唤醒时,事件发生进程和被唤醒进程之间是合作关系。
因此,唤醒原语既可被系统进程调用,也可被事件发生进程调用。
我们称调用唤醒原语的进程为唤醒进程。
唤醒原语首先将被唤醒进程从相应的等待队列中摘下,将被唤醒进程置为就绪状态之后,送入就绪队列。
在把被唤醒进程送入就绪队列之后,唤醒原语既可以返回原调用程序,也可以转向进程调度,以便让调度程序有机会选择一个合适的进程执行。
4.程序流程图
四测试过程
1.程序开始界面
2.输入两个进程分别命名为11和22,然后开始测试
3.查看作者
4.保存文件,并命名为:
“临界资源模拟”,系统将生成名为“临界资源模拟”的word文件。
5.打开“临界资源模拟.doc”。
五小组人员分工
AAA:
临界资源设计、核查并完善课程设计报告
BBB:
图形界面设计、对所有程序进行整合、书写课程设计报告
CCC:
管理进程的设计、核查并完善课程设计报告
DDD:
临界区及进程管理模块设计、核查并完善课程设计报告
六总结
通过本次的操作系统课程设计,我最大的体会就是我们不仅要熟练地掌握书本上的知识,更重要的是能够把学到的知识应用到上机编程中,这样才能算是真正学会了书本上所讲的知识。
在编写代码的过程中,我遇到了很多困难,比如图形界面的设计、鼠标触发和管理进程的设计等就花费了很多时间翻看资料,不过看着凭借自己的努力做出来的成果,一切努力都是值得的。
通过做这次课程设计,我对Java也有了进一步地了解,特别对部件的布局更熟练了。
我想,学习是个持之以恒的过程,如果真正想学好Java以及操作系统的话,光靠课程设计的时间是远远不够的,所以以后我一定要加强学习,坚持不懈,一切努力都是值得的。
七参考文献
1.雍俊海编著.《Java程序设计教程》(第二版)--北京:
清华大学出版社,2007.07
2.汤小丹、梁红兵等编著.《计算机操作系统》(第三版)--西安电子科技大学出版社,2007.02
3.张芬丽、刘昕等编著.《操作系统实验教程及Linux和Windows系统调用编程》—北京:
清华大学出版社,2010,08
4.网上搜索相关代码
八、程序源代码
①第一个java文件:
MainFrame.java
//界面设计
importjava.awt.Color;
importjava.awt.FlowLayout;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.BufferedWriter;
importjava.io.FileWriter;
importjava.io.IOException;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFileChooser;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
publicclassMainFrame
{
privatestaticfinallongserialVersionUID=1L;
privateJFrameframe=newJFrame("临界区资源模拟");
privateJPanelimagePanel;
ImageIconbackground;
staticJButtonb=newJButton("开始测试");
ImageIconimagea=newImageIcon("a.gif");
ImageIconimageb=newImageIcon("2.gif");
staticJTextFieldjf[]=newJTextField[2];//单行文本框
ThreadShowts=newThreadShow();//临界资源模拟
JTextAreaja=newJTextArea(null,20,40);//多行文本框,用于显示实验结果
JTextAreaje=newJTextArea(null,1,17);//为了界面美观添加的隐形文本框
JTextAreajg=newJTextArea(null,2,70);
JTextAreaji=newJTextArea(null,1,20);
publicMainFrame()
{
background=newImageIcon("4.jpg");
JLabellabel=newJLabel(background);//把背景图片显示在一个标签里面
label.setBounds(0,0,background.getIconWidth(),background.getIconHeight());//把标签的大小位置设置为图片刚好填充整个面板
imagePanel=(JPanel)frame.getContentPane();//把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
imagePanel.setOpaque(false);//设置内容窗格透明
imagePanel.setLayout(newFlowLayout());//设置流式布局
JLabelcLabel=newJLabel(imagea,JLabel.LEFT);
imagePanel.add(cLabel);
StringS[]={"进程1的名称:
",null,"进程2的名称:
"};
JLabelaLabel=newJLabel(S[0],null,JLabel.CENTER);
aLabel.setFont(newFont("宋体",Font.BOLD,15));//设置字体,宋体,15号
aLabel.setForeground(Color.GREEN);//字体颜色为红色
imagePanel.add(aLabel);//将标签加到面板中
jf[0]=newJTextField(null,10);
jf[0].setText("");
imagePanel.add(jf[0]);//添加单行文本框,用于用户进程的输入
JButtonplays=newJButton("刷新");
imagePanel.add(plays);
plays.setFont(newFont("宋体",Font.BOLD,15));
plays.setForeground(Color.RED);
JButtonb2=newJButton("查看作者");
imagePanel.add(b2);
b2.setFont(newFont("宋体",Font.BOLD,15));
b2.setForeground(Color.RED);
imagePanel.add(je);//*为了界面美观添加的隐形文本框,以下带有*注释的一样
je.setEditable(false);
je.setOpaque(false);
JLabelbLabel=newJLabel(S[2],null,JLabel.CENTER);
bLabel.setFont(newFont("宋体",Font.BOLD,15));
bLabel.setForeground(Color.GREEN);
imagePanel.add(bLabel);
jf[1]=newJTextField(null,10);
jf[1].setText("");
imagePanel.add(jf[1]);
imagePanel.add(b);//添加按钮
b.setFont(newFont("宋体",Font.BOLD,15));
b.setForeground(Color.RED);
b.addActionListener(newActionListener()//为"开始测试"按钮添加触发事件
{
publicvoidactionPerformed(ActionEvente)
{
ja.setText(null);
b.setEnabled(false);
jf[0].setEditable(false);
jf[1].setEditable(false);
ts.run(jf[0].getText().trim(),jf[1].getText().trim(),ja);//调用ThreadShow.run(,,);成员方法实现模拟
}//trim()的作用是:
去掉字符串左右的空格
});
JButtonc=newJButton("保存结果");
imagePanel.add(c);
c.setFont(newFont("宋体",Font.BOLD,15));
c.setForeground(Color.RED);
c.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)//为"保存结果"按钮添加触发事件
{
try
{
JFileChooserf=newJFileChooser();
f.showSaveDialog(frame);
Stringfilename=f.getSelectedFile().getAbsolutePath().trim();
FileWriterx=newFileWriter(filename+".doc");
newBufferedWriter(x);
StringsaveString=ja.getText().replaceAll("\n","\r\n");
x.write(saveString);//写
x.flush();//强制显示
x.close();//关闭输出流
JOptionPane.showMessageDialog(null,"保存成功!
",null,JOptionPane.PLAIN_MESSAGE);
}
catch(IOExceptionioe)
{
JOptionPane.showMessageDialog(null,"保存失败!
",null,JOptionPane.PLAIN_MESSAGE);
}
}
});
b2.addActionListener(newActionListener()//为"查看作者"按钮添加触发事件
{
publicvoidactionPerformed(ActionEvente)
{
JOptionPane.showMessageDialog(null,"AAA、BBB、CCC、DDD","作者",JOptionPane.INFORMATION_MESSAGE);
}
});
plays.addActionListener(newActionListener()//为"查看作者"按钮添加触发事件
{
publicvoidactionPerformed(ActionEvente)
{
ja.setText(null);
jf[0].setText("");
jf[0].setEditable(true);
jf[1].setText("");
jf[1].setEditable(true);
}
});
ji.setBackground(Color.blue);
imagePanel.add(jg);//*
jg.setEditable(false);
jg.setOpaque(false);
JLabeldLabel=newJLabel(imageb,JLabel.LEFT);//添加图片
imagePanel.add(dLabel);
ja.setFont(newFont("宋体",Font.BOLD,15));
ja.setDisabledTextColor(Color.YELLOW);
ja.setOpaque(false);
ja.setEditable(false);
//JScrollPanejs=newJScrollPane(ja,
//ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
//ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);//添加滚动条
imagePanel.add(ja);//添加多行文本框并设置相关属性
frame.getLayeredPane().setLayout(null);
frame.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE));//把背景图片添加到窗格的最底层
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭框架的行为属性
frame.setLocation(100,5);//窗口位置
frame.setSize(830,710);//窗口大小
frame.setResizable(false);//窗口大小固定
frame.setVisible(true);//设置可见
}
publicstaticvoidmain(String[]args)
{
newMainFrame();
}
}
②第二个java文件:
ThreadManager.java
//临界区及进程管理模块
importjava.util.Vector;
importjavax.swing.JOptionPane;
classThreadManagerimplementsRunnable//指向要管理的临界资源
{
ThingSomeobj;//临界资源
staticbooleanjud=false;//记录临界资源的使用情况
Vectorvec=newVector();//向量,数据元素为线程
publicThreadManager(ThingSomets){
obj=ts;
}
publicvoidrun()
{
while(vec.size()!
=0)
{
for(inti=0;i{
if(!
(vec.get(i)).isAlive())//如果用户进程运行结束
{
(vec.get(i)).interrupt();//使被阻塞的用户进程抛出一个中断异常,从而使进程提前结束阻塞状态
vec.remove(i);//删除用户进程i
}
}
try{
Thread.sleep(100);//模拟进程运行一段时间
}
catch(InterruptedExceptione){
e.printStackTrace();
}
}
JOptionPane.showMessageDialog(null,"模拟成功!
",null,JOptionPane.INFORMATION_MESSAGE);//进程运行结束窗口
MainFrame.b.setEnabled(true);//控件可用
}
publicvoidaddThreadUser(ThreadUseruser)
{
vec.add(user);//将用户进程添加到向量中
}
@SuppressWarnings("static-access")
publicvoidtake(Threaduser)//进程控制块
{
System.out.println("进程"+user.getName()+"请求资源.....");
obj.jta.append("进程"+user.getName()+"请求资源.....\n");
while(jud)//如果jud为true,表示有进程正在使用资源,否则相反
{
try{
System.out.println("进程"+user.getName()+"等待资源.....");
obj.jta.append("进程"+user.getName()+"等待资源.....\n");
synchronized(obj){
obj.wait();//进入资源的等待池中,等待被唤醒
}
}
catch(InterruptedExceptione){
e.printStackTrace();
}
}
jud=true;//关锁
System.out.println("进程"+user.getName()+"进入临界区");
obj.jta.append("进程"+user.getName()+"进入临界区\n");
obj.useing(user);//使用资源
System.out.println("进程"+user.getName()+"已退出临界区");
obj.jta.append("进程"+user.getName()+"已退出临界区\n");
jud=false;//开锁
synchronized(obj){
obj.notifyAll();//把资源等待池中的进程唤醒
}
}
}
③第三个java文件:
ThingSome.java
//临界资源
importjavax.swing.JTextArea;
classThingSome
{
staticJTextAreajta=newJTextArea();
publicThingSome(JTextAreaja){
jta=ja;
}//构造方法
publicvoiduseing(Threaduser){
System.out.println("进程"+user.getName()+"正在临界区");//控制台输出
jta.append("进程"+user.getName()+"正在临界区\n");//添加到多文本框jta
try{
Thread.sleep(6