【操作系统】实验报告=《操作系统》实验指导书

曲阜师范大学计算机学院

实验一操作系统的安装及启动

一、实验任务

  1. 熟悉WINDOWS 7的安装。
  2. 掌握操作系统的启动过程。

二、实验目的

  1. 了解计算机启动过程的原理。
    2.了解计算机中程序运行的机制。

三、实验环境

  1. PC计算机;
  2. WINDOWS 7操作系统的安装盘。

四、实验要求

  1. 了解安装WINDOWS 7的硬件需求。 熟悉安装过程。熟悉安装过程中各种组件的选择;设置操作系统双重启动;熟悉各种物理设备驱动程序的安装。没有条件,可以一般了解。
  2. 熟悉WINDOWS 7的用户界面。操作系统的各类用户接口。
  3. 掌握操作系统的启动过程:BIOS、硬件自检、操作系统的启动文件。
  4. 了解BIOS程序中对各个硬件的配置。
  5. 理解并掌握fork()和exec()源程序的功能,及CreateProcess()各个参数的用法和作用。
  6. 熟练掌握WINDOWS 任务管理器中的各个进程的作用,如explorer.exe等。

五、实验准备知识

  1. 阅读教材第一章(操作系统引论),熟悉操作系统的目标、作用和层次;了解操作系统的发展过程;熟悉操作系统实现的功能(存储器管理功能、处理机管理功能、设备管理功能、文件管理功能以及用户接口);了解操作系统的发展的历史和未来的发展趋势。
  2. 完成一本WINDOWS操作系统技术书籍的阅读(根据个人情况任选)。
  3. 学习微软认证(MCSE)中有关WINDOWS 7 操作系统的知识(通过课堂补充教授、阅读有关书籍或网上资料)。

六、程序源代码及注释(无)

实验二生产者和消费者问题

一、 实验任务

问题描述:考虑有一些生产者和消费者进程,生产者进程生产信息并把它们放入缓冲池中,消费者从缓冲池中取走信息。生产者—消费者问题是相互合作的进程关系的一种抽象,如在输入时,输入进程是生产者,计算进程是消费者;而在输出时,则计算进程是生产者,打印进程是消费者。请使用信号量机制来解决生产者—消费者问题。

互斥关系:
(I)设缓冲池有n个单元。
(II)当n个单元装满时,生产者必须等待。
(III)当缓冲池空时,消费者必须等待。
二、实验目的

1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 验证用信号量机制实现进程互斥的方法。
4. 验证用信号机制实现进程同步的方法。

三、实验环境

1. 一台运行Windows 7操作系统的计算机。
2. 选用以CC++、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; // 产品编号
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒回顾,半缘君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值