实验七同步机构报告

合集下载

临床试验总结报告的体例格式和内容要求

临床试验总结报告的体例格式和内容要求

临床试验总结报告体例和内容要求1.题目封面封面题页应包括如下内容:——试验题目——试验药物/研究产品的名称——试验用药品的适应症——如不能在题目中表明、则简要描述(以1~2句话)设计(平行、交叉、双盲、随机)比较(安慰剂、活性成分、剂量/反应),间隔,剂量和病例数。

——申办者姓名——原始规划与计划的确认(编码或数目,确认日期)——试验预期进度与进程安排——研究开始数据(受试的第一位病人,或任何其它数据)——后期研究终末数据(最终一个受试者的名称、或终末研究者完成的数据)——试验研究完整的数据(最后的受试者)——参加者或合作者或主办者责任医务官等人士的名称和职责。

——药业公司名称/主办方签名(在公司/主办者中负责研究报告的人,公司/主办方联络者的姓名,电话和传真号码,以备在回顾研究报告提出问题时,在此页码或应用的字母有所表明)。

——表明该项研究是否在优良临床试验管理规范(GCP)条件下进行的包括应达到的基本文件、研究设施、人员知识结构,统一培训等。

——报告的资料(通过题目和资料,确定与该项研究相同的任何其它较早报告)2.内容概述应提供—个临床试验的主要内容提要(通常限于3页内容),该提要应包括试验题目、研究人员、研究出版物名称、试验时间、试验目的、试验方法、试验研究样本、诊断及进入研究的主要标准、试验的产品、剂量、给药方式及批号、治疗持续时间、参考的治疗、剂量、给药方式及批号、评价标准(有效性、安全性)、统计方法、总结——结论(效能结论、安全性结论、结论)及报告日期。

该提要应包括表明结果的数字资料,而不仅仅是文字和P 值(见附件l,研究内容概述)。

3.内容目录内容表格应包括:——页码或其它每一个部分的局部资料,包括归纳性表格、图和图表。

——附录、列表和任何能提供的病例报告形式的汇总和定位。

4.名词、术语缩写和定义应提供报告中使用的—系列缩写符、特殊的或不常用的术语,或测量单位定义,应拼写出缩写术语,并在文中首次出现时表明其全称。

杠杆平衡条件实验报告

杠杆平衡条件实验报告

杠杆平衡条件实验报告
实验目的:
通过实验,验证杠杆平衡条件,并掌握杠杆平衡条件的原理和
方法。

实验仪器和材料:
1. 杠杆平衡条件实验装置。

2. 不同重量的物体。

3. 测量工具(尺子、秤等)。

实验步骤:
1. 将杠杆平衡条件实验装置放置在水平台面上,并调整使其水平。

2. 在杠杆的两端分别放置不同重量的物体,记录下各自的重量。

3. 观察杠杆的平衡状态,并记录下杠杆两端的高度差。

4. 根据实验数据,计算出杠杆平衡条件的实际情况。

实验结果:
经过实验测量和计算,得出杠杆平衡条件的实际情况符合理论
预期。

在不同重量的物体作用下,杠杆两端的高度差可以通过简单
的数学计算得出平衡条件。

实验结论:
通过本次实验,我们验证了杠杆平衡条件的原理,并掌握了杠
杆平衡条件的实际应用方法。

杠杆平衡条件是一个重要的物理原理,在工程和日常生活中都有广泛的应用价值。

掌握了这一原理,可以
更好地理解和应用杠杆的力学原理,为工程设计和实际操作提供了
重要的理论依据。

典型机构认知实验报告

典型机构认知实验报告

竭诚为您提供优质文档/双击可除典型机构认知实验报告篇一:实验一典型机构认识与分析实验实验九凸轮机构运动分析实验一、实验目的:1、熟悉掌握理论与实践相结合的学习方式;2、培养动手能力和创新意识,培养对现代虚拟设计和现代测试手段的灵活运用能力;3、通过实测和软件仿真了解不同运动规律的盘形凸轮的运动,了解圆柱凸轮的运动;4、掌握凸轮廓线的测试方法;5、通过实测曲线和仿真曲线的对比,分析两者之间差异的原因。

二、JTJs-Ⅲ实验台简介:1、结构组成1-安装底座2-凸轮支座3-同步带轮4-同步带5-电机支座6-步进电机7-齿轮齿条支座8-尖顶从动件9-导轨10-被测凸轮(盘形)11-圆柱凸轮12-轴承座13-齿条14-小齿轮15-齿轮支架16-角位移传感器图1JTJs-Ⅲ实验台结构组成2、主要技术参数1)凸轮原始参数:盘形凸轮机构1#凸轮:等速运动规律凸轮基圆半径ro=40mm;尖顶从动件;推杆升程h=15mm;推程转角Ф=150o、远休止角Фs=60o、回程转角Ф,=1620;凸轮质量m1=0.765㎏。

2#凸轮:等加速等减速运动规律凸轮基圆半径ro=40mm;尖顶从动件。

推杆升程h=15mm;推程转角Ф=180o、回程转角Ф,=180o;凸轮质量m1=0.765㎏。

3#凸轮:3-4-5多项式运动规律凸轮基圆半径ro=40mm;从动件滚子半径rt=7.5mm;推程转角Ф=180o、回程转角Ф,=180o;凸轮质量m1=0.852㎏。

4#凸轮:余弦加速度运动规律凸轮基圆半径ro=40mm;尖顶从动件;推杆升程h=15mm;推程转角Ф=180o、回程转角Ф,=180o;凸轮质量m1=0.768㎏。

5#凸轮:正弦加速度运动规律凸轮基圆半径ro=40mm;尖顶从动件;推杆升程h=15mm;推程转角Ф=150o、远休止角Фs=30o、回程转角Ф,=150o、近休止角Ф,s=30o;凸轮质量m1=0.768㎏。

6#凸轮:改进等速运动规律凸轮基圆半径ro=40mm;尖顶从动件;推杆升程h=15mm;推程转角Ф=150o、远休止角Фs=30o、回程转角Ф,=150o、近休止角Ф,s=30o;凸轮质量m1=0.768㎏。

迈克尔逊干涉仪实验报告

迈克尔逊干涉仪实验报告

迈克尔逊干涉仪实验报告实验日期,2021年10月20日。

实验地点,XX大学物理实验室。

实验人员,XXX。

实验目的:
1.了解迈克尔逊干涉仪的基本原理;
2.学习如何使用迈克尔逊干涉仪进行干涉实验;
3.掌握干涉条纹的观察和测量方法。

实验仪器和材料:
1.迈克尔逊干涉仪;
2.激光器;
3.半反射镜、全反射镜、分束板等光学元件;
4.测量仪器,尺子、微调器等。

实验步骤:
1.搭建迈克尔逊干涉仪;
2.调整激光器和光学元件,使得光路稳定;
3.观察干涉条纹,并利用测量仪器测量条纹间距等参数。

实验结果:
1.成功搭建了迈克尔逊干涉仪,并调整至稳定状态;
2.观察到清晰的干涉条纹,并利用测量仪器测量了条纹间距;
3.记录并整理了实验数据,得出了干涉条纹的特征参数。

实验结论:
1.通过本次实验,我们深入理解了迈克尔逊干涉仪的工作原理,掌握了干涉条纹的观察和测量方法;
2.实验结果与理论值基本吻合,证明了迈克尔逊干涉仪的实际
应用价值。

存在问题和改进方案:
1.在实验过程中,光路调整需要更加细致,下次可以加强对光
学元件的调整;
2.实验数据的记录和整理可以更加规范和详细,以便后续分析
和报告撰写。

总结:
本次迈克尔逊干涉仪实验取得了一定的成果,但也发现了一些
不足之处。

在今后的实验中,我们将更加认真地进行实验操作,不
断提高实验技能和数据处理能力。

医疗机构数据同步操作说明

医疗机构数据同步操作说明

医疗机构数据同步操作说明一、功能背景医疗机构数据在医疗联网注册系统已有录入,为避免重复劳动,也保证数据的权威性,国家监督系统与医疗联网注册系统承建单位协商开发了交换接口,对需要注册系统数据的省份,每天从注册系统获取近期变化的医疗数据。

但由于异构系统在结构,业务数据处理方面的复杂性,定时批量数据交换机制可能存在数据交换遗漏情况。

为解决这个问题,国家监督系统为医疗机构数据交换提供了单条数据交换功能,用户可以根据情况需要,从注册系统交换指定的医疗机构信息,作为批量交换机制的有效补充。

二、功能说明医疗机构提供了两种交换方法,以解决不同的交换需求方法1:先查询到指定的医疗机构,之后交换用户可以通过返回结果判断交换操作是否成功,还可以对比医疗机构交换前后表单项值的变化。

a、查询->查看医疗机构信息b、查看界面,点击“联网系统”按钮查询最新数据。

C、查看“联网系统”信息,点击“更新数据”按钮,将信同步到信息报告。

方法2:进入综合查询->被监督单位->选择医疗卫生专业,出现联网系统按钮进入联网注册系统医疗机构查询界面查出的数据可以批量更新到信息报告库,但出于审批流程中的数据不会被更新返回结果结果1:数据交换成功,自动显示此单位信息列表结果2:未能从医疗联网注册系统获取数据提示结果3:联网系统医疗机构数据非本省数据提示结果4:获取联网系统数据失败出现异常时提示结果5:数据获取失败,已经记录并将继续跟踪解决结果6:中心端网络异常,请联系技术支持电话结果处理1、数据交换成功(结果1),从医疗联网注册系统获得了数据。

2、未能从医疗联网注册系统获取数据(结果2),检查医疗机构名称是否正确,确认联网系统是否存在此数据。

3、从医疗联网获得该单位信息不在本省范围内!这种情况需要具确认是否是本省信息,如果确定为本省数据,但依然提示此信息,请联系管理员,反馈情况,查找问题原因。

4、获取数据出错(结果4),请联系系统管理员,向系统管理员反馈情况,查找交换失败原因5、数据获取失败,此记录已被记录并将继续跟踪解决6、中心端网络异常,请联系技术支持电话数据说明关于数据的更新和新增:点击“更新数据”时,将会更新或新增数据,如果信息报告系统不存在对应省份的医疗机构信息,将会把新的数据保存到信息报告,如果存在更新此单位信息。

检验科差错事故登记报告制度(五篇)

检验科差错事故登记报告制度(五篇)

检验科差错事故登记报告制度1.检验科应建立差错事故登记本,由本人或发现人员及时登记所发生之差错事故的经过、原因、后果等,并及时组织讨论。

2.发生差错或医疗事故后科室应及时报告医务部、院领导;立即采取措施抢救病人,对重大事故应做好善后工作。

3.发生严重差错或事故的各种有关记录,检验报告,检验试剂应妥善保管封存,血液标本应保留三天,不得擅自涂改和销毁各种记录。

4.发生严重差错或事故后,科主任应组织讨论,做到“三不放过”(即未找出事故原因不放过,责任者未吸取教训不放过,未制订出防范措施不放过),并提出处理意见,报医务部。

第四篇:检验科报告书写制度,检验科差错事故、医疗纠纷处理登记制度检验科报告单书写制度一、报告单书写要字迹工整、二、按照《全国检验操作规程》中的规范格式书写。

三、应当遵照国家法定计量单位报告。

四、报告者必须书写全名以示负责。

五、报告单发出前应详细核对检查结果。

检验科差错事故医疗纠纷处理登记制度一、差错事故处理登记报告制度(一)全体检验人员要以对患者高度负责的精神和严肃的法制观念,严格防止医疗事故的发生。

实验室建立差错事故医疗纠纷登记报告制度,一旦发生应及时登记报告,及时处理和整改。

(二)事故。

因违反医疗卫生管理法律、行政法规、部门规章和操作规程,造成检验失误,导致患者人身损害并经事故鉴定委员会鉴定、认定的事件。

(三)差错。

由于责任性不强、不认真执行规章制度,不遵守操作规程或技术因素而引发检验错误,但对患者未造成人身损害的事件。

(四)登记报告。

1、凡发生差错事故,当事人或发现者应立即向质控组长报告,尽快进行补救并填写差错事故记录本,严重者及时报告科主任,必要时报告院医务科、院领导。

2、一般差错,应填写差错登记本,并注明差错性质及补救办法。

3、月末由组长将当月发生差错情况填表报给科主任。

无论发生一般差错、严重差错或检验事故均应由实验室及时登记,查明情况,保留样本,主动向科主任报告,不得隐瞒,并要迅速采取措施,把损害控制到最小程度。

【报告】典型机构认知实验报告

【报告】典型机构认知实验报告

【关键字】报告典型机构认知实验报告篇一:实验一机构认知实验报告实验一机构认知实验报告姓名:学号:班级:实验日期:成绩:一、思考题1.什么是机器?什么是机构?两者有何区别?2.铰链四杆机构有哪几种类型?四杆机构中曲柄存在的条件是什么?3. 凸轮机构的主要特点是什么?其主要由哪几部分组成?4. 齿轮机构的主要特点是什么?根据轮齿的形状齿轮分为哪几种类型?什么是渐开线?渐开线是如何形成的? 渐开线有什么性质?5. 什么是定轴轮系?什么是是周转轮系?何为行星轮系?何为差动轮系?篇二:实验一机构及机械零件认知实验实验一机构及机械零件认知实验一、实验目的1、通过观察典型机构运动的演示,初步了解《机械原理》课程所研究的各种常用机构的结构、类型、特点及应用实例。

2、学会根据各种机械实物模型,绘制机构运动简图,分析和验证机构自由度。

3、初步了解《机械设计》课程所研究的各种常用零件的结构、类型、特点及用。

4.了解各种标准零件的结构形式及相关的国家标准。

5.了解各种传动的特点及应用。

6.增强对各种零部的结构及机器的感性认识。

二、实验方法陈列室展示各种常用机构的模型及各种零件,实验教师只作简单介绍,提出问题,供学生思考,学生通过观察,对常用机构的及基本零件的结构、类型、特点有一定的了解,增强对学习机械基础课程的兴趣。

三、实验内容1.机构认知(一) 机器的认识机器是由一个机构或几个机构按照一定运动要求组合而成的。

(二) 平面四杆机构分成三大类:铰链四杆机构;单移动副机构;双移动副机构。

(三) 凸轮机构把主动件的连续转动,变为从动件严格按照预定规律的运动。

只要适当设计凸轮廓线,便可以使从动件获得任意的运动规律。

凸轮机构有三部分:凸轮、从动件、机架。

(四) 齿轮机构根据轮齿的形状齿轮分为:直齿圆柱齿轮、斜齿圆柱齿轮、圆锥齿轮及蜗轮、蜗杆。

根据主、从动轮的两轴线相对位置,齿轮传动分为:平行轴传动、相交轴传动、交错轴传动三大类。

常用气动回路实验报告

常用气动回路实验报告

一、实验目的1. 理解和掌握常用气动回路的组成和原理。

2. 学会气动回路的搭建和调试方法。

3. 熟悉气动元件的性能和作用。

4. 提高对气动系统故障分析和排除的能力。

二、实验原理气动回路是指利用压缩空气作为动力源,通过各种气动元件和管道组成的系统,实现对工作机构的控制。

常用气动回路主要包括方向控制回路、压力控制回路、速度控制回路和其它控制回路。

三、实验仪器与设备1. 气动回路实验台2. 气源处理装置3. 气动元件:单向阀、双作用气缸、三位五通换向阀、节流阀、压力表等4. 管道及连接件四、实验内容1. 方向控制回路(1)搭建单作用气缸换向回路,使用三位五通换向阀控制气缸的伸缩运动。

(2)搭建双作用气缸换向回路,使用三位五通换向阀控制气缸的伸出和缩回。

2. 压力控制回路(1)搭建压力控制回路,使用压力继电器和压力调节阀控制气缸的压力。

(2)搭建压力保压回路,使用蓄能器和压力调节阀保持气缸的压力稳定。

3. 速度控制回路(1)搭建速度控制回路,使用节流阀控制气缸的伸出和缩回速度。

(2)搭建气液联动速度控制回路,利用压缩空气和液压油控制气缸的速度。

4. 其它控制回路(1)搭建缓冲回路,保护气缸在运动过程中避免冲击。

(2)搭建同步动作回路,使多个气缸同时动作。

五、实验步骤1. 根据实验要求,选择合适的气动元件和管道。

2. 按照实验原理图,将元件和管道连接成完整的气动回路。

3. 检查回路连接是否正确,确保没有漏气现象。

4. 打开气源,启动实验台。

5. 观察实验现象,分析回路工作原理。

6. 调整元件参数,观察回路性能变化。

7. 记录实验数据,进行分析和总结。

六、实验结果与分析1. 方向控制回路(1)单作用气缸换向回路:当三位五通换向阀处于中位时,气缸不动;当换向阀处于左位时,气缸伸出;当换向阀处于右位时,气缸缩回。

(2)双作用气缸换向回路:当三位五通换向阀处于中位时,气缸不动;当换向阀处于左位时,气缸伸出;当换向阀处于右位时,气缸缩回。

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

实验七:同步机构实验报告一、实习内容模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。

二、实习目的进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。

我们把若干个进程都能进行访问和修改的那些变量称为公共变量。

由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。

为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。

一般说,同步机构是由若干条原语——同步原语——所组成。

本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。

三、实习题目模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

[提示]:(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。

V操作原语V (s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。

这两条原语是如下的两个过程:procedure p (var s: semaphore);begin s: = s-1;if s<0 then W (s)end {p}procedure v (var s: semaphore);egin s: = s+1;if s 0 then R (s)end {v}其中W(s)表示将调用过程的进程置为等待信号量s的状态;R(s)表示释放一个等待信号量s的进程。

在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实习中可把上述的semaphore直接改成integer。

(2) 生产者——消费者问题。

假定有一个生产者和一个消费者,生产者每次生产一件产品,并把生产的产品存入共享缓冲器以供消费者取走使用。

消费者每次从缓冲器内取出一件产品去消费。

禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内以产品。

假定缓冲器内可同时存放10件产品。

那么,用PV操作来实现生产者和消费者之间的同步,生产者和消费者两个进程的程序如下:B: array [0..9] of products;s1, s2; semaphore;s1: =10, s2: =0;IN, out: integer;IN: =0; out: =0;cobeginprocedure producer;c: products;beginL1:Produce (c);P (s1);B[IN]: =C;IN: =(IN+1)mod 10;V (s2);goto L1end;procedure consumer;x: products;beginL2: p (s2);x: =B[out];out: =(out+1) mod10;v (s1);consume (x);goto L2end;coend.其中的semaphore和products是预先定义的两个类型,在模拟实现中semaphore 用integer代替,products可用integer或char等代替。

(3) 进程控制块PCB。

为了记录进程执行时的情况,以及进程让出处理器后的状态,断点等信息,每个进程都有一个进程控制块PCB。

在模拟实习中,假设进程控制块的结构如图12-1。

其中进程的状态有:运行态、就绪态、等待态和完成态。

当进程处于等待态时,在进程控制块PCB中要说明进程等待原因(在模拟实习中进程等待原因是为等待信号量s1或s2);当进程处于等待态或就绪态时,PCB中保留了断点信息,一旦进程再度占有处理器则就从断点位置继续运行;当进程处于完成状态,表示进程执行结束。

图(4) 处理器的模拟。

计算机硬件提供了一组机器指令,处理器的主要职责是解释执行机器指令。

为了模拟生产者和消费者进程的并发执行,我们必须模拟一组指令和处理职能。

模拟的一组指令见图12-2,其中每条指令的功能由一个过程来实现。

用变量PC来模拟“指令计数器”,假设模拟的指令长度为1,每执行一条模拟指令后,PC加1,提出下一条指令地址。

使用模拟的指令,可把生产者和消费者进程的程序表示为图12-3的形式。

定义两个一维数组PA[0..4]和SA[0..4],每一个PA[i]存放生产者程序中的一条模拟指令执行的入口地址;每个SA[i]存放消费者程序中的一条模拟指令执行的入口地址。

于是模拟处理器执行一条指令的过程为:取出PC之值,按PA[PC]或SA[PC]得模拟指令执行的入口地址,将PC之值加1,转向由入口地址确定的相应的过程执行。

(5) 程序设计本实习中的程序由三部分组成:初始化程序、处理器调度程序、模拟处理器指令执行程序。

各部分程序的功能及相互间的关系由图12-4至图12-7指出。

·初始化程序:模拟实习的程序从初始化程序入口启动,初始化工作包括对信号量s1、s2赋初值,对生产者、消费者进程的PCB初始化。

·处理器调度程序:在计算机系统中,进程并发执行时,任一进程占用处理器执行完一条指令后就有可能被打断而让出处理器由其它进程运行。

故在模拟系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它成为非运行态,由处理器调度程序按随机数再选择一个就绪进程占用处理器运行。

四、实习报告(1) 实习题目。

(2) 打印源程序并附上注释。

(3) 从键盘上输入一组字符,由生产者每次读入一个字符供消费者输出。

运行模拟程序,打印依次读入的字符和经消费者输出的字符。

(4) 把生产者和消费者进程中的P操作、V操作都改成空操作指令,观察在两者不同步的情况下可能出现的与时间有关的错误。

打印依次读入的字符和经消费者输出的字符。

1)实验题目:模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

2)实验源代码:分为四个头文件。

1、a.h头文件代码如下:#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() */#include <iostream>using namespace std;#include <time.h>#define BUF 10 //缓存的大小#define MAX 20 //最大可以输入的字符2、b.h头文件代码如下://数据结构的定义和全局变量typedef struct Pcb{char name[10]; //进程名char state[10]; //运行状态char reason[10]; //若阻塞,其原因int breakp; //断点保护struct Pcb *next; //阻塞时的顺序}Pcb,*link;int s1,s2; //信号量link p1;//生产者进程link c1;//消费者进程char str[MAX]; //输入的字符串char buffer[BUF]; //缓冲池int len; //输入长度int sp=0; //string的指针int in=0; //生产者指针int out=0; //消费者指针char temp; //供打印的临时产品char rec_p[MAX];//生产记录int rp1=0;//生产记录指针char rec_c[MAX];//消费记录int rp2=0;//消费记录指针link ready; //就绪队列link b_s1; //s1阻塞队列link b_s2; //s2阻塞队列int pc; //程序计数器int count; //字符计数器int con_cnt; //消费计数器3、c.h头文件代码如下:void init(); //初始化void p(int s); //P操作void v(int s); //V操作void block(int s);//阻塞函数void wakeup(int s);//唤醒函数void control(); //处理机调度void processor();//处理机执行void print(); //打印函数void init(){ //初始化s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者strcpy(p1->name,"Producer");strcpy(p1->state,"Ready");strcpy(p1->reason,"Null");p1->breakp=0;p1->next=NULL;c1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为消费者strcpy(c1->name,"Consumer");strcpy(c1->state,"Ready");strcpy(c1->reason,"Null");c1->breakp=0;c1->next=NULL;ready=p1;ready->next=c1;//初始化为生产进程在前,消费进程在后c1->next=NULL;b_s1=NULL;b_s2=NULL;//阻塞进程为NULLpc=0;con_cnt=0; //消费计数器}void p(int s){if(s==1){ //p(s1)s1--;if(s1<0)block(1); //阻塞当前生产进程else{printf("\t* s1信号申请成功!\n");ready->breakp=pc; //保存断点}}else{ //p(s2)s2--;if(s2<0)block(2);//阻塞当前消费进程else{printf("\t* s2信号申请成功!\n");ready->breakp=pc; //保存断点}}}void v(int s){if(s==1){ //v(s1)s1++;if(s1<=0)wakeup(1); //唤醒生产进程ready->breakp=pc; //保存断点}else{ //v(s2)s2++;if(s2<=0)wakeup(2);//唤醒消费进程ready->breakp=pc; //保存断点}}void block(int s){//阻塞函数的定义link p;int num1=0;int num2=0;if(s==1){//生产进程strcpy(p1->state,"Block");//改变状态strcpy(p1->reason,"S1");//说明原因p=b_s1;while(p){num1++;p=p->next;//p的值为NULL,表示队尾}if(!b_s1)b_s1=p1;elsep=p1;p1->next=NULL;printf("\t* p1生产进程阻塞了!\n");ready->breakp=pc; //保存断点ready=ready->next;//在就绪队列中去掉,指向下一个num1++;}else{//消费进程strcpy(c1->state,"Block");strcpy(c1->reason,"S2");p=b_s2;while(p){num2++;p=p->next;//p的值为NULL,表示队尾}if(!b_s2)b_s2=c1;elsep=c1;ready->breakp=pc; //保存断点ready=ready->next;//在就绪队列中去掉,指向下一个c1->next=NULL;printf("\t* c1消费进程阻塞了!\n");num2++;}printf("\t* 阻塞的生产进程个数为:%d\n",num1);printf("\t* 阻塞的消费进程个数为:%d\n",num2);}void wakeup(int s){//唤醒函数的定义link p;link q=ready;if(s==1){ //唤醒b_s1队首进程,生产进程队列p=b_s1;b_s1=b_s1->next;//阻塞指针指向下一个阻塞进程strcpy(p->state,"Ready");strcpy(p->reason,"Null");while(q)//插入就绪队列q=q->next;q=p;p->next=NULL;printf("\t* p1生产进程唤醒了!\n");}else{ //唤醒b_s2队首进程,消费进程队列p=b_s2;b_s2=b_s2->next;//阻塞指针指向下一个阻塞进程strcpy(p->state,"Ready");strcpy(p->reason,"Null");while(q->next)//插入就绪队列q=q->next;q->next=p;p->next=NULL;printf("\t* c1消费进程唤醒了!\n");}}void control() //处理器调度程序{int rd;int num=0;link p=ready;if(ready==NULL) //若无就绪进程,结束return;while(p) //统计就绪进程个数{num++;p=p->next;//最终p变为NULL}printf("\t* 就绪进程个数为:%d\n",num);time_t t;srand((unsigned) time(&t));rd=rand()%num;//随机函数产生随机数if(rd==1){p=ready;ready=ready->next;ready->next=p;p->next=NULL;strcpy(ready->state,"Run");strcpy(ready->next->state,"Ready");}elsestrcpy(ready->state,"Run");pc=ready->breakp;}void processor(){ //模拟处理器指令执行if(strcmp(ready->name,"Producer")==0) //当前进程为生产者switch(pc){case 0://produceprintf("\t* 生产者生产了字符%c\n",str[sp]);rec_p[rp1]=str[sp];//添加到生产记录sp=(sp+1)%len;pc++;ready->breakp=pc; //保存断点break;case 1: //p(s1)pc++;p(1);break;case 2: //putbuffer[in]=rec_p[rp1]; //放到缓冲区printf("\t* %c字符成功入驻空缓存!\n",buffer[in]);rp1++;in=(in+1)%BUF;pc++;ready->breakp=pc; //保存断点break;case 3: //v(s2)pc++;printf("\t* 释放一个s2信号\n");v(2);break;case 4://goto01printf("\t* 生产进程goto 0 操作\n");pc=0;count--; //剩余字符个数减1printf("\t* 剩余字符count=%d个\n",count);ready->breakp=pc; //保存断点if(count<=0){ //生产结束printf("\t* 生产者结束生产!\n");strcpy(p1->state,"Stop");strcpy(p1->reason,"Null");ready->breakp=-1;ready=ready->next;//在就绪队列中去掉}}else //当前进程为消费者switch(pc){case 0: //p(s2)pc++;p(2);break;case 1: //getprintf("\t* 消费者取字符!\n");temp=buffer[out];out=(out+1)%BUF;pc++;ready->breakp=pc; //保存断点break;case 2: //v(s1)pc++;printf("\t* 释放一个s1\n");v(1);break;case 3: //consumeprintf("\t* 消费了字符%c\n",temp);rec_c[rp2]=temp;//添加到消费记录rp2++;con_cnt++;if(con_cnt>=len){strcpy(c1->state,"Stop");//完成态c1->breakp=-1;return;}pc++;ready->breakp=pc; //保存断点break;case 4: //goto0printf("\t* 消费进程goto 0 操作\n");pc=0;ready->breakp=pc; //保存断点}}void print(){int i,j;printf("————————生产者消费者模拟———————\n");printf("* 模拟过程的字符串为:\t");printf("%s\n",&str);printf("* 已生产:");for(j=0;j<=rp1;j++)printf("%c",rec_p[j]);printf("\n* 空缓存:");for(j=rp2;j<=rp1;j++)printf("%c",buffer[j]);printf("\n* 已消费:");for(j=0;j<=rp2;j++)printf("%c",rec_c[j]);printf("\n———————进程控制块的信息————————\n");printf("进程名\t\t状态\t等待原因\t断点\n");printf("%s\t%s\t%s\t\t%d\n\n",p1->name,p1->state,p1->reason,p1->breakp);printf("%s\t%s\t%s\t\t%d\n",c1->name,c1->state,c1->reason,c1->bre akp);printf("———————————————————————\n");printf("1.继续 0.退出\n");scanf("%d",&i);if(i==0){exit(0);}}4、main头文件代码如下:#include "a.h"#include "b.h"#include "c.h"void main(){printf("*生产者消费者模拟\n");printf("—————————\n");printf("*请输入字符串:\n");scanf("%s",str); //string数组存放将要产生的字符len=strlen(str);count=len; //输入字符的个数init(); //初始化while(con_cnt<len) //消费完所有的字符为结束{system("cls"); //清屏操作printf("—————————模拟指令流程————————\n");control(); //处理器调度程序processor(); //模拟处理器指令执行print(); //输出显示各个信息}printf("\n程序结束!\n"); }3)。

相关文档
最新文档