操作系统课程设计.docx

上传人:b****5 文档编号:3431369 上传时间:2022-11-23 格式:DOCX 页数:19 大小:1.20MB
下载 相关 举报
操作系统课程设计.docx_第1页
第1页 / 共19页
操作系统课程设计.docx_第2页
第2页 / 共19页
操作系统课程设计.docx_第3页
第3页 / 共19页
操作系统课程设计.docx_第4页
第4页 / 共19页
操作系统课程设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

操作系统课程设计.docx

《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(19页珍藏版)》请在冰豆网上搜索。

操作系统课程设计.docx

操作系统课程设计

操作系统课程设计报告

项目名称:

临界区资源模拟

小组成员:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1