生产消费缓冲池课设报告
- 格式:doc
- 大小:230.01 KB
- 文档页数:20
实习报告:缓冲区分析实习一、实习目的本次实习的主要目的是通过实践操作,掌握缓冲区分析的基本原理和方法,学会在GIS软件中进行缓冲区分析,并能够将缓冲区分析应用于实际问题中。
二、实习内容实习的主要内容包括:1. 了解缓冲区分析的概念和作用;2. 学习缓冲区分析的方法和步骤;3. 在GIS软件中进行缓冲区分析操作;4. 分析缓冲区分析结果,并进行解释。
三、实习过程1. 缓冲区分析的概念和作用缓冲区分析是一种空间分析方法,它通过在特定要素周围创建一个缓冲区,来模拟特定要素对周边区域的影响。
缓冲区分析在环境管理、城市规划、交通规划等领域有着广泛的应用。
2. 缓冲区分析的方法和步骤缓冲区分析的主要步骤包括:(1)选择分析要素:确定需要进行缓冲区分析的特定要素;(2)确定缓冲区半径:根据需要模拟的影响范围,确定缓冲区的半径;(3)创建缓冲区:在GIS软件中,利用缓冲区分析工具,根据确定的缓冲区半径,创建缓冲区;(4)分析缓冲区结果:对缓冲区进行分析,提取有用的信息。
3. 在GIS软件中进行缓冲区分析操作在实习过程中,我们使用ArcGIS软件进行缓冲区分析。
我们首先选择了交通线路作为分析要素,然后确定了缓冲区半径为500米。
通过缓冲区分析工具,我们成功创建了缓冲区,并导出了缓冲区的结果图。
4. 分析缓冲区分析结果通过分析缓冲区结果图,我们可以清晰地看到交通线路对周边区域的影响范围。
缓冲区内的区域受到了交通线路的影响,而缓冲区外的区域则影响较小。
这为我们进行交通规划提供了重要的参考信息。
四、实习心得通过本次实习,我深刻地认识到了缓冲区分析的重要性,学会了在GIS软件中进行缓冲区分析,并能够将缓冲区分析应用于实际问题中。
同时,我也意识到缓冲区分析只是一个工具,如何合理地应用缓冲区分析,需要我们进行深入的研究和思考。
总之,本次实习使我受益匪浅,不仅提高了我的实践操作能力,也加深了我对缓冲区分析的理解和认识。
我相信,在以后的学习和工作中,我会更加熟练地运用缓冲区分析,为解决实际问题提供帮助。
面向操作系统课程的“启发—探究式”教学方法初探摘要:操作系统课程具有概念知识点较多、涉及内容较广、算法繁多复杂等特点,学生不易理解和掌握。
针对上述问题,文章提出将“启发—探究式”教学方法应用于操作系统的教学中,并以“生产者—消费者”问题为例,阐述了“启发—探究式”教学方法在实际教学过程中的应用。
实践证明,该方法在操作系统的教学过程中取得了良好的效果。
关键词:启发式教学;探究式教学;操作系统;生产者—消费者问题教学方法是教师和学生为实现教学目的、完成教学任务所采取的相互作用的手段和一整套方式。
它既包括教师教的方法,也包括学生学的方法,是教授方法与学习方法的统一。
然而,实际教学过程中往往由于课时、教学设施等条件的限制减少了学生的参与,从而忽略了教学成功的基本标准是学生的学习动机以及学生对学习的参与程度这一事实。
因此,结合具体的教学内容,设计出合理的教学方法,在传道授业解惑的同时充分调动学生的积极性,真正实现教法与学法的辩证统一,应是教育工作者不断追求的目标。
胡一之[1]针对操作系统课程难教难学的现状,探讨了如何调动学生学习的积极性,提高操作系统教学质量的方法;金海东[2]等以操作系统中进程同步与互斥问题为实例,探讨了如何从学习者的角度设计循序渐进的教学内容;张坤[3]总结了在操作系统教学过程中可以运用双语教学、分层次教学以及任务式驱动等教学方法。
以上文献均是对操作系统教学方法进行的有益实践。
笔者结合多年的教学、科研经验,对操作系统课程的教学方法进行了深入的思考和积极的探索。
操作系统课程具有概念知识点较多、涉及内容广泛、算法繁多复杂等特点,它对学生的理解能力和逻辑思维能力提出了更高的要求,而传统的以教师讲解为主的教学模式并不能取得良好的教学效果。
“启发—探究式”教学方法与传统的灌输式教学不同,它更强调学生在教师的引领和启示下,主动参与到发现问题、寻求答案的过程中,从而可以让学生真正理解所学内容,提高了他们独立思考、解决问题的能力。
缓冲器项目投资建设报告
投资建设项目报告
一、项目概况
1.1基本情况
本项目是建设缓冲器,它是一种新型的重力式货物转移装置,可以将
大量物料安全、高效的转移到相应的货站、库房、仓库、超市等,有效的
改善物料供应的流通性和存储的灵活性。
1.2目的
1.2.1项目实施的目的:本项目的实施目的是为了加快物料流通速度,提高生产效率,最大化节约成本。
1.2.2本项目实施的重点:加快物料转移速度,提高物料利用率,降
低库存成本,提高物料供应能力。
1.3建设地点
本项目建设在XXX市,具体地址XXX,总占地面积1000平方米,可
安装50个缓冲块,共可容纳3000吨物料。
二、项目投资
2.2项目投资结构:
(1)固定资产投资480万元,投资项目主要包括:建筑物购置投资、安装工程投资、设备购置投资以及其他设施、技术等费用。
(2)流动资产投资120万元,投资项目主要包括:装备、材料、燃料、交通费等应付账款的资金占用费用。
三、项目建设周期
本项目预计建设周期为9个月,建设周期的具体内容如下:
(1)筹备期:政府批准、确定。
操作系统缓冲池课程设计一、课程目标知识目标:1. 理解操作系统缓冲池的基本概念、作用和工作原理;2. 掌握缓冲池的常用数据结构、算法及缓冲策略;3. 了解缓冲池在操作系统中的应用场景和性能优化方法。
技能目标:1. 能够运用所学知识设计简单的缓冲池数据结构和算法;2. 能够分析并优化缓冲池的性能,提高操作系统效率;3. 能够运用编程语言实现缓冲池的基本功能。
情感态度价值观目标:1. 培养学生主动探究、合作学习的精神,增强解决问题的能力;2. 培养学生对操作系统的兴趣,激发学习热情,树立正确的学习态度;3. 引导学生认识到操作系统在计算机系统中的重要作用,增强学生的职业责任感。
课程性质:本课程为计算机科学与技术专业高年级的专业课程,旨在帮助学生深入理解操作系统缓冲池的相关知识,提高操作系统的性能分析和优化能力。
学生特点:学生已经具备一定的操作系统基础,具备基本的编程能力和问题分析能力。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,强调学生动手实践和问题解决能力的培养。
通过本课程的学习,使学生能够具备独立设计和优化操作系统缓冲池的能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 缓冲池基本概念:缓冲池的定义、作用、分类;2. 缓冲池数据结构与算法:队列、栈、优先队列等数据结构在缓冲池中的应用,以及常见的缓冲策略,如FIFO、LRU等;3. 缓冲池在操作系统中的应用场景:磁盘I/O、网络通信、数据库系统等;4. 缓冲池性能分析及优化:性能指标、性能瓶颈分析、缓存淘汰策略优化;5. 缓冲池编程实践:结合编程语言(如C/C++、Java等),实现一个简单的缓冲池系统。
教学内容安排和进度:1. 课时分配:共8学时;2. 第一周:缓冲池基本概念及作用(2学时);3. 第二周:缓冲池数据结构与算法(2学时);4. 第三周:缓冲池在操作系统中的应用场景(2学时);5. 第四周:缓冲池性能分析及优化(2学时)。
目录1 绪论 (1)1.1 实现的功能 (1)1.2 P V 操作 (1)2 生产者——消费者问题。
(2)2.1 要求 (2)2.2 生产者和消费者两个进程的程序 (2)2.3进程控制块PCB。
(3)2.4处理器的模拟。
(3)2.5程序设计 (3)3设计步骤 (4)3.1课程分析 (5)3.1.2 流程图 (5)3.1.3 测试程序 (7)3.1.4测试结果分析 (12)5 结论 (12)参考文献 (13)1 绪论生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。
模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。
进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。
我们把若干个进程都能进行访问和修改的那些变量称为公共变量。
由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。
为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。
一般说,同步机构是由若干条原语——同步原语——所组成。
本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。
1.1 实现的功能生产者-消费者问题是一个经典的进程同步问题,有m个生产者和n个消费者,它们共享可存放k件产品的缓冲区。
生产者进程生产物品,然后将物品放置在一个空缓冲区中,供消费者进程消费。
消费者进程从缓冲区中获得物品,然后释放缓冲区。
当生产者进程生产物品时,如果没有空缓冲区可用,那么生产者进程必须等待消费者线程释放出一个空缓冲区。
当消费者进程消费物品时,如果没有满的缓冲区,那么消费者进程将被阻塞,直到新的物品被生产出来。
1.2 P V 操作(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。
生产者与消费者问题实验报告篇一:生产者和消费者问题实验报告实验报告课程名称:操作系统实验名称:生产者和消费者问题学号:学生姓名:班级:指导教师:评分:实验日期:XX年 10月 22 日篇二:操作系统实验报告经典的生产者—消费者问题实验二经典的生产者—消费者问题一、目的实现对经典的生产者—消费者问题的模拟,以便更好的理解经典进程同步问题。
二、实验内容及要求编制生产者—消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。
1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。
生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。
缓冲池被占用时,任何进程都不能访问。
2、每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。
在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。
他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。
三、生产者和消费者原理分析在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。
四、生产者与消费者功能描述:生产者功能描述:在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
《操作系统》课程设计题目:“生产者-消费者”问题学院:信息工程学院专业:计算机科学与技术班级:计科1302*名:***指导老师:***2016年1月 15日目录一、课程设计目标 (2)二、课题内容 (2)1.实验目的 (2)2、实验环境 (2)3、实验要求 (2)三、设计思路 (3)1.信号量的设置 (3)2.系统结构 (4)3.程序流程图 (5)4.P V操作代码 (6)四、源代码 (7)五、运行与测试 (10)六、心得体会 (12)一、课程设计目标学习System V的进程间通信机制,使用信号量和共享内存实现经典进程同步问题“生产者-消费者”问题。
具体要求:1.创建信号量集,实现同步互斥信号量。
2.创建共享内存,模拟存放产品的公共缓冲池。
3.创建并发进程,实现进程对共享缓冲池的并发操作。
二、课题内容1.实验目的(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。
(2)了解linux中多线程的并发执行机制,线程间的同步和互斥。
2、实验环境:C/C++语言编译器3、实验要求(1)创建生产者和消费者线程在linux环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。
这些线程的信息由本程序定义的“测试用例文件”中予以指定。
(2)生产和消费的规则在按照上述要求创建线程进行相应的读写操作时,还需要符合以下要求:①共享缓冲区存在空闲空间时,生产者即可使用共享缓冲区。
②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。
此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并作为空闲空间允许新的生产者使用。
③每个消费者线程的各个消费需求之间存在先后顺序。
例上述测试用例文件包含一行信息“5 C 3 l 2 4”,可知这代表一个消费者线程,该线程请求消费1,2,4号生产者线程生产的产品。
而这种消费是有严格顺序的,消费1号线程产品的请求得到满足后才能继续往下请求2号生产者线程的产品。
课程设计报告课程名:操作系统专业学生姓名班级学号指导教师完成日期博雅学院“操作系统”课程设计报告-—生产者—消费者问题的模拟实现1.课程设计的目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
2.设计内容2.1 概述用多进程同步方法解决生产者-消费者问题,C或C++语言实现。
通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。
说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数.设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符。
(2)生产者和消费者各有两个以上。
(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。
2.2 设计原理多进程是一种非常简洁的多任务操作方式。
在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种烦琐的多任务工作方式。
生产者-消费者方案是多进程应用程序开发中最常用的构造之一。
因此困难也在于此。
因为在一个应用程序中可以多次重复生产者—消费者行为,其代码也可以如此。
设计中创建了Consumer 类,该类通过在一些多进程应用程序中促进代码重用以及简化代码调试和维护来解决这个问题。
多进程应用程序通常利用生产者—消费者编程方案,其中由生产者进程创建重复性作业,将其传递给作业队列,然后由消费者进程处理作业.多进程是一种使应用程序能同时处理多个操作的编程技术。
通常有两种不同类型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的间隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适时事件的示例包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作。
第1篇一、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 验证用信号量机制实现进程互斥的方法。
4. 验证用信号量机制实现进程同步的方法。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发工具:Visual Studio三、实验内容1. 生产者和消费者模型介绍生产者和消费者模型是操作系统中常见的一种并发控制模型,用于解决多个进程之间的同步和互斥问题。
在该模型中,生产者负责生成数据,消费者负责消费数据。
生产者和消费者通过共享资源(如缓冲区)进行通信。
2. 实验设计(1)环形缓冲区为了实现生产者和消费者的同步,我们设计了一个环形缓冲区,由若干个大小相等的缓冲块组成。
每个缓冲块可以容纳一个产品。
环形缓冲区的指针分别指向当前的第一个空缓冲块和第一个满缓冲块。
(2)信号量为了实现进程互斥和同步,我们使用了三个信号量:① 公用信号量:用于实现临界区互斥,初始值为1。
② 生产者私用信号量:用于实现生产者与消费者之间的同步,初始值为0。
③ 消费者私用信号量:用于实现生产者与消费者之间的同步,初始值为0。
(3)生产者进程生产者进程负责生成数据,并将数据存入环形缓冲区。
当环形缓冲区满时,生产者进程等待;当环形缓冲区有空位时,生产者进程继续生成数据。
(4)消费者进程消费者进程负责从环形缓冲区中取出数据并消费。
当环形缓冲区空时,消费者进程等待;当环形缓冲区有数据时,消费者进程继续消费数据。
3. 实验步骤(1)创建生产者进程和消费者进程。
(2)初始化信号量。
(3)运行生产者进程和消费者进程。
(4)按任意键停止程序,显示当前系统的各个参数的值。
四、实验结果与分析1. 实验结果通过运行实验程序,我们可以观察到生产者和消费者进程的运行情况。
当按下任意键停止程序时,程序将显示当前系统的各个参数的值,包括环形缓冲区的空位数量、生产者和消费者的状态等。
2. 分析(1)互斥:通过公用信号量实现生产者和消费者对环形缓冲区的互斥访问,防止了同时操作缓冲区的问题。
操作系统课程设计报告书题目生产消费缓冲池系别计算机工程系专业计算机科学与技术班级姓名指导教师下达日期2013 年6 月15 日设计时间自2013 年6 月17 日至2013 年6月30 日第一章课程设计目的操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
生产者与消费者问题是经典进程同步问题的典型代表之一。
该课程设计通过了解进程间的两种制约关系,从而理解信号量机制;通过对实例的分析和讨论,理解信号量机制实现进程的同步及互斥的方法;通过对经典进程同步问题的剖析,初步掌握运用信号量解决进程同步问题的方法。
本系统的功能是根据输入的生产者进程和消费者进程,动态显示生产者进程从生产“产品”到放入缓冲区,消费者进程从缓冲区中取“产品”的整个过程,同时,系统也显示了整个过程中缓冲池中临界资源的变化情况。
生产者-消费者问题是很经典很具有代表性的进程同步问题,计算机中的很多同步问题都可抽象为生产者-消费者问题,通过本实验的练习,希望能加深学生对进程同步问题的认识与理解。
熟悉C++、C、VB的使用,培养和提高学生的分析问题、解决问题的能力。
第二章课程设计内容与要求2.1 生产者与消费者均有二个以上。
2.2 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者。
2.3 生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效。
2.4 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码。
2.5 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符。
2.6 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态。
第三章系统分析与设计3.1系统分析多个生产者进程在生产产品,并将这些产品提供给消费者进程去消费。
为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有20个存储单元的缓冲区,生产者进程将它所生产的产品放入缓冲区中;消费者进程可从缓冲区中取走产品去消费。
利用信号量机制来实现多进程(生产者进程和消费者进程)对缓冲区(临界资源)的互斥访问。
设置多进程的共享变量为临界资源,同时给它设置一个互斥信号量,多进程利用互斥信号量来完成对临界资源的互斥访问(当信号量为某个值是允许进程访问,否则则不允许进程访问),从而确保共享数据的正确性。
3.2系统设计3.2.1问题的提出并发程序在设计上是有困难, 其中最大的问题是进程或者线程间的同步问题, 而生产者—消费者问题是最经典的问题之一, 其描述如下: 有n 个生产者和m 个消费者, 连接在一个有k 个单位缓冲区的有界环形缓冲上, pi、cj 都是并发进程, 只要缓冲区未满, 生产者pi 生产的产品就可以投入缓冲区;类似地, 只要缓冲区不空, 消费者进程cj 就可以从缓冲区取走并消耗产品。
3.2.2问题的解决模型在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。
使用这些对象都分为三个步骤,一是创建或者初始化;接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。
这些同步对象在主进程中创建,在其子线程中都可。
3.3模块设计模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。
生产者把数据放入缓冲区,而消费者从缓冲区取出数据。
生产者流程图:消费者流程图:第四章模块调试与系统测试4.1模块调试●输入的形式:输入生产线程/消费线程,同时设置缓存池的大小。
●输出的形式:动态展现生产者生产和消费者消费的全过程。
●程序所能达到的功能:本系统的功能是根据输入的生产者进程和消费者进程以及缓冲区的大小,动态显示生产者进程从生产“产品”到放入缓冲区,消费者进程从缓冲区中取“产品”的整个过程,同时,系统也显示了整个过程中缓冲区中临界资源的变化情况。
4.2调试分析根据用户的实际要求对系统进行初始化并执行程序,其操作的一般流程:系统初始化(设置进程数和缓冲区的大小)、生产者生产资源并存放在缓冲区中、消费者从缓冲区中取资源和消耗资源。
不足和缺陷:此程序不便于对较大的数据量的生产者消费者问题进行测试,主要由于设计上的对系统处理的数据量的限制,例如本系统初始化方面设计时将缓冲区大小限制了固定大小。
没有对其中的生产者和消费者设置优先级,在生产者和消费者进程中只是以采用synchronized方法,随机的确保每个进程都能够执行,不能满足用户某些优先进程的特殊要求。
第五章运行结果图5-1 初始化图5-2 生产者生产过程1图5-3 生产者生产过程2图5-4 消费者消费过程1图5-4 消费者消费过程2第六章源程序#include "stdafx.h"#include "2.h"#include "2Dlg.h"#include "function.h"#include "request.h"#include "recover.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMy2Dlg dialogCMy2Dlg::CMy2Dlg(CWnd* pParent /*=NULL*/): CDialog(CMy2Dlg::IDD, pParent){//{{AFX_DATA_INIT(CMy2Dlg)m_edit = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMy2Dlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMy2Dlg)DDX_Text(pDX, IDC_EDIT1, m_edit);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMy2Dlg, CDialog)//{{AFX_MSG_MAP(CMy2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_COMMAND(ID_HELP, OnHelp)ON_COMMAND(ID_assign, Onassign)ON_COMMAND(ID_exit, Onexit)ON_COMMAND(ID_recover, Onrecover)ON_COMMAND(ID_init, Oninit)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMy2Dlg message handlersBOOL CMy2Dlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_edit="";return TRUE; // return TRUE unless you set the focus to a control}void CMy2Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void CMy2Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}list *p=head;HDC hdc=::GetDC(m_hWnd);HPEN hp;HBRUSH hbr;HFONT hf;TEXTMETRIC tm;CString x;int count=0;SelectObject(hdc,hp);SelectObject(hdc,hf);GetTextMetrics(hdc,&tm);hbr=(HBRUSH)GetStockObject(LTGRAY_BRUSH);SelectObject(hdc,hbr);Rectangle(hdc,105,20,140,340);while(p!=NULL){if(p->flag==0)hbr=(HBRUSH)GetStockObject(WHITE_BRUSH);else{if(count%2==0)hbr=CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,0));elsehbr=CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,0));count++;}SelectObject(hdc,hbr);Rectangle(hdc,20,20+p->start/2,100,20+(p->length+p->start)/2);x.Format("%d",p->start);TextOut(hdc,110,p->start/2+20-tm.tmHeight/2,x,strlen(x));x.Format("%d",p->start+p->length);TextOut(hdc,110,(p->start+p->length)/2+20-tm.tmHeight/2,x,strlen(x));p=p->next;}p=head;CString s="注:状态为0表示为空闲分区,\r\n1表示为进程使用分区\r\n----------------------\r\n";m_edit="";sum=0;while(p!=NULL){if(p->PID!=0){x.Format("%d",p->PID);s=s+"使用进程PID:"+x+"\r\n";sum=sum+p->length;}x.Format("%d",p->flag);s=s+"状态:"+x+"\r\n";x.Format("%d",p->start);s=s+"起始位置:"+x+"\r\n";x.Format("%d",p->length);s=s+"空间大小:"+x+"\r\n";x.Format("%d",p->length+p->start);s=s+"结束位置:"+x+"\r\n";s=s+"----------------------\r\n";p=p->next;}m_edit=s;UpdateData(FALSE);}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CMy2Dlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMy2Dlg::OnButton1(){// TODO: Add your control notification handler code herehead->flag=0;head->length=640;head->next=NULL;head->PID=0;head->start=0;OnPaint();}void CMy2Dlg::OnButton3(){// TODO: Add your control notification handler code hereUpdateData(TRUE);request_dlg.m_pid="";request_dlg.m_request="";if(sum>=640)MessageBox("存储空间已满!");else{if(request_dlg.DoModal()==IDOK){int pid=0,request=0,flag=0;for(int i=0;i<strlen(request_dlg.m_pid);i++)pid=pid*10+request_dlg.m_pid[i]-'0';for(i=0;i<strlen(request_dlg.m_request);i++)request=request*10+request_dlg.m_request[i]-'0';list *p=head,*q,*s=head;while(p!=NULL){if(p->flag==0&&p->length>=request&&request!=0){count++;flag=1;q=(list*)malloc(sizeof(list));q->flag=1;q->PID=pid;q->start=p->start;q->length=request;q->next=p;p->start=p->start+request;p->length=p->length-request;if(p==head)head=q;elses->next=q;if(p->length==0){q->next=p->next;}break;}s=p;p=p->next;}if(flag==0&&request!=0)MessageBox("申请空间失败!");OnPaint();}UpdateData(FALSE);}}void CMy2Dlg::OnButton4(){// TODO: Add your control notification handler code here UpdateData(TRUE);int pid=0,length=0,i=0,flag=0;list *p=head,*q=head,*s;recover_dlg.m_start="";recover_dlg.m_length="";if(count>0){if(recover_dlg.DoModal()==IDOK){for(i=0;i<strlen(recover_dlg.m_start);i++)pid=pid*10+recover_dlg.m_start[i]-'0';for(i=0;i<strlen(recover_dlg.m_length);i++)length=length*10+recover_dlg.m_length[i]-'0';while(p!=NULL){if(p->PID==pid&&length!=0&&p->flag==1){p->PID=0;p->flag=0;if(p==head){s=p->next;if(s!=NULL&&s->flag==0){p->length=p->length+s->length;p->next=s->next;}break;}else{s=p->next;if(q->flag==0&&s->flag==1){q->length=q->length+p->length;q->next=p->next;}if(q->flag==1&&s->flag==0){p->length=p->length+s->length;p->next=s->next;}if(q->flag==0&&s->flag==0){q->length=q->length+p->length+s->length;q->next=s->next;}break;}}q=p;p=p->next;}OnPaint();count--;}}elseMessageBox("无可回收内存!");UpdateData(FALSE);}void CMy2Dlg::OnHelp(){// TODO: Add your command handler code here CAboutDlg dlg;dlg.DoModal();}void CMy2Dlg::Onassign(){// TODO: Add your command handler code here OnButton3();}void CMy2Dlg::Onexit(){// TODO: Add your command handler code here OnOK();}void CMy2Dlg::Onrecover(){// TODO: Add your command handler code here OnButton4();}void CMy2Dlg::Oninit(){// TODO: Add your command handler code here OnButton1();}第七章参考文献[1]汤子瀛等.计算机操作系统[M].西安: 西安电子科技大学出版社[2]郑莉等.C++语言设计[M].北京:清华大学出版社[3]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社[4]孙钟秀等.操作系统教程[M].北京:高等教育出版社[5]陈向群.操作系统教程[M].北京:北京大学出版社总结通过此次课程设计过程,使我通过实际实践来更加了解计算机操作系统的知识,至少比以前更加了解生产者消费者问题,应该不会出现题不会做的现象,特别是通过做“生产者—消费者”经典同步问题,对进程的运行方式、以及如何确保计算机操作系统既保持同步又保持互斥的对临界资源的访问来同时进行多任务工作。