操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码

合集下载

操作系统-课程设计

操作系统-课程设计

操作系统-课程设计一、教学目标本章节的教学目标分为三个部分:知识目标、技能目标和情感态度价值观目标。

知识目标:通过本章节的学习,学生需要掌握操作系统的概念、原理和基本功能,包括进程管理、内存管理、文件系统和设备管理等方面的知识。

技能目标:学生能够运用所学知识分析和解决操作系统相关的问题,具备基本的操作系统使用和维护能力。

情感态度价值观目标:培养学生对操作系统的兴趣和好奇心,提高学生对计算机科学的热爱和责任感。

二、教学内容本章节的教学内容主要包括以下几个部分:1.操作系统的概念和作用:介绍操作系统的定义、功能和作用,以及操作系统的发展历程。

2.进程管理:讲解进程的定义、特点和基本管理方法,包括进程调度、进程同步和进程通信等内容。

3.内存管理:介绍内存的概念、分类和分配策略,以及内存管理的具体方法,如分页、分段和虚拟内存等。

4.文件系统:讲解文件和文件夹的概念、方式和存储结构,以及文件系统的管理方法,如目录结构、文件读写和磁盘空间分配等。

5.设备管理:介绍设备的分类、设备驱动程序和设备管理的基本方法,包括输入输出控制、中断处理和DMA传输等。

三、教学方法为了提高教学效果,本章节将采用多种教学方法相结合的方式进行教学:1.讲授法:通过讲解操作系统的概念、原理和基本功能,使学生掌握操作系统的相关知识。

2.案例分析法:通过分析具体的操作系统案例,使学生更好地理解和掌握操作系统的原理和方法。

3.实验法:安排实验室实践环节,让学生亲自动手进行操作系统的实验操作,提高学生的实际操作能力。

4.讨论法:学生进行小组讨论,分享学习心得和经验,促进学生之间的交流与合作。

四、教学资源为了支持本章节的教学,我们将准备以下教学资源:1.教材:选用权威、实用的操作系统教材,为学生提供系统、全面的学习资料。

2.参考书:推荐学生阅读一些优秀的操作系统参考书籍,丰富学生的知识体系。

3.多媒体资料:制作精美的PPT课件,为学生提供直观、生动的学习界面。

操作系统课程设计

操作系统课程设计

操作系统课程设计一、课程目标知识目标:1. 理解操作系统的基本概念、功能、类型和结构,掌握操作系统的五大核心功能模块(处理器管理、存储器管理、设备管理、文件管理、用户接口);2. 掌握操作系统的发展历程、主要操作系统(如Windows、Linux、Mac OS)的特点及应用场景;3. 了解操作系统的设计与实现原理,包括进程管理、内存管理、设备管理、文件系统等关键技术;4. 学会使用操作系统提供的命令行或图形界面进行基本的系统操作与维护。

技能目标:1. 培养学生对操作系统的实际操作能力,能够熟练使用至少一种操作系统进行日常管理与维护;2. 培养学生运用操作系统原理解决实际问题的能力,如分析系统性能、诊断故障、优化配置等;3. 提高学生的编程能力,使其能够编写简单的系统程序或脚本,实现特定功能。

情感态度价值观目标:1. 培养学生对操作系统的兴趣,激发学生学习计算机科学的热情;2. 培养学生的团队合作意识,使其在讨论、分析、解决问题的过程中学会倾听、交流、协作;3. 培养学生具备良好的信息素养,关注操作系统领域的最新发展,增强信息安全意识。

课程性质:本课程为计算机科学与技术专业(或相关领域)的必修课,具有较强的理论性和实践性。

学生特点:学生已具备一定的计算机基础知识,具有较强的学习兴趣和动手能力,但可能对操作系统原理的理解和应用尚有不足。

教学要求:注重理论与实践相结合,以案例驱动、任务导向的方式进行教学,注重培养学生的实际操作能力和问题解决能力。

通过本课程的学习,使学生能够掌握操作系统的基本原理,提高实际应用水平,为后续专业课程学习打下坚实基础。

二、教学内容1. 操作系统概述:介绍操作系统的基本概念、功能、类型,比较不同操作系统的特点,分析操作系统的发展趋势。

教材章节:第一章 操作系统概述2. 进程与线程管理:讲解进程与线程的概念、状态与转换,进程调度算法,同步与互斥,死锁与饥饿问题。

教材章节:第二章 进程管理3. 存储管理:介绍内存分配与回收策略,虚拟内存技术,页面置换算法,内存保护机制。

OS课程设计__读者写者

OS课程设计__读者写者

兰州交通大学操作系统课程设计课程:计算机操作系统题目:进程同步(读者--写者)班级:姓名:学号:指导教师:日期:2012年12月21日目录1题目 (1)2设计概述 (1)2.1问题描述 (1)2.2采用信号量机制 (1)3课程设计目的及功能 (1)3.1设计目的 (1)3.2设计功能 (1)4总体设计思想概述 (2)4.1功能流程图 (2)4.2开发平台及源程序的主要部分 (3)4.3数据结构 (3)4.4模块说明 (3)4.5源程序 (3)5测试用例,运行结果与运行情况分析 (12)5.1测试用例 (12)5.2运行结果 (12)5.3运行结果分析 (14)6总结与心得 (15)1题目进程同步模拟设计——读者和写者问题2设计概述2.1问题描述模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。

2.1.1要求允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。

2.1.2读者和写者的相互关系:2.2采用信号量机制1)Wmutex表示读写的互斥信号量,初值: Wmutex =1;2)公共变量Rcount表示“正在读”的进程数,初值:Rcount =0;3)Rmutex:表示对Rcount的互斥操作,初值:Rmutex=1。

3课程设计目的及功能3.1设计目的通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。

由此增加对进程同步的问题的了解。

具体如下:1)掌握基本的同步互斥算法,理解读者和写者模型;2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;3)学习使用windows中基本的同步对象,掌握相应的API。

3.2设计功能利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉及的进程的同步与互斥。

《操作系统》课程设计

《操作系统》课程设计

《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。

技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。

情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。

课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。

学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。

在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。

二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。

- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。

- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。

- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。

操作系统课程设计

操作系统课程设计
《操作系统》课程设计任务书
• 一、设计目的
– 学完《操作系统》课程后,进行一次全面的综合训练。 通过本课程设计,让学生更好地掌握计算机操作系统 的原理,加深对操作系统基础理论和重要算法的理解, 加强学生的动手能力。
– 在OS理论基础上,掌握Linux操作系统的使用方法;了 解Linux系统内核代码结构;掌握实例操作系统的实现 方法。
题目6
• 要求:进程调度的模拟实现 • 内容:
题目7
• 要求:生产者-消费者问题的模拟实现 • 内容:
题目8
• 要求:页面置换算法的模拟实现 • 内容:
– 设计一个虚拟存储区和内存工作区,编程序演 示算法的具体实现过程,并计算访问命中率。
– 需要实现的算法:
• 先进先出算法 FIFO • 最近最久未使用算法 LRU
课程设计报告内容与格式
• 主要内容
– (1)概述:设计主要完成的任务和解决的问题 – (2)设计原理:涉及的概念与原理 – (3)详细设计与编码:算法流程图、编码 – (4)结构分析 – (5)设计小结:本设计的特色、经验和体会 – (6)参考资料
• 大概格式如下
二、设计要求与资料提交
– 题目选定或自定,题目可以相同。但每学生必须 独立完成课程设计,严禁抄袭。
– 第2周周三、周四下午课设答辩,每学生讲述5 分钟,并提交一份正式纸质报告、以及电子文档 和源程序文档,交给指导教师。
三、设计内容
• 题目1:
• 要求:熟悉和理解Linux编程环境
• 内容
1)编写一个C程序,实现文件拷贝功能。
题目5
• 要求:银行家算法的模拟实现
• 内容:
– 用C/C++编程据结构
• 1)可利用资源向量Available • 2)最大需求矩阵Max • 3)分配矩阵Allocation • 4)需求矩阵Need

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)一、设计目的操作系统课程设计旨在让学生深入了解操作系统的基本原理,掌握操作系统的设计与实现方法,培养学生在实际操作系统中分析和解决问题的能力。

通过本次课程设计,学生将能够:1. 加深对操作系统理论知识的理解与应用;2. 提高动手实践能力,培养创新精神和团队协作意识;3. 为今后从事操作系统相关领域的研究和工作奠定基础。

二、设计要求(1)进程管理:包括进程的创建、撤销、调度等;(2)内存管理:实现内存分配、回收、页面置换等;(3)文件系统:实现文件的创建、删除、读写等操作;(4)设备管理:实现设备的分配、回收、驱动等功能。

(1)代码规范:编写清晰、易读、易维护的代码;(3)团队协作:合理分工,确保团队成员共同参与、共同进步。

三、设计步骤1. 需求分析:分析课程设计所需实现的功能,明确各个模块的具体要求;2. 概要设计:根据需求分析,制定总体设计方案,划分模块,确定模块间接口;3. 详细设计:针对每个模块,进行具体实现方案的设计;4. 编码实现:按照设计文档,编写代码,实现各个功能模块;5. 测试与调试:对实现的功能进行测试,发现问题并进行调试;6. 优化与改进:根据测试结果,对代码进行优化,提高系统性能;四、预期成果1. 完成一套具有基本功能的模拟操作系统,能够演示进程管理、内存管理、文件系统和设备管理的主要操作;2. 提供完整的,包括注释,以便他人理解和学习;3. 形成一份详尽的课程设计报告,记录设计过程中的思考、遇到的问题及解决方案;4. 通过课程设计,提升个人在操作系统领域的理论知识和实践能力。

五、评价标准1. 功能完整性:各功能模块是否按照要求实现,系统是否能正常运行;3. 创新性:设计过程中是否有独特的想法,是否对现有技术有所改进;4. 团队协作:团队成员之间沟通是否顺畅,分工是否合理,协作是否高效;5. 文档质量:课程设计报告是否详细、准确,是否能够完整反映设计过程和成果。

操作系统课设课程设计

操作系统课设课程设计

操作系统课设课程设计一、课程目标知识目标:1. 理解操作系统的基本概念,掌握操作系统的功能和作用;2. 学习操作系统的五大组成部分及其相互关系,了解常见操作系统的类型及特点;3. 掌握进程与线程的概念、状态及调度算法,了解并发与并行计算的基本原理;4. 学会分析文件系统的结构和管理方法,了解存储设备的使用和数据恢复技术;5. 了解操作系统在资源管理、安全性、性能优化方面的策略和实践。

技能目标:1. 能够运用所学知识,编写简单的进程调度算法,分析调度效果;2. 掌握操作系统中进程同步与互斥的基本方法,能够解决简单的并发问题;3. 学会使用操作系统提供的接口和工具,进行简单的系统编程和调试;4. 能够设计和实现一个简单的文件系统,进行文件的基本操作;5. 培养学生运用所学知识解决实际问题的能力,提高学生的动手实践能力。

情感态度价值观目标:1. 培养学生对操作系统课程的学习兴趣,激发学生的学习积极性;2. 培养学生具备良好的团队合作精神和沟通能力,提高学生在团队协作中的责任感;3. 培养学生具备严谨的科学态度和良好的学术道德,尊重知识产权;4. 通过学习操作系统的发展历程,培养学生热爱祖国、为我国信息技术产业发展贡献力量的情怀。

本课程针对高中年级学生,结合学生已具备的计算机基础知识和认知水平,注重理论与实践相结合,旨在提高学生对操作系统的理解与应用能力。

课程目标既关注知识传授,又强调技能培养和情感态度价值观的塑造,为学生的全面发展奠定基础。

在教学过程中,将根据课程目标分解具体学习成果,制定相应的教学策略和评估方法。

二、教学内容1. 操作系统的概念与作用:介绍操作系统的定义、发展历程、功能及作用;教材章节:第一章 操作系统概述2. 操作系统的五大组成部分:讲解处理器管理、存储管理、设备管理、文件管理、用户接口;教材章节:第二章 操作系统的基本组成3. 进程与线程:分析进程与线程的概念、状态、调度算法及并发与并行计算;教材章节:第三章 进程管理4. 进程同步与互斥:探讨操作系统中进程同步与互斥的方法,案例分析;教材章节:第四章 进程同步与互斥5. 存储管理:介绍内存分配、回收策略,虚拟内存技术;教材章节:第五章 存储管理6. 文件系统:讲解文件系统的结构、管理方法,文件操作及存储设备;教材章节:第六章 文件系统7. 操作系统性能与安全性:分析操作系统的性能优化策略、安全性措施;教材章节:第七章 操作系统性能与安全性8. 实践环节:安排操作系统相关的编程实践、案例分析等,巩固所学知识;教材章节:实践环节教学内容按照教材章节进行组织,确保科学性和系统性。

操作系统-课程设计

操作系统-课程设计

操作系统-课程设计一、课程目标知识目标:1. 理解操作系统的基本概念、功能、类型及发展历程;2. 掌握操作系统的五大功能模块(处理器管理、存储器管理、设备管理、文件管理、用户接口)的工作原理;3. 了解操作系统的安全性、稳定性和性能评价标准;4. 熟悉至少一种主流操作系统(如Windows、Linux)的安装、配置及使用。

技能目标:1. 能够使用操作系统基本命令进行文件管理、系统监控等操作;2. 学会编写简单的批处理脚本,实现自动化操作;3. 掌握操作系统设置、优化及故障排除的基本方法;4. 能够分析操作系统的性能问题,并提出合理的解决方案。

情感态度价值观目标:1. 培养学生对操作系统的兴趣,激发学习热情;2. 培养学生的团队协作精神,学会在团队中共同解决问题;3. 增强学生的信息安全意识,遵守网络道德规范,尊重知识产权;4. 培养学生的创新意识,敢于尝试新事物,勇于克服困难。

课程性质:本课程为信息技术学科,结合学生年级特点,注重理论与实践相结合,培养学生的实际操作能力。

学生特点:学生具备一定的计算机操作基础,对操作系统有一定了解,但深入理解不足,需要通过课程学习提高认识。

教学要求:以学生为主体,教师为主导,注重启发式教学,引导学生主动探究,提高学生的实践操作能力。

通过课程学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果,为后续相关课程的学习打下坚实基础。

二、教学内容1. 操作系统的基本概念:介绍操作系统的定义、功能、类型及发展历程,对应教材第一章内容。

2. 操作系统五大功能模块:- 处理器管理:讲解处理器分配、调度算法等,对应教材第二章;- 存储器管理:介绍内存分配、回收、地址映射等,对应教材第三章;- 设备管理:阐述设备分配、I/O调度、缓冲管理等,对应教材第四章;- 文件管理:讲解文件系统结构、文件存储、目录管理等,对应教材第五章;- 用户接口:介绍命令行接口、图形用户接口等,对应教材第六章。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

淮北师范大学课程设计采用读写平等策略的读者写者问题学号:姓名:专业:指导教师:日期:目录第1部分课设简介 (3)1.1 课程设计题目 (3)1.2 课程设计目的.................. 错误!未定义书签。

1.3 课程设计内容 (3)1.4 课程设计要求 (4)1.5 时间安排 (4)第2部分实验原理分析 (4)2.1问题描述 (4)2.2算法思想 (5)2.3主要功能模块流程图 (5)第3部分主要的功能模块 (6)3.1数据结构 (6)3.2测试用例及运行结果 (7)第4部分源代码 (7)第5部分总结及参考文献 (22)5.1 总结 (22)5.2 参考文献 (23)第1部分课设简介1.1 课程设计题目采用读写平等策略的读者写者问题1.2课程设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

1)进一步巩固和复习操作系统的基础知识。

2)培养学生结构化程序、模块化程序设计的方法和能力。

3)提高学生调试程序的技巧和软件设计的能力。

4)提高学生分析问题、解决问题以及综合利用C语言进行课程设计的能力。

1.3课程设计内容用高级语言编写和调试一个采用“读写平等”策略的“读者-- 写者”问题的模拟程序。

1.4课程设计要求1)读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。

2) 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。

3)可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化。

4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。

5) 读写策略:读写互斥、写写互斥、读写平等(严格按照读者与写者到达的顺序进入阅览室,有写着到达,则阻塞后续到达的读者;有读者到达,则阻塞后续到达的写者)。

1.5时间安排1)分析设计贮备阶段(1 天)2)编程调试阶段(7 天)3)写课程设计报告、考核(2 天)第2部分实验原理分析2.1问题描述有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。

有一些只读取这个数据区的进程reader和一些只往数据区中写数据的进程writer 以下假设共享数据区是文件。

这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。

这些条件具体来说就是:1)任意多的读进程可以同时读这个文件;2)一次只允许一个写进程往文件中写;3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;4)写进程执行写操作前,应让已有的写者或读者全部退出。

这说明当有读者在读文件时不允许写者写文件。

2.2算法思想三个线性链表,分别为h1、h2、h3。

h1为写入序列,h2为就绪序列,h3为执行序列。

其中h1用来存放输入进去的读者和写者的信息,h2根据读入内存的时间将h1中的读者写者的信息进行排序,并将排完序的读者与写者信息存在h2中,把h2的内容调入到执行序列h3中,从而执行要求的内容。

2.3主要功能模块流程图第3部分主要的功能模块3.1 数据结构主要的数据结构及数据:int Wmutex=1;//互斥读写的信号量int readcount=0; //读者数目struct process//进程结构体{int ID; //进程序号char type; //进程类别(判断是读者还是写者)int starttime; //进程开始时间int needtime; //进程读写需要的时间int runtime; //进程在内存中已运行的时间struct process *next;};process *h1=NULL,*h2=NULL,*h3=NULL;//三个链表函数成员:void input()//输入信息函数void main()//主函数void choose()//选择函数void ready(int i)//进入就绪队列函数int wait(int &a)//等待队列函数void reader()//读写平等下的读者信息函数void writer()//读写平等下的写者信息函数void add(int i)//动态增加函数void print(int i)//输出函数void leave()//离开执行队列3.2测试用例及运行结果运行程序进入界面后,选择1,运行界面如图1-1;选择2,运行完后查看文件显示如图1-2;选择3查看信息,运行界面如图1-3;在执行过程中按下s可以暂停进程的执行,在进程暂停的情况下,按下a可以增加进程,运行结果如图1-4所示。

图1-1图1-2图1-3图1-4第4部分源代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include "windows.h"int Wmutex=1;//互斥读写的信号量int readcount=0; //读者数目void input();void main();struct process{int ID; //进程序号char type; //进程类别(判断是读者还是写者)int starttime; //进程开始时间int needtime; //进程读写需要的时间int runtime; //进程在内存中已运行的时间struct process *next;};process *h1=NULL,*h2=NULL,*h3=NULL;void choose()//选择{int a;process *p,*q;q=h1=(process *)malloc(sizeof(process));FILE *fp;scanf("%d",&a);switch(a){case 1: //手动输入int i,j;printf("\t\t输入进程数:");fp=fopen("","w+");scanf("%d",&i);fprintf(fp,"%d\n",i);for(j=1;i>0;i--,j++){p=(process *)malloc(sizeof(process));q->next=p;printf("\t\t第%d个进程:\n",j);printf("\t\t进程序号\t读或写\t\t开始时间\t执行时间\n\t\t");scanf("%d %c %d %d",&p->ID,&p->type,&p->starttime,&p->needtime);fprintf(fp,"%d %c %d %d\n",p->ID,p->type,p->starttime,p->needtime);printf("\n");p->runtime=0;q=q->next;p->next=NULL;}fclose(fp);p=h1;h1=h1->next;p->next=NULL;free(p);break;case 2: //文件读入if((fp=fopen("","r"))==NULL){printf("文件打开失败!\n");system("pause");system("cls");main();}fscanf(fp,"%d",&i);for(j=1;i>0;i--,j++){p=(process *)malloc(sizeof(process));q->next=p;fscanf(fp,"%d %c %d %d",&p->ID,&p->type,&p->starttime,&p->needtim e);p->runtime=0;q=q->next;p->next=NULL;}fclose(fp);p=h1;h1=h1->next;p->next=NULL;free(p);break;case 3:int k;if((fp=fopen("","r"))==NULL){printf("文件打开失败!\n");system("pause");system("cls");main();}printf("\t\t进程序号\t读或写\t\t开始时间\t执行时间\n");fscanf(fp,"%d",&i);k=0;for(j=0;i>0;i--,j++){p=(process *)malloc(sizeof(process));q->next=p;fscanf(fp,"%d %c %d %d",&p->ID,&p->type,&p->starttime,&p->needtimif(p->type=='r'||p->type=='R'){k++;}printf("\t\t%d\t\t%c\t\t%d\t\t%d\n",p->ID,p->type,p->starttime,p->n eedtime);p->runtime=0;q=q->next;p->next=NULL;}j=j-k;printf("\t\t读者数目:");printf("\t%d\n",k);printf("\t\t写者数目:");printf("\t%d\n",j);fclose(fp);p=h1;h1=h1->next;p->next=NULL;free(p);system("pause");system("cls");main();break;case 4:exit(0);default :printf("\t\t您输入的有错误,请重新输入:\n");system("pause");system("cls");main();}void input() //输入函数{printf("\t\t***********读写平等策略*********\n");printf("\t\t\t1.请输入进程信息\n");printf("\t\t\t2.文件载入进程信息\n");printf("\t\t\t3.查看进程信息\n");printf("\t\t\t4.退出\n");printf("\t\t************************************\n");printf("\t\t请选择:");choose();}void ready(int i) //进入就绪队列{process *p,*q,*j,*k;p=h1;q=h2;int t=0;if(h2==NULL){q=h2=(process *)malloc(sizeof(process));q->next=NULL;t=1;}else{while(q->next!=NULL){q=q->next;}}j=(process *)malloc(sizeof(process)); j->next=head1;while(h1->starttime==i){q->next=head1;h1=h1->next;q=q->next;q->next=NULL;j->next=head1;if(h1==NULL)break;}p=h1;while(p!=NULL){if(p->starttime==i){k=j;while(k->next!=p){k=k->next;}k->next=p->next;q->next=p;q=q->next;p=p->next;q->next=NULL;}else{p=p->next;}}h1=j->next;j->next=NULL;free(j);if(t==1){p=h2;h2=h2->next;p->next=NULL;free(p);}}int wait(int &a){a--;if(a<0){return 0;}return 1;}void signal(int &a){a++;}void reader() //读写平等下的读者信息{process *p;int t=0;p=h3;if(h3==NULL){p=h3=(process *)malloc(sizeof(process));p->next=NULL;t=1;}else{while(p->next!=NULL){p=p->next;}}if(readcount>0){p->next=h2;h2=h2->next;p=p->next;p->next=NULL;readcount++;}if((readcount==0)&&(wait(Wmutex)==1)) {p->next=h2;h2=h2->next;p=p->next;p->next=NULL;readcount++;}else Wmutex++;if(t==1){p=h3;h3=h3->next;p->next=NULL;free(p);}}void writer() //读写平等下的写者信息{if((wait(Wmutex)==1)&&(head3==NULL)) {h3=h2;h2=h2->next;h3->next=NULL;}else Wmutex++;}void add(int i) //动态增加{process *p,*q;int a;p=head1;q=(process *)malloc(sizeof(process));printf("\t\t进程序号:");scanf("%d",&q->ID);printf("\t\t\t读或写:");fflush(stdin);scanf("%c",&q->type);printf("\t\t开始时间:");scanf("%d",&a);q->starttime=a+i;printf("\t\t执行时间:");scanf("%d",&q->needtime);q->runtime=0;q->next=NULL;if(h1!=NULL){while(p->next!=NULL)p=p->next;p->next=q;}elseh1=q;}void print(int i) //输出函数{process *p;p=h3;while(p!=NULL){p->runtime++;p=p->next;}printf("\n\t\t执行 %d :\n",i);printf("\t\t执行队列: ");p=h3;if(p==NULL)printf("<空>");elsewhile(p!=NULL){printf("%d ",p->ID);p=p->next;}printf("\n\t\t等待队列: ");p=h2;if(p==NULL)printf("<空>");elsewhile(p!=NULL){printf("%d",p->ID);p=p->next;}printf("\n");}void leave() //离开执行队列{process *p,*q;p=q=(process *)malloc(sizeof(process));p->next=NULL;while(h3!=NULL){if(h3->needtime!=h3->runtime){p->next=h3;p=p->next;}else{if((h3->type=='r')||(h3->type=='R')){ readcount--;if(readcount==0)Wmutex=1;}elsesignal(Wmutex);}h3=h3->next;p->next=NULL;}h3=q->next;q->next=NULL;free(q);}void main(){int i=0;input();while((h1!=NULL)||(h2!=NULL)||(h3!=NULL)) {i++;if(h1!=NULL)ready(i);if(h2!=NULL)while(h2->type=='r'){reader();if(h3!=NULL)if(h3->type=='w')break;if(h2==NULL)break;}if(h2!=NULL)if(h2->type=='w'){writer();}print(i);leave();Sleep(1000); //交出线程占用CPU时间一秒钟fflush(stdin);//清空缓冲区char ch=' ';if (kbhit()==1)//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0{ch=getch();if((ch=='S')||(ch=='s')){printf("\t\t已暂停,任意键继续...\n添加新的进程输入a\n");ch=getchar();}}if(ch=='a')add(i);}printf("\n\n\t\t执行完毕\n");system("pause");system("cls");Wmutex=1;readcount=0;main();while(1);}第5部分总结及参考文献5.1 总结通过这次课设,我学到了很多课堂上学不到的知识,这次我做的是平等策略下的读者写者问题,执行读者与写者在公平竞争下的同步进程问题,另外可以实现进程的可视化显示、暂停和动态增加最后退出,实现了报告的要求,同时非常感谢老师的帮助,我会在这次课设之后,继续完善这个程序,提高自己的动手能力和实践能力。

相关文档
最新文档