操作系统课程设计Word文档下载推荐.docx
- 文档编号:16336823
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:19
- 大小:1.20MB
操作系统课程设计Word文档下载推荐.docx
《操作系统课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
②设计临界区及进程管理模块,让用户进程在其中访问时遵循空闲让进、忙则等待、有限等待、让权等待的准则。
③通信块及临界资源的设计,两个进程模拟用户进程进行通信。
④界面的设计
三开发过程
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("
plays.setForeground(Color.RED);
JButtonb2=newJButton("
查看作者"
imagePanel.add(b2);
b2.setFont(newFont("
b2.setForeground(Color.RED);
imagePanel.add(je);
//*为了界面美观添加的隐形文本框,以下带有*注释的一样
je.setEditable(false);
je.setOpaque(false);
JLabelbLabel=newJLabel(S[2],null,JLabel.CENTER);
bLabel.setFont(newFont("
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("
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("
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)
{
保存失败!
}
});
b2.addActionListener(newActionListener()//为"
JOptionPane.showMessageDialog(null,"
AAA、BBB、CCC、DDD"
作者"
JOptionPane.INFORMATION_MESSAGE);
}
plays.addActionListener(newActionListener()//为"
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("
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;
classThreadManagerimplementsRunnable//指向要管理的临界资源
ThingSomeobj;
//临界资源
staticbooleanjud=false;
//记录临界资源的使用情况
Vector<
Thread>
vec=newVector<
();
//向量,数据元素为线程
publicThreadManager(ThingSomets){
obj=ts;
publicvoidrun()
while(vec.size()!
=0)
for(inti=0;
i<
vec.size();
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("
请求资源.....\n"
while(jud)//如果jud为true,表示有进程正在使用资源,否则相反
try{
System.out.println("
等待资源....."
obj.jta.append("
等待资源.....\n"
synchronized(obj){
obj.wait();
//进入资源的等待池中,等待被唤醒
jud=true;
//关锁
进入临界区"
进入临界区\n"
obj.useing(user);
//使用资源
已退出临界区"
已退出临界区\n"
jud=false;
//开锁
synchronized(obj){
obj.notifyAll();
//把资源等待池中的进程唤醒
}
③第三个java文件:
ThingSome.java
//临界资源
classThingSome
staticJTextAreajta=newJTextArea();
publicThingSome(JTextAreaja){
jta=ja;
}//构造方法
publicvoiduseing(Threaduser){
正在临界区"
//控制台输出
jta.append("
正在临界区\n"
//添加到多文本框jta
try{
Thread.sleep(6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计