授课对象:计算机科学与技术/网络工程等专业
曲阜师范大学计算机学院
实验一操作系统的安装及启动
一、实验任务
- 熟悉WINDOWS 7的安装。
- 掌握操作系统的启动过程。
二、实验目的
- 了解计算机启动过程的原理。
2.了解计算机中程序运行的机制。
三、实验环境
- PC计算机;
- WINDOWS 7操作系统的安装盘。
四、实验要求
- 了解安装WINDOWS 7的硬件需求。 熟悉安装过程。熟悉安装过程中各种组件的选择;设置操作系统双重启动;熟悉各种物理设备驱动程序的安装。没有条件,可以一般了解。
- 熟悉WINDOWS 7的用户界面。操作系统的各类用户接口。
- 掌握操作系统的启动过程:BIOS、硬件自检、操作系统的启动文件。
- 了解BIOS程序中对各个硬件的配置。
- 理解并掌握fork()和exec()源程序的功能,及CreateProcess()各个参数的用法和作用。
- 熟练掌握WINDOWS 任务管理器中的各个进程的作用,如explorer.exe等。
五、实验准备知识
- 阅读教材第一章(操作系统引论),熟悉操作系统的目标、作用和层次;了解操作系统的发展过程;熟悉操作系统实现的功能(存储器管理功能、处理机管理功能、设备管理功能、文件管理功能以及用户接口);了解操作系统的发展的历史和未来的发展趋势。
- 完成一本WINDOWS操作系统技术书籍的阅读(根据个人情况任选)。
- 学习微软认证(MCSE)中有关WINDOWS 7 操作系统的知识(通过课堂补充教授、阅读有关书籍或网上资料)。
六、程序源代码及注释(无)
实验二生产者和消费者问题
一、 实验任务
问题描述:考虑有一些生产者和消费者进程,生产者进程生产信息并把它们放入缓冲池中,消费者从缓冲池中取走信息。生产者—消费者问题是相互合作的进程关系的一种抽象,如在输入时,输入进程是生产者,计算进程是消费者;而在输出时,则计算进程是生产者,打印进程是消费者。请使用信号量机制来解决生产者—消费者问题。
互斥关系:
(I)设缓冲池有n个单元。
(II)当n个单元装满时,生产者必须等待。
(III)当缓冲池空时,消费者必须等待。
二、实验目的
1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 验证用信号量机制实现进程互斥的方法。
4. 验证用信号机制实现进程同步的方法。
三、实验环境
1. 一台运行Windows 7操作系统的计算机。
2. 选用以C、C++、visual C++、Java等任何一种语言。
四、实验要求
1. 在程序编制中,应有数据显示,最好采用图形界面显示。
2. 生产者和消费者的进程采用程序模拟的方法运行。
3. 首先运行参考代码,成功运行后,修改程序中个别参数,得到自己的结果。实验报告册中需有自己的代码分析。
4. 实验共4课时。
五、实验准备知识
1. 阅读课本有关进程管理以及进程同步的有关章节,对临界区和临界资源概念要清晰,充分理解信号信号量机制。
2. 阅读几种经典进程同步问题的算法并理解。熟练掌握生产者—消费者的算法思想。
六、程序源代码及注释
JAVA语言代码参考:
package ProducerConsumerPackage;
import javax.swing.JTextArea;
/** 定义临界资源:缓冲队列
**/
public class Buffers {
JTextArea ta;
static final int productBufferNum = 10; // 缓冲单元数
ProductBuffer pBuffer[] = new ProductBuffer[productBufferNum]; // 缓冲队列
int in = 0; // 缓冲单元指针,用于放产品get()
int out = 0; // 缓冲单元指针,用于取产品put()
int consumeProductNo; // 记录消费产品的编号
int usedBufferNum = 0; // 记录缓冲队列已使用的缓冲单元个数
public Buffers(JTextArea ta) {
this.ta = ta;
// 初始化
for (int j = 0; j < productBufferNum; j++) {
pBuffer[j] = new ProductBuffer();
}
for (int i = 0; i < productBufferNum; i++) {
pBuffer[i].product = -1;
pBuffer[i].hasProduct = false;
}
}
// 取产品
public synchronized void get(int id) {
// 缓冲队列空则等待
if (usedBufferNum == 0) {
try {
super.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
consumeProductNo = pBuffer[out].product; // 取出产品
pBuffer[out].product = 0; // 清空缓冲单元
pBuffer[out].hasProduct = false; // 置"无产品"标识
usedBufferNum--;
// 输出本次取产品后缓冲队列的情况
ta.append("消费者" + id + "将产品" + consumeProductNo + "从缓冲单元" + out
+ "取出,缓冲队列状态如下:\n");
printBuffer();
out = (out + 1) % productBufferNum; // 更新指针
// 唤醒等待线程
super.notify();
}
// 放产品
public synchronized void put(int productNo, int id) {
// 缓冲队列满则等待
if (usedBufferNum == productBufferNum) {
try {
super.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
pBuffer[in].product = productNo; // 放产品
pBuffer[in].hasProduct = true; // 置“有产品”标识
usedBufferNum++;
// /输出本次放入产品后,缓冲队列的情况
ta.append("生产者" + id + "将产品" + productNo + "放入缓冲单元" + in
+ ",缓冲队列状态如下:\n");
printBuffer();
in = (in + 1) % productBufferNum; // 更新指针
// 唤醒等待线程
super.notify();
}
// 打印缓冲队列当前情况
private void printBuffer() {
ta.append("缓冲单元编号产品编号缓冲单元状态\n");
for (int i = 0; i < productBufferNum; i++) {
ta.append("\t" + i + "\t" + pBuffer[i].product + "\t"
+ pBuffer[i].hasProduct + "\n");
}
}
}
package ProducerConsumerPackage;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/*
* 生产者消费者问题实现(可以有多个生产者消费者)
**/
public class ProducerConsumerMain implements ActionListener {
boolean isRun = true; // 用于控制线程结束
JTextArea ta = new JTextArea();
Buffers buffers = new Buffers(ta); // 缓冲队列
static final int producerNum = 8; // 生产者个数
static final int consumerNum = 2; // 消费者个数
ProducerThread proThread[] = new ProducerThread[producerNum];
ConsumerThread conThread[] = new ConsumerThread[consumerNum];
Thread producer[] = new Thread[producerNum];
Thread consumer[] = new Thread[consumerNum];
public ProducerConsumerMain() {
createUI(); // 创建界面
// 创建多个生产者和消费者线程并开始执行
for (int i = 0; i < producerNum; i++) {
proThread[i] = new ProducerThread(i + 1,isRun,buffers);
producer[i] = new Thread(proThread[i]);
producer[i].start();
}
for (int j = 0; j < consumerNum; j++) {
conThread[j] = new ConsumerThread(j + 1,isRun,buffers);
consumer[j] = new Thread(conThread[j]);
consumer[j].start();
}
}
// 创建界面
public void createUI() {
JFrame frame = new JFrame("生产者消费者");
JPanel panel = new JPanel(new BorderLayout());
JScrollPane scrPane = new JScrollPane(ta);
panel.add(scrPane, BorderLayout.CENTER);
JButton button = new JButton("停止");
button.addActionListener(this);
panel.add(button, BorderLayout.SOUTH);
frame.add(panel);
frame.setVisible(true);
frame.setSize(1000, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 按钮响应事件
public void actionPerformed(ActionEvent e) {
isRun = false; // 控制线程结束
System.out.println("停止");
}
public static void main(String args[]) {
ProducerConsumerMain producerConsumer = new ProducerConsumerMain();
}
}
//定义生产者线程
package ProducerConsumerPackage;
import javax.swing.JTextArea;
//定义生产者线程
class ProducerThread implements Runnable {
int productNo = 0; // 产品编号