操作系统课程设计-张为晓
课程设计说明书课程设计说明书课程名称: 操作系统课程设计 专 业: 计算机科学与技术 班级: 2012-2 设 计 人: 晁子墨 山山 东东 科科 技技 大大 学学20152015 年年 1 1 月月 1414 日日2山山 东东 科科 技技 大大 学学课课 程程 设设 计计 任任 务务 书书一、课程设计题目: 操作系统 二、设计原始资料: 操作系统 (第三版) 、 现代操作系统 三、设计应解决下列各主要问题:1、 生产者-消费者问题 2、 内存管理 3、 快速文件系统 四、设计说明书应附有下列图纸: 五、小组分工说明: 晁子墨生产者-消费者问题、内存管理、快速文件系统六、命题发出日期: 2014-9-24 设计完成日期: 2015-1-15 3指导教师评语指导教师评语成绩:成绩: 指导教师(签章):指导教师(签章): 年年 月月 日日4目目 录录题目一题目一 生产者生产者- -消费者问题消费者问题1 1需求分析说明需求分析说明 51.1 问题描述5 1.2 原理分析62 2概要设计说明概要设计说明62.1 功能描述6 2.2 数据结构分析7 2.3 数据结构图73 3详细设计说明详细设计说明83.1 主函数模块8 3.2 程序流程图83.2.1 生产者93.2.2 消费者104 4调试分析调试分析114.1 遇到的问题11 4.2 测试结果135 5用户使用说明用户使用说明13题目二题目二 内存管理系统内存管理系统1 1 需求分析说明需求分析说明 171.1 问题描述17 1.2 原理分析182 2 概要设计说明概要设计说明182.1 函数定义说明1953 3 详细设计说明详细设计说明213.1 代码实现264 4 调试分析调试分析264.1 运行结果274.2 运行结果分析285 5 用户使用说明用户使用说明30题目三题目三 快速文件系统快速文件系统1 1 需求分析说明需求分析说明 371.1 设计目的371.2 问题描述381.3 原理说明382 2 概要设计说明概要设计说明392.1 函数定义说明403 3 详细设计说明详细设计说明413.1 代码实现434 4 调试分析调试分析434.1 运行结果434.2 运行结果分析445 5 用户使用说明用户使用说明455.1 用户操作指南46课程设计总结课程设计总结486题目一题目一 生产者生产者- -消费者问题消费者问题1 需求分析说明需求分析说明生产者-消费者问题的总体目标:在 Windows 的开发环境下,利用所学C+语言和数据结构的相关知识,利用程序实现经典的生产者-消费者问题的输出,以帮助我们更好的理解和应用进程同步的原理。1问题描述问题描述有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取走产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。这就是生产者-消费者问题。2原理分析原理分析在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。2 概要设计说明概要设计说明1功能描述功能描述 1.1 生产者功能描述在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然 后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产 物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程 释放出一个空缓冲区。71.2 消费者功能描述 消费者线程从缓冲区中获得物品,然后释放缓冲区。当消费者线程 消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新 的物品被生产出来。 2数据结构分析数据结构分析 2.1 生产者与消费者实现: 这其中主要是通过多线程,来实现生产者和消费者之间的协调问题。2.2 生产者(producer)消费者(consumer): 通过一些记录性变量,来记录模拟实现生产者的行为,程序采用 OO 设计模式,缓存区采用队列结构存储。 3 3程序结构图程序结构图3 详细设计说明详细设计说明1主函数模块主函数模块1.1 创建互斥信号量、已占用的缓存区和未被占用的缓存区并进行初始化。81.2 创建生产者线程和消费者线程。1.3 当输入回车时,结束程序。2程序流程图程序流程图2.1 生产者NYYN开 始生产产品P(empty)empty0P (mutex)Mutex=1addTail()Empty-V (mutex)V (occupy)缓冲区内已满,已 无可用缓冲区缓冲区正被其他进 程占用结 束92.2 消费者NYYN开 始P (full) 消费请求full0Wait (mutex)Mutex=1消 费full -V(mutex)V (empty)缓冲区内产品已空, 不能进行消费缓冲区正被其他进 程占用结 束103、程序主要代码public class HoldIntegerSynchronizedprivate int buffer; /缓冲区private int occupiedBufferCount = 0;private int readPosition = 0, writePosition = 0;/下一个读到的位置和写到的位置public HoldIntegerSynchronized(int capacity)buffer = new intcapacity;public int BufferSizegetreturn buffer.Length;public int Buffergetint bufferCopy;/ 加锁lock (this)11while (occupiedBufferCount = 0) /多个消费者,所以此处改用whileConsole.WriteLine(Thread.CurrentThread.Name + “ tries to read. “);DisplayState(“Buffer Empty. “ + Thread.CurrentThread.Name + “ waits.“);Monitor.Wait(this);/ 为临界区之外等待的生产者放行,让他来“生产“/ 一直到生产者生产结束,调用了Monitor.PauseAll()/ 才能继续执行下去,此时,消费者自动重新获得this的锁-occupiedBufferCount;bufferCopy = bufferreadPosition;readPosition = (readPosition + 1) % buffer.Length;DisplayState(Thread.CurrentThread.Name + “ reads “ + bufferCopy);/ 通知,让等待的 生产者线程 进入Started状态,如果生产者处于临界区之外,这句话执行完后他仍然在临界区之外Monitor.PulseAll(this);/ 释放锁/lockreturn bufferCopy;set/ 加锁lock (this)while (occupiedBufferCount = buffer.Length)12Console.WriteLine(Thread.CurrentThread.Name + “ tries to write. “);DisplayState(“Buffer Full. “ + Thread.CurrentThread.Name + “ waits.“);Monitor.Wait(this);/ 为临界区之外等待消费者放行,让他来“消费“/ 一直到消费者调用了Monitor.Pause()/ 才能继续执行下去,此时,生产者自动重新获得this的锁bufferwritePosition = value;+occupiedBufferCount;writePosition = (writePosition + 1) % buffer.Length;DisplayState(Thread.CurrentThread.Name + “ writes “ + value);/ 通知,让Wait状态的 消费者 进入Started状态,如果消费者处于临界区之外,这句话执行完后他仍然在临界区之外Monitor.PulseAll(this);/ 释放锁4 调试分析调