广东技术师范学院实验报告(Pv操作)

合集下载

操作系统作业

操作系统作业

实验报告课程名称:操作系统实验项目:Linux操作实验2实验时间:2012-3-26实验班级:10计本2总份数: 1指导教师:冯文辉计算机科学学院微机8室实验室二〇一二年三月二十六日广东技术师范学院实验报告学院:专业:班级:成绩:姓名:学号:组别:组员:实验地点:实验日期:指导教师签名:实验目的:练习data、cal、pwd等几个常用的Linux命令。

实验内容:本实验用到的命令有:date、cal、pwd、write、alias、uptime、man等1. 登录你的Linux系统。

2. 用命令date 显示当前的时间,给出显示的结果。

3.用cal命令显示下列年份的日历:4、52、1752、1952、2005、2006a)给出你显示以上年份年历的命令Cal 4Cal 52Cal 1752Cal 1952Cal 2005Cal 2006b) 1752年有几天,为什么?提示:在因特网上查找答案355天.1752年9月,大英帝国极其所属美洲殖民地的恺撒历法被格里高利教皇历法所取代。

由于恺撒历法比格里高利历法迟11天,因此9月2日当天改历法后,次日须为9月14日。

现行的公历是格利戈里历法,这个历法的是1582年教皇格利戈里根据恺撒大帝引进的算法改进的。

它采用的是闰年制也就是现行的制度,不过有一个需要注意的地方就是,这个历法并不是连续的,中间缺少了11天。

1752年9月2日之后的那一天并不是1752年9月3日,而是1752年9月14日。

也就是说,从1752年9月3日到1752年9月13日的11天并不存在。

抹掉这11天是由英国议会做出的决定。

所以要计算某年每个月的天数的,除了要考虑是否是闰年以外,还要考虑1752年的9月。

4. 用pwd显示你的主目录(home directory)名字,给出pwd显示的结果。

5. 使用write 命令和已经登录系统的一个朋友进行通信。

6. 使用alias命令显示系统中的命令的别名,给出显示的结果。

oracle实验2广东技术师范学院 (1)

oracle实验2广东技术师范学院 (1)

广东技术师范学院实验报告学院: 专业:班级: 成绩:姓名:学号:组别:组员:实验地点:实验日期:指导教师签名:实验名称: Oralce 控制文件与日志文件管理一、 实验目的:1.了解初始化参数文件的作用、类型、参数的查看和修改方法;2.掌握数据库的启动和关闭状态及相应命令;3.通过常用的数据字典了解ORACLE 数据库的基本信息;4.掌握控制文件和日志文件的日常维护操作。

二、实验内容:1.启动和关闭数据库;2.查看数据库参数文件及常用参数;3.利用数据字典查看数据库基本信息;4.完成参数文件、控制文件和日志文件的基本操作; 三、实验步骤(说明代码及运行结果)1.启动SQL*PLUS ,作为SYSDBA 身份连接到数据库,查看数据库当前使用的参数文件名及常用参数设置;以DBA 身份登录数据库:查看数据库当前使用的参数文件名:查看数据库当前常用参数设置:2.在SQL*PLUS中通过数据字典了解数据库的总体信息和结构信息;3.练习PFILE 和SPFILE文件的创建;4.对控制文件进行查看、移动、备份操作(控制文件分散到三个不同的目录存放);对控制文件进行查看:对控制文件进行移动:(控制文件分散到三个不同的目录存放)对控制文件进行备份:5.对日志文件进行查看、增加组和成员、日志切换操作(设置三个日志组、每组两个成员,分散到两个不同的目录存放)。

对日志文件进行查看:对日志文件进行增加组:(设置三个日志组)。

对日志文件进行增加成员:(每组两个成员,分散到两个不同的目录存放)。

对日志文件进行日志切换操作:四、实验问题及原因1、建立日志文件组时,提示not logged on原因:没有登录,登录即可2、对日志文件进行增加成员时,只能一个个加,十分麻烦,目前未找到更好的方法。

操作系统课程设计报告—PV操作

操作系统课程设计报告—PV操作

操作系统设计实验报告—— PV操作学院:计算机科学技术与通信工程学院班级:计算机0501班姓名:***学号:**********指导老师:***2008年 1月18 日一、操作系统课程设计题目LINUX系统管理实践与进程控制、进程通信实现进程通信题目:桌上有一只盘子,每次只能放入3只水果。

爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。

用P,V操作实现爸爸、妈妈、儿子、女儿进程的同步控制,橘子用orange表示,苹果用apple表示,空用empty 表示。

二、开发环境LINUX环境三、分析设计(一)实验原理1.原理:parents(包括father和mother)--> |+++|(缓冲区:存放3个水果)-->daughter和son。

Parents和daughter、son通过共享缓冲区进行通信,信号量用于对缓冲区互斥访问、对parents和daughter、son进行同步。

2.共有五个程序:control , father , mother,son,daughter.其中control是主控程序.control:实现对缓冲区的初始化,要最先执行,且只需要执行一次。

father:把一个苹果放入缓冲区:从屏幕输入一个字符串(32字节以内)。

Mother:把一个橘子放入缓冲区:从屏幕输入一个字符串(32字节以内)。

Son:从缓冲区取出一个橘子:从屏幕上输出一个字符串。

Daughter:从缓冲区取出一个苹果:从屏幕上输出一个字符串。

3.注意:信号量、共享缓冲区都是系统资源,其总个数是有上限的。

每个资源的id在系统中唯一,并且系统不会主动释放它们,所以要小心使用,及时释放。

本程序中:control在执行一次后(成功执行),信号量、共享缓冲区就会分配。

如果再执行它,control会提示资源已经分配,是否要释放它们?如果键入y(Y),则资源释放,此后执行father,mother,son,daughter都会报错。

广东技术师范学院实验报告(Pv操作)

广东技术师范学院实验报告(Pv操作)

广东技术师范学院实验报告实验P.V操作实验项目名称:生产与消费一、实验目的了解并掌握进程的同步和互斥。

二、实验要求1.分别改造P操作和V操作及生产、消费程序;2.在main()中利用循环通过相关的控制量,分别激活生产者和消费者;3.为了方简单起见,生产者和消费者只对单缓冲区进行操作,如:生产者将数值“1”填人缓冲区,而消费者将数值“0”填人缓冲区。

三、实验内容选用C语言编写程序,利用P.V操作解决单生产者和单消费者问题。

四、算法描述建立函数void producer(int &t)和void consumer(int &e)然后通过主函数int full=0; 满缓冲区数目int empty=1; 空缓冲区的数目int a[5]; 作为货架1表示有货,0表示没货void producer():若empty>0,即有空位,可以生产产品上架,执行p(empty),v(full)否则输出货架满void consumer():若full>0.即架上有产品可消费,执行p(full),消费产品后,执行v(empty) 主函数void main(){srand((unsigned)time(NULL));while(1){Sleep(1500);int n=rand()%2; 利用随机函数产生启动生产或者是消费函数的命令int m=rand()%1000; 用于结束生产if(m>950) 若大于950 生产停止{printf("\n生产停止!!!······\n");break;}switch(n){case 0: producer();break; 启动生产case 1: consumer();break; 启动消费}}五、源程序#include<time.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>int full=0;//满缓冲区int empty=1;//空缓冲区int a[5]={0};//生产函数void producer(){int i=0;if(empty>0){printf("生产了一个产品...\n\n");empty--;printf("超市上架产品...\n\n");a[i]=1;i=(i+1)%5;full++;}else{printf("超市货架满...\n\n");}}//消费函数void consumer(){int j=0;while(j>=10&&a[j]==1)j++;if(full>0&&j<5){a[j]=0;full--;printf("消费了一个产品...\n\n");empty++;}else{printf("请等待产品上架...\n\n");}}//主函数void main(){srand((unsigned)time(NULL));while(1){Sleep(1500);int n=rand()%2;int m=rand()%1000;if(m>990){printf("\n生产停止!!!······\n");break;}switch(n){case 0: producer();break;case 1: consumer();break;}}}}}六、结果与分析这是其中的一部分,下面演示下不成功的情况,就是把p(mutex)和p(empty)换下位置。

ss OP实训报告

ss OP实训报告

ss OP实训报告一、实训基本情况(一)实训时间:20xx年x月x日——20xx年x月x日(二)教学实验单位:xxxx有限责任公司(三)实训目的:1、通过对企业会计演示教学实验,这样可以系统地掌控企业会计核算的全过程,从而强化我们对学财务会计理论和科学知识的认知与重新认识,顺利完成从理论至课堂教学的心智过2、实训的内容涵盖了会计操作的全部基本技能——从建账、填制和审核原始凭证、记账凭证到登记账簿;从日常会计核算、成本计算到编制会计报告、年终结账3、全部教学实验注重综合性、完整性、超前性、和系统性。

以一个演示企业的特定财务会计期间为范围,将经济业务的来龙去脉与企业的生产经营有机地融合出来,将企业经济业务出现的前瞻性与市场经济的变化相配套,开阔视野,加深我们对社会、企业的介绍和重新认识,为即将步入社会的我们专门从事财会工作奠定较好的基础。

(四)实训完成情况:通过老师的指导,以xxxx有限责任公司为实训企业,经过一个月的实训,我基本上可以灵活的把所学的会计知识运用到会计实训当中。

能够熟练的对会计核算的各步骤进行系统操作实验,包括账薄建立和月初余额的填制、原始凭证、记账凭证的审核和填制,各种账薄的登记、对账、结账、编制报表等。

能够按计划完成指定工作。

(五)教学实验形式:手工财务会计二、实训过程及内容:1、会计核算。

根据资料的期初余额会计核算2、审核填制记账凭证。

基本要求有:记帐凭证各项内容必须完整,记帐凭证应该连续编号,记帐凭证的书写应清楚、规范,记帐凭证可以根据每一张原始凭证填制,除结帐和更正错误的记帐凭证可以不附原始凭证外,其他记帐凭证必须附有原始凭证,填制记帐凭证时若发生错误,应该重新填制,记帐凭证填制完经济业务事项后,如有空行应当自金额栏最后一笔金额数字下的空行处至合计数上的空行处划线注销。

3、尼里明细帐。

其中具体内容包含:三栏式明细帐、数量金额式、多栏式。

4、运用“t”形账户编制科目会总表。

这是为登总账所做的准备,它能反应这期间业务发生进有哪几个会计科目,并且能清楚的看到其借贷所发生的余额以及最后余额。

广东技术师范学院实验报告

广东技术师范学院实验报告

广东技术师范学院实验报告学院:广技师专业:计算机应用技术班级:07计专成绩:姓名:李祐祥学号:2007033335021 组别:组员:实验地点:实验日期:指导教师签名:实验名称:一、实验目的:综合运用HTML、CSS、JavaScript、ActiveX等技术,构建一个动态Web网站。

包含首页、注册界面、查询界面、信息浏览等界面。

二、系统分析和设计:(此处说明对网站系统的功能需求、总体框架设计、性能指标、详细设计模块、业务流程图等内容)用户主要具有以下需求:建立及维护网上商店所卖物品的信息、购买注册、取消订单、查看订单;基本信息管理:包括对商品编号、商品名称、图片、价格、订单号码;总体框架:本网站包含四个页面:主页面、注册页面、取消订单页面、查看订单页面;三、系统实现界面:(此处说明网站系统已实现的各个运行界面,并说明界面的输入输出操作)1)这是网站的主页面,包括商品的详细信息、通过点击“购买注册、取消订单、查看订单”等操作完成购买2)网站的注册购买页面,通过主页面的信息,在此页面输入购买人的姓名、信用卡类型、卡号、货号及数量3)网站的取消页面,在此页面可以进行订单的取消,通过输入在购买注册页面所得到的订单号可以进行取消行为4)网站的查看页面,在此页面可以进行订单的查看,通过输入在购买注册页面所得到的订单号可以进行查看行为四、总结(此处总结开发该系统所遇到的技术和设计问题、如何解决的、系统优缺点、归纳经验教训等内容)在做网上商店这个网站前曾经尝试建立学生信息系统,但发现凭我现在的能力还无法完成,所以还是选择做这个相对简单的网上商店网站。

在建立网站的过程中,遇到的最大问题就是链接数据库,在同学的协助以及查看相关书籍后终于解决。

系统的优点是界面简洁,购买商品简单快速;缺点很多:页面内容不够丰富,商品不多,没有后台管理。

广工电工实习实验报告

广工电工实习实验报告

广工电工实习实验报告
一、实验目的
本次实验旨在通过实际操作,让学生了解和掌握电工与电子技术的基本原理和实验方法,培养学生的动手能力和实际问题解决能力。

通过本次实验,学生应能熟练使用实验仪器和设备,理解并掌握8路彩灯循环控制电路的工作原理和设计方法。

二、实验原理
8路彩灯循环控制电路采用Verilog语言进行设计,主要涉及状态机和计数器。

电路有两个输入:时钟信号clk和复位信号rst,输出彩灯led。

电路内包含几个寄存器和参数,用于实现彩灯的循环控制。

其中,currentstate和nextstate两个寄存器用于存储彩灯的当前状态和下一个状态。

三、实验内容
1. 实验设备:示波器、函数发生器、电路板、编程器等。

2. 实验步骤:
(1) 按照电路图连接电路,确保电路连接正确。

(2) 使用编程器编写Verilog代码,并将其下载到电路板上的FPGA芯片中。

(3) 给电路板供电,观察并记录示波器和函数发生器显示的波形和数据。

(4) 分析实验结果,验证电路的正确性和代码的有效性。

四、实验结果与分析
实验结果显示,当给电路板供电后,彩灯按照预定的顺序循环点亮。

通过观察示波器和函数发生器的波形和数据,可以验证电路的时序和逻辑的正确性。

实验结果与预期相符,证明了电路设计和Verilog代码的正确性。

五、实验总结
通过本次实验,我们了解了8路彩灯循环控制电路的工作原理和设计方法,掌握了Verilog语言在电路设计中的应用。

同时,实验培养了我们的动手能力和实际问题解决能力。

实验三:PLSQL程序块简单应用

实验三:PLSQL程序块简单应用

广东技术师范学院实验报告学院: 计算机科学学院 专业: 计算机科学与技术(师资)班级: 成绩:姓名: 孔哥哥 学号: 组别: 组员: 实验地点: Win10电脑 实验日期: 指导教师签名:实验名称: 实验三:PL/SQL 程序块简单应用一、 实验目的:a)通过独立完成实验报告,让学生掌握以下技能: b)掌握SQL 的基本操作c)掌握简单PL/SQL 程序块的编写二、实验内容:a)建立表、索引、视图、同义词 b)对数据进行插入操作 c)编写一个PL/SQL 块三、实验步骤:a)启动SQL*PLUS ,以SCOTT 模式连接到数据库;b) 创建社保信息表,包含员工号、员工姓名、部门,工资,雇佣日期,社保缴费基数,月社保费等字段。

c)编写PL/SQL程序块ShowInfo,给定一个员工号就可以显示其姓名、性别等信息,如果该员工不存在则显示‘对不起,没有此员工!’d)编写PL/SQL程序块processInfo,对员工岗位进行判断,决定缴费基数,计算社保费,写入数据库中。

注意:社保缴费工资与实际工资可以不相同,社保缴费工资和每月养老保险费可以放在工资表里。

declarev_shebaojishu number(6);v_yueshebaofei number(7,2);beginfor v_emp in(select *from emp) loopcasewhen v_emp.job='CLERK' then v_shebaojishu :=2000;v_yueshebaofei :=v_emp.sal*0.07;when v_emp.job='SALESMAN' then v_shebaojishu :=3000;v_yueshebaofei :=v_emp.sal*0.08;when v_emp.job='MANAGER' then v_shebaojishu :=5000;v_yueshebaofei :=v_emp.sal*0.09;when v_emp.job='PRESIDENT' then v_shebaojishu :=7000;v_yueshebaofei :=v_emp.sal*0.11;else v_yueshebaofei :=0;end case;insert intoshebao(emp_empno,emp_ename,emp_job,emp_sal,emp_hiredate,shebaojishu,yuesheb aofei)values(v_emp.empno,v_emp.ename,v_emp.job,v_emp.sal,v_emp.hiredate,v_shebaojishu,v _yueshebaofei);end loop;end;/插入成功后输入 select * from shebao;查询是否成功写入数据库中四、实验问题及原因1.c步骤的时候没有分清%type和%rowtype以下是区别和用法:%TYPE:定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。

广东工业大学操作系统-实验报告-4份全

广东工业大学操作系统-实验报告-4份全
}*ready=NULL,*p;
typedef struct pcb PCB;/*pcb表*/
sort()/* 建立对进程进行优先级排列函数*/
{ PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super)))/*优先级最大者,插入队首*/
#define NULL 0
struct pcb {/* 定义进程控制块PCB */
char name[10];/*定义进程名称*/
char state;/*进程状态*/
int super;/*优先数*/
int ntime;/*需要运行的时间*/
int rtime;/*已占用的CPU时间*/
struct pcb* link;
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
2、源代码:
#include<stdio.h>
/*定义一个pcb的结构体*/
struct pcb
{ char name;/*进程名*/
int time;/*进程执行时间*/

操作系统实验报告-pv操作-读者写着-linux

操作系统实验报告-pv操作-读者写着-linux
四、 运行环境 运行平台:Linux 语言:c
五、 相关函数及操作 相关函数: (1) pthread_create UNIX 环境创建线程函数,具体格式: int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg); 返回值:若成功则返回 0,否则返回出错编号 返回成功时,由 tidp 指向的内存单元被设置为新创建线程的线程 ID。 attr 参数用于制定各种不同的线程属性。新创建的线程从 start_rtn 函数
本原理,增强了自己的动手能力。
课程设计中也实践了 windows 操作系统中创建进程,发现了两者的不同: linux 操作系统仅通过 pv 操作实现进程的同步与互斥,而 windows 操作系统 还有同步量,临界区的操作。
学会了运行及操作虚拟机,在课程设计中遇到了困难独立查找相关资料 也可以很快地解决。
sem_wait(&mutex) ; readcount -- ; if ( readcount == 0 && writecount>0 )
sem_post(&sw) ; sem_post(&mutex) ; } void writer(void *arg)
{ printf("Writer %d sents the writing require.\n",(int *)arg);
(4) sem_post 函数 sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在
这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机 制同样是由线程的调度策略决定的。

操作系统PV操作实验报告

操作系统PV操作实验报告

操作系统PV操作实验报告计算机科学与工程系《计算机操作系统》实验报告实验名称:_ PV操作成绩:___________专业班级:姓名:学号:实验日期 : 2012 年 03月19日软件环境:Windows XP~开发工具:vc++6.0硬件环境:CPU: interl 硬盘: 150 G 内存: 512 M 一、实验目的了解并掌握进程的同步和互斥二、实验内容选用C语言编写程序,利用P,V操作解决单生产者和单消费者问题。

三、实验要求1.分别改造P操作和V操作及生产、消费程序;2.在main()中利用循环通过相关的控制量,分别激活生产者和消费者;、3.为了简单起见,生产者和消费者只对单缓区进行操作,如:生产者将数字“1”填入缓冲区,而消费者将数值“0”填入缓冲区。

三、实验主要界面、程序及相关说明 1.主要程序代码Var mutex,empty,full: semaphore:=1,n,0;buffer:array[0,…,n-1] of item;in,out: integer:=0,0;beginparbeginproceducer: begin repeatproducer an item nextp;wait(empty);wait(mutex);buffer(in):=nextp;in:=(in+1) mod n;signal(mutex);signal(full);until false;endconsumer: beginrepeatwait(full);wait(mutex);nextc:=buffer(out); out:=(out+1) mod n; signal(mutex);signal(empty);consumer the item in nextc;until false;endparendend2.运行主界面如图三—2所示图三—23.相关说明假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用。

广东技术师范学院实验报告(进程调度)

广东技术师范学院实验报告(进程调度)

广东技术师范学院实验报告实验进程调度实验项目名称:进程调度一、实验目的掌握进程的调度方法。

二、实验要求1.先构造若干简单进程的PCB,其中应包含进程名称、队列指针;2.利用PCB构造就绪和等待两个队列;3.在main()中,可利用产生随机数函数random(int x)产生三个不同范围的数,它们分别对应进程的三种状态;当随机数落在某个范围时,便激活进程的相应状态和处理工作。

三、实验内容将进程的基本状态分为三种:运行、就绪、等待。

选用C语言编写程序,构造就绪和等待两个队列,根据不同的情况分别对就绪和等待两个队列进行出队和排队处理,并在计算机屏幕上给出相应的提示,如:“进程进入等待”、“进程进入就绪”、“进程开始运行”。

四、算法描述//PCB 结构struct PCB{int pname;int runtime;int waittime;struct PCB *next;}pcb[5];// 运行指针struct PCB *running;//就绪队列头指针struct PCB *ready;//等待队列头指针struct PCB *wait;for(;;){switch(sig){case 0://所有进程运行结束if(!proc_switch()){cout<<"\n所有进程运行结束!"<<endl; getchar();}break;case 1:case 2: proc_wait();break;case 3:case 4:case 5:case 6:case 7: proc(running);break;default:cout<<"\nerror!";exit(-1);}}cout<<endl<<endl<<"示范到此结束!"<<endl;}算法描述:(1)开始将进程3,4,5,6,7放在就绪队列,每个进程的运行时间都是6,然后从就绪队中选择第一个程序,进行运行.(2)运行时候采取了一个循环,循环次数为6,然后在每次循环中产生一个1-10随机数,若小于3,则请求资源失败,进入等待队列.(3)若没有进程进行,就绪队列为空时,等待不为空,就唤醒,然后重复(1),若等待位空,则结束.五、源程序#include<iostream.h>#include<time.h>#include<stdlib.h>#include<stdio.h>//PCB 结构struct PCB{int pname;int runtime;int waittime;struct PCB *next;}pcb[5];// 运行指针struct PCB *running;//就绪队列头指针struct PCB *ready;//等待队列头指针struct PCB *wait;int sig=0;///////////////////////////////以下是函数声明//利用循环实现延迟void delay();//模拟进程3-7void proc(struct PCB *running);//将node插入到head所指示的队列的尾部void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);//进程调度函数int proc_switch();//进程等待函数void proc_wait();//进程唤醒函数int proc_wakeup();//输出队列void Disp(PCB *L){if(L==NULL)cout<<"没有";else{while(L!=NULL){cout<<L->pname<<" ";L=L->next;}}}/////////////////////////////// 主函数void main(){int i;//初始化,创建进程3-7,置低优先级,等待时间为0,依次插入低优先级队列for(i= 0;i<5;i++){pcb[i].pname =i+3;pcb[i].waittime=0;pcb[i].runtime=6;InsertIntoQueueTail(&ready,&pcb[i]);}//等待队列和高优先级队列为空wait= NULL;cout<<endl<<endl<<endl<<"≡≡≡≡≡≡≡≡≡≡≡≡≡进程调度模拟≡≡≡≡≡≡≡≡≡≡≡≡≡≡"<<endl;cout<<"\n\n—————→苏锐生"<<endl;char m;shu: if(m!='y'){cout<<endl<<"请按《y》选择开始:";cin>>m;goto shu;}else{cout<<"\n下面为进程调度示例,进程调度开始:"<<endl;//模拟进程调度开始for(;;){switch(sig){case 0://所有进程运行结束if(!proc_switch()){cout<<"\n所有进程运行结束!"<<endl;getchar();}break;case 1:case 2: proc_wait();break;case 3:case 4:case 5:case 6:case 7: proc(running);break;default:cout<<"\nerror!";exit(-1);}}cout<<endl<<endl<<"示范到此结束!"<<endl;}}//功能:延迟一个时间片void delay(){int i,j;for(i=0;i<20000;i++)for(j=0;j<10000;j++){}}//程序运行void proc(struct PCB *running){int i;cout<<"\n现在运行的程序是:"<<running->pname<<" ";cout<<"现在在就绪的程序有:";Disp(ready);cout<<"现在在等待的程序有:";Disp(wait);cout<<endl;//当前进程执行running->runtime个时间片for(i=running->runtime;i>0;i--){//显示剩余的时间片cout<<"剩余的时间片为"<<i<<endl;//延迟delay();srand((unsigned)time(NULL));//产生一个1到10的随机数,若该随机数小于3,当前进程等待if((rand()%10+1)<3){cout<<"程序"<<running->pname<<"由于资源不足,程序开始进入等待。

实验指导书3

实验指导书3

武汉纺织大学管理学院实验指导书课程名称:操作系统实验项目名称:PV操作实现原理及其在同步与互斥中的应用实验学时:3实验地点:管理学院综合实验室(时间:11月12日)1.本实验项目目的(1)通过实验了解进程间同步与互斥实现方法;(2)熟悉PV操作实现原理及其在同步与互斥中的应用。

2.本实验项目内容及实验步骤内容:(1)调试下面的PV操作程序,描述其实现的基本过程。

(2)了解进程的进程间同步与互斥的实现原理,熟悉PV操作的使用方法,并观察其实现结果。

步骤:(1)PV操作程序实例:/*pv操作*/#include <windows.h>#include <stdio.h>#include <stdlib.h>typedef HANDLE Semaphore; // 信号量的Windows原型#define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义Windows下的V操作#define rate 1000#define CONSUMER_NUM 10 /* 消费者个数*/#define PRODUCER_NUM 10 /* 生产者个数*/#define BUFFER_NUM 4 /* 缓冲区个数*/char *thing[10] = {"牙膏", "毛巾", "方便面", "茶杯", "大米", "衣服", "鞋子", "电脑", "数码相机", "柜子"};struct Buffer{int product[BUFFER_NUM]; // 缓冲区int start, end; // 两个指针} g_buf;Semaphore g_semBuffer, g_semProduct, g_mutex; //信号灯DWORD WINAPI Consumer(LPVOID para) // 消费者线程{int i = *(int *)para; // i表示第i个消费者int ptr; // 待消费的内容的指针printf(" 消费者-%03d: 我要:\n", i);Sleep(300);while (1){printf(" 消费者-%03d: 卖给我!\n", i);P( ); // 等待产品P( ); // 有产品,先锁住缓冲区g_bufptr = g_buf.start; // 记录消费的物品g_buf.start = (g_buf.start+1)%BUFFER_NUM; // 再移动缓冲区指针V( ); // 让其他消费者或生产者使用g_bufprintf(" 消费者-%03d: 我要buf[%d] = %s\n", i, ptr, thing[g_buf.product[ptr]]); Sleep(rate*rand()%10+110);printf("消费者-%03d: 我需要buf[%d]= %s\n", i, ptr, thing[g_buf.product[ptr]]);V( ); // 消费完毕,并释放一个缓冲}return 0;}// 生产者线程DWORD WINAPI Producer(LPVOID para){int i = *(int *)para - CONSUMER_NUM;int ptr;int data; // 产品printf("生产者-%03d: 我来啦!\n", i);Sleep(300);while (1){printf("生产者-%03d: 我努力生产…………\n", i);Sleep(rate*rand()%10+110);data = rand()%10;printf("生产者-%03d: 生产一个东西data = %s!\n", i, thing[data]);P( ); // 等待存放空间P( ); // 有地方,先锁住缓冲区g_bufptr = g_buf.end; // 记录消费的物品g_buf.end = (g_buf.end+1)%BUFFER_NUM; // 再移动缓冲区指针V( ); // 让其他消费者或生产者使用g_bufprintf("生产者-%03d: 放到仓库buf[%d] = %s\n", i, ptr, thing[data]);g_buf.product[ptr] = data;Sleep(rate/2*rand()%10+110);printf("生产者-%03d: buf[%d] = %s做好了,大家买吧!\n", i, ptr, thing[g_buf.product[ptr]]);V( ); // 放好了完毕,释放一个产品}return 0;}int main(int argc, char *argv[]){// 线程技术,前面为消费者线程,后面为生产者线程HANDLE hThread[CONSUMER_NUM+PRODUCER_NUM]; // 线程计数//srand(time());DWORD tid;int i=0;// 初始化信号量g_mutex = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "mutexOfConsumerAndProducer"); //缓冲区互斥信号灯g_semBuffer = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "BufferSemaphone"); //有无存放空间g_semProduct = CreateSemaphore(NULL, 0, BUFFER_NUM, "ProductSemaphone"); //有无产品if ( !g_semBuffer||!g_semProduct||!g_mutex){printf("Create Semaphone Error!\n");return -1;}int totalThreads = CONSUMER_NUM+PRODUCER_NUM;// 开启消费者线程printf("消费者购买!\n");for (i=0; i<CONSUMER_NUM; i++){hThread[i] = CreateThread(NULL, 0, Consumer, &i, 0, &tid);if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);}printf("生产者生产!\n");for (; i<totalThreads; i++){hThread[i] = CreateThread(NULL, 0, Producer, &i, 0, &tid);if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);}// 生产者和消费者的执行WaitForMultipleObjects(totalThreads, hThread, TRUE, INFINITE);return 0;}(2)根据信号灯的设置原理,补齐程序中的空格;(3)调试进程同步与互斥程序,描述整个程序的执行过程;(4)描述程序执行结果,并抓取图片。

ppt实验报告总结

ppt实验报告总结

ppt实验报告总结篇一:PPT实验报告计算机实验报告课程名称:大学计算机基础实验名称:学院:专业:报告人:级:同组人:指导教师:实验时间:实验报告提交时间:教务处制一、实验目的①掌握演示文稿制作的基本过程②按时文稿播放的基本操作二、实验内容㈠PowerPoint的启动及其窗口⒈大纲窗格⒉演示文稿编辑区⒊备注区㈡演示文稿的创建、保存与打开⒈演示文稿的创建⒉插入对象⒊演示文稿的保存⒋演示文稿的关闭⒌演示文稿的打开㈢演示文稿视图⒈普通视图⒉幻灯片浏览视图⒊幻灯片放映视图㈣格式化幻灯片⒈文本格式化⒉修饰幻灯片背景⒊使用配色方案⒋修改母版⒌应用版式⒍应用模板㈤管理幻灯片⒈选择幻灯片⒉删除幻灯片⒊插入新幻灯片⒋移动与复制幻灯片㈥幻灯片的放映⒈默认的播放效果⒉设置幻灯片切换方式⒊设置动画㈦打印幻灯片㈧应用举例㈨PowerPoint的高级应用⒈个人简历的制作⒉旅游推荐的制作三、实验结果展示(1)PowerPoint的启动及其窗口执行“开始”→“所有程序”→“Microsoft office”→“Microsoft office PowerPoint 2022”命令,或双击桌面上的PowerPoint快捷图标,打开PowerPoint应用程序窗口(2)演示文稿的创建、保存与打开 1、演示文稿的创建建立第一张文稿启动PowerPoint后,演示文稿编辑区显示一张空白的幻灯片。

用户可以先单击标题文本框,输入文本“深圳大学信息学院”。

建立第二张文稿执行“插入”菜单的“新幻灯片”命令,PowerPoint会自动增加一张版式为“标题和文本”的新幻灯片。

2、插入对象插入对象在PowerPoint中可以插入的对象包括了文本、艺术字、表格、图形和图片等。

使用插入对象可以丰富幻灯片的内容。

使用“插入”菜单的“对象”命令,出现“插入对象”对话框。

选择“新建”则直接从应用软件中创建;选择“由文件创建”则插入内容为已存在的对象文件。

PowerPoint也提供了一些剪贴画,可使用“插入”菜单的“图片”→“剪贴画”命令插入剪贴画。

广东技术师范学院实验报告

广东技术师范学院实验报告

广东技术师范学院实验报告学院:计算机科学学院专业:计算机科学与技术班级:成绩:姓名:孔哥哥学号:组别:组员:实验地点:Win 10电脑实验日期:指导教师签名:实验名称: SQL语句练习一、实验目的:二、实验内容:以下查询基于SCOTT模式中的表1.查询每个雇员的编号、姓名、工作,并为这些列各起相应的中文别名。

2.查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。

3.查询工资介于1500和3000的雇员信息。

4.查询出雇员姓名中第二个字母为M的雇员信息。

5.查询雇员的信息,并按工资从高到低排序,若工资相同,则按员工编号排序。

6.查询所有雇员的编号、姓名、工资、部门编号、部门名称、工资在公司的等级(salgrade表)信息。

7.查找雇员的编号、姓名,及其领导的编号、姓名。

(注:使用外连接)三、实验步骤:以下查询基于SCOTT模式中的表1.查询每个雇员的编号、姓名、工作,并为这些列各起相应的中文别名。

2.查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。

3.查询工资介于1500和3000的雇员信息。

4.查询出雇员姓名中第二个字母为M的雇员信息。

5.查询雇员的信息,并按工资从高到低排序,若工资相同,则按员工编号排序。

6.查询所有雇员的编号、姓名、工资、部门编号、部门名称、工资在公司的等级(salgrade表)信息。

7.查找雇员的编号、姓名,及其领导的编号、姓名。

(注:使用外连接)四、实验问题及原因1.SCOTT用户默认是锁定的解锁同时修改密码:alter user scott identified by tiger account unlock;2.解锁完要记得切换用户3.第二题可以用not in条件是Not in (‘MANAGER’,’CLERK’,)。

《视频处理与传输》实验报告材料

《视频处理与传输》实验报告材料

《视频处理与传输》实验报告材料西南科技大学《视频处理与传输》实验报告题目:实验三设计者:专业班级:学号:指导教师:2014年12月23日一、实验目的1.了解和认识TCP的相关内容;2.学习和掌握TCP模块的C语言编程;3.尝试用C语言写出TCP有限状态机的实现函数二、实验内容TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,由IETF的RFC 793说明(specified)。

TCP在IP报文的协议号是6。

设计一个C程序实现TCP。

三、实验过程1、创建一头文件,包括C语言实现TCP的所有常量。

2、完成struct语句,它是TCP首部的说明语句。

3、完成struct语句,它是TCP报文的说明语句。

4、用C语言写出TCP有限状态机的函数。

四、实验结果及分析1、头文件#ifndef _TCP_H#define _TCP_H#include#include#include#include#include#include#include#include#define SERVERPORT 3333 /*服务器监听端口号*/#define BACKLOG 10 /*最大同时连接请求数*/#endif2、TCP首部:struct TCP_Header{u_char byte1;u_char byte2;u_char byte3;u_char byte4;}ip_address; /* IPv4 首部 */struct TCP_header{unsigned short SPortAddru_char ver_ihl; // 版本 (4 bits) + 首部长度 (4 bits) == 8 u_char tos; // 服务类型(Type of service)u_short tlen; // 总长(Total length)u_short identification; // 标识(Identification)u_short flags_fo;// 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits) u_char ttl; // 存活时间(Time to live)u_char proto; // 协议(Protocol)u_short crc; // 首部校验和(Header checksum)ip_address saddr; // 源地址(Source address)ip_address daddr; // 目的地址(Destination address)u_int op_pad; // 选项与填充(Option + Padding)}ip_header;3、struct TCP Packet{struct TCP_Header tcpHeader;uint16 source; /* Source port */uint16 dest; /* Destination port */int32 seq; /* Sequence number */int32 ack; /* Acknowledgment number */uint16 wnd; /* Receiver flow control window */uint16 checksum; /* Checksum */uint16 up; /* Urgent pointer */uint16 mss; /* Optional max seg size */uint8 wsopt; /* Optional window scale factor */uint32 tsval; /* Outbound timestamp */uint32 tsecr; /* Timestamp echo field */struct {unsigned int congest:1; /* Echoed IP congestion experienced bit */ unsigned int urg:1;unsigned int ack:1;unsigned int psh:1;unsigned int rst:1;unsigned int syn:1;unsigned int fin:1;unsigned int mss:1; /* MSS option present */unsigned int wscale:1; /* Window scale option present */unsigned int tstamp:1; /* Timestamp option present */tcpData; } };4、TCP有限状态机#include "global.h"#include "timer.h"#include "mbuf.h"#include "netuser.h"#include "internet.h"#include "tcp.h"#include "ip.h"voidtcp_output(tcb)register struct tcb *tcb;{struct mbuf *dbp; /* Header and data buffer pointers */struct tcp seg; /* Local working copy of header */uint16 ssize; /* Size of current segment being sent, * including SYN and FIN flags */uint16 dsize; /* Size of segment less SYN and FIN */int32 usable; /* Usable window */int32 sent; /* Sequence count (incl SYN/FIN) already * in the pipe but not yet acked */int32 rto; /* Retransmit timeout setting */if(tcb == NULL)return;switch(tcb->state){case TCP_LISTEN: case TCP_CLOSED:return; /* Don't send anything */}for(;;){memset(&seg,0,sizeof(seg)); /* Compute data already in flight */ sent = tcb->snd.ptr - tcb->snd.una;usable = min(tcb->snd.wnd,tcb->cwind);if(usable > sent)usable -= sent; /* Most common case */else if(usable == 0 && sent == 0)usable = 1; /* Closed window probe */else usable = 0; /* Window closed or shrunken */ssize = min(tcb->sndcnt - sent,usable);ssize = min(ssize,tcb->mss);if(!tcb->flags.force && sent != 0 && ssize < tcb->mss && !(tcb->state == TCP_FINWAIT1 && ssize == tcb->sndcnt-sent)){ ssize = 0; }if(!tcb->flags.synack && !Tcp_syndata){if(tcb->snd.ptr == tcb->iss)ssize = min(1,ssize); /* Send only SYN */else ssize = 0; /* Don't send anything */ }if(tcb->flags.force && tcb->snd.ptr != tcb->snd.nxt)ssize = 0;if(ssize == 0 && !tcb->flags.force)break; /* No need to send anything */tcb->flags.force = 0;/* Only one forced segment! */seg.source = tcb->conn.local.port;seg.dest = tcb->conn.remote.port;seg.flags.ack = 1; /* Every state except TCP_SYN_SENT */seg.flags.congest = tcb->flags.congest;if(tcb->state == TCP_SYN_SENT)seg.flags.ack = 0; /* Haven't seen anything yet */dsize = ssize;if(!tcb->flags.synack && tcb->snd.ptr == tcb->iss){ /* Send SYN*/ seg.flags.syn = 1;dsize--; /* SYN isn't really in snd queue */ /* Also send MSS, wscale and tstamp (if OK) */seg.mss = Tcp_mss;seg.flags.mss = 1;seg.wsopt = DEF_WSCALE;seg.flags.wscale = 1;if(Tcp_tstamps){seg.flags.tstamp = 1;seg.tsval = msclock(); } }if(ssize == 0)seg.seq = tcb->snd.nxt;else seg.seq = tcb->snd.ptr;tcb->last_ack_sent = seg.ack = tcb->rcv.nxt;if(seg.flags.syn || !tcb->flags.ws_ok)seg.wnd = tcb->rcv.wnd;else seg.wnd = tcb->rcv.wnd >> tcb->rcv.wind_scale;dbp = ambufw(TCP_HDR_PAD+dsize);dbp->data += TCP_HDR_PAD; /* Allow room for other hdrs */ If(dsize != 0){int32 offset;offset = sent;if(!tcb->flags.synack && sent != 0)offset--;dbp->cnt = extract(tcb->sndq,(uint16)offset,dbp->data,dsize);if(dbp->cnt != dsize){ /* We ran past the end of the send queue;* send a FIN */seg.flags.fin = 1;dsize--; } }if(dsize != 0 && sent + ssize == tcb->sndcnt)seg.flags.psh = 1;if(tcb->snd.ptr < tcb->snd.nxt)tcb->resent += min(tcb->snd.nxt - tcb->snd.ptr,ssize);tcb->snd.ptr += ssize;if(seq_gt(tcb->snd.ptr,tcb->snd.nxt))tcb->snd.nxt = tcb->snd.ptr;if(tcb->flags.ts_ok && seg.flags.ack){seg.flags.tstamp = 1;seg.tsval = msclock();seg.tsecr = tcb->ts_recent; } /* Generate TCP header, compute checksum, and link in data */ htontcp(&seg,&dbp,tcb->conn.local.address,tcb->conn.remote.address)if(ssize != 0){ /* Set round trip timer. */rto = backoff(tcb->backoff) * (4 * tcb->mdev + tcb->srtt);set_timer(&tcb->timer,max(MIN_RTO,rto));if(!run_timer(&tcb->timer))start_timer(&tcb->timer); /* If round trip timer isn't running, start it */if(tcb->flags.ts_ok|| !tcb->flags.rtt_run){tcb->flags.rtt_run = 1;tcb->rtt_time = msclock();tcb->rttseq = tcb->snd.ptr;tcb->rttack = tcb->snd.una; } } if(tcb->flags.retran)tcpRetransSegs++;elsetcpOutSegs++;ip_send(tcb->conn.local.address,tcb->conn.remote.address, TCP_PTCL,tcb->tos,0,&dbp,len_p(dbp),0,0); } }五、实验存在的问题及思考本次实验的主要内容是了解TCP协议,并通过实验编写C程序语言实现对tcp协议的检验。

实验报告

实验报告

广东技术师范学院实验报告规范(暂行)
一、每个学生每个实验项目一份实验报告。

二、实验报告内容一般包括以下几个内容:
1.实验项目名称
2.实验目的和要求
3.实验原理
4.主要仪器设备
5.实验内容及步骤
6.实验数据记录和处理
7.实验结果与分析
8.问题与讨论
9.实验预习报告(含以上1、2、3、4、5项,需经指导教师签字认可,附在实验
报告后)
注:各专业各课程的实验报告内容与格式可由指导教师根据实验具体情况做出要求。

三、实验报告第一页按学校统一的实验报告格式书写,附页用A4纸书写,字迹工整,
曲线要画在座标纸上,线路图要整齐、清楚(不得徒手画)。

如打印也应采用统一的实验报告的版头(A4纸)。

四、每学期将拟存档的学生实验报告按课程、实验项目分类装订成册,即每个实验
项目每门课程的所有实验报告装订成一本。

装订线在左侧,第一页加订实验报告封皮。

五、广东技术师范学院实验报告封皮范本(附后)。

六、广东技术师范学院实验报告范本(附后)。

七、广东技术师范学院实验预习报告范本(附后)。

实验报告
课程名称:
实验项目:
实验时间:
实验班级:
总份数:
指导教师:
学院实验室二〇一年月日
广东技术师范学院实验报告
学院:专业:班级:成绩:姓名:学号:组别:组员:
实验地点:实验日期:指导教师签名:
实验项目名称:
广东技术师范学院实验预习报告
学院:专业:班级:
姓名:学号:组别:组员:
实验地点:实验日期:指导教师签名:实验项目名称:。

最新广东技术师范学院实习报告范文

最新广东技术师范学院实习报告范文

最新广东技术师范学院实习报告范文班级:08光信息姓名:刘XX学号:20210446430XX成绩:实习名称:通信监理实习单位:广州市汇源通信建设监理有限公司实习地点:广州市天河区实习时间:2021年10月10日至2021年11月2日共6周指导教师签名:2021年10月10日我很荣幸到广州市汇源通信建设监理有限公司实习,被安排在第一分公司,担任通信工程现场监理员工作,现在不知不觉已经在单位实习一个多月了, 从开始的不了解这个全新的行业到现在的有所认识,过程中学到了很多新知识,也开宽了眼界。

这次实习是那么的与众不同。

它全面检验了我各方面的能力:学习、生活、心理、身体、思想等等。

是一块试金石,检验我能否将所学理论知识用到实践中去。

关系到我将来能否在这个充满挑战的社会顺利的立足,也是我牢固树立自信、自立、自强的关键,所以,我对它也是百分百的投入!一、公司的认识刚来一个新的公司实习,首先我们得对所在的公司有所了解,通过公司的介绍以及网上资料的收集,总结出公司的大致情况:广州市汇源通信建设监理有限公司成立于2001年03月,是中国通信服务股份有限公司(上市代号:0552.HK)旗下的全资专业公司,具有独立法人资格,是信息产业部首批通信建设监理甲级资质企业之一,连续多年雄踞全国通信监理企业十强之列。

公司具有国家甲级通信工程监理资质、信息系统工程监理资质、房屋建筑工程监理资质,管理经验丰富、专业服务水平高,承接过国内各类通信工程和信息系统工程监理业务,具有丰富的通信工程、信息系统工程、土建工程监理经验以及工程咨询经验,综合实力强。

公司下设八个部门、三个分公司:综合部、市场经营部、项目管理部、人力资源部、财务部、无线监理部、管线监理部、设备监理部、第一分公司、第二分公司、第三分公司。

公司办公环境优越,专业配备齐全,技术力量雄厚,已全面实施了监理标准化、管理精细化、办公自动化等先进的现代化管理手段。

二、实习目的与任务本次实习从2021年10月10日到11月20日,是我第一次真正意义上的实习,初次踏出校门,走进社会。

光影交互实验报告总结(3篇)

光影交互实验报告总结(3篇)

第1篇一、实验背景随着科技的飞速发展,交互设计领域不断涌现出新的技术和方法。

光影交互作为一种新兴的交互方式,凭借其独特的视觉效果和交互体验,逐渐受到广泛关注。

本次实验旨在通过实践操作,深入了解光影交互的设计原理、实现方法及其在实际应用中的价值。

二、实验目的1. 掌握光影交互的基本设计原理和实现方法。

2. 体验光影交互的交互效果,分析其优缺点。

3. 探索光影交互在实际应用中的潜力。

三、实验内容1. 光影交互设计原理本次实验首先介绍了光影交互的基本设计原理,包括:(1)光源:光源是光影交互的基础,包括自然光源和人工光源。

(2)投影:投影是将图像或视频投射到物体表面,形成视觉效果的常用方法。

(3)传感器:传感器用于捕捉用户的动作或位置,实现交互。

(4)算法:算法用于处理传感器数据,实现光影交互的效果。

2. 光影交互实现方法本次实验介绍了以下几种光影交互实现方法:(1)基于投影的交互:利用投影设备将图像或视频投射到物体表面,用户通过触摸、移动等动作与投影图像进行交互。

(2)基于传感器的交互:利用传感器捕捉用户动作,实现光影交互效果。

(3)基于虚拟现实技术的交互:利用虚拟现实设备,将用户带入虚拟场景,实现光影交互体验。

3. 光影交互应用案例本次实验选取了以下光影交互应用案例进行分析:(1)商场:利用光影交互技术,为商场营造独特的购物氛围,提升顾客购物体验。

(2)展览馆:利用光影交互技术,为展览馆增添趣味性,吸引更多参观者。

(3)公共艺术:利用光影交互技术,创作出独特的公共艺术作品,提升城市文化品位。

四、实验过程1. 设计阶段在实验过程中,我们首先对光影交互的设计进行了深入研究,分析了光影交互的设计原则和实现方法,并确定了实验方案。

2. 实现阶段根据实验方案,我们选择了一种光影交互实现方法,并利用相关设备和技术进行了实践操作。

3. 评估阶段在实验完成后,我们对光影交互的交互效果进行了评估,分析了其优缺点,并提出了改进建议。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广东技术师范学院实验报告
学院: 计算机科学学院 姓名: 苏锐生 实验地点: 实验 专业: 信息与计算科学 实验日期: 班级: 09 级 组员: 指导教师签名: 项目名称: 成绩:
学号: 2009034643025 组实验目的 了解并掌握进程的同步和互斥。 二、实验要求 1. 分别改造 P 操作和 V 操作及生产、消费程序; 2. 在 main()中利用循环通过相关的控制量,分别激活生产者和消费 者; 3. 为了方简单起见,生产者和消费者只对单缓冲区进行操作,如:生 产者将数值“1”填人缓冲区,而消费者将数值“0”填人缓冲区。 三、实验内容 选用 C 语言编写程序,利用 P.V操作解决单生产者和单消费者问题。 四、算法描述 建立函数 void producer(int &t)和 void consumer(int &e)
2
while(j>=10&&a[j]==1) j++; if(full>0&&j<5) { a[j]=0; full--; printf("消费了一个产品...\n\n"); empty++; } else{ printf("请等待产品上架...\n\n"); } } //主函数 void main() { srand((unsigned)time(NULL)); while(1) { Sleep(1500); int n=rand()%2; int m=rand()%1000; if(m>990) { printf("\n 生产停止! ! ! · · · · · ·\n"); break; } switch(n) { case 0: producer();break; case 1: consumer();break; } }
} }}六、结果与分析
3
这是其中的一部分,下面演示下不成功的情况,就是把 p(mutex)和 p(empty)换下位置
4
5
1
printf("\n 生产停止! ! ! · · · · · ·\n"); break; } switch(n) { case 0: producer();break; case 1: consumer();break; } }
启动生产 启动消费
五、源程序
#include<time.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> int full=0;//满缓冲区 int empty=1;//空缓冲区 int a[5]={0}; //生产函数 void producer() { int i=0; if(empty>0) { printf("生产了一个产品...\n\n"); empty--; printf("超市上架产品...\n\n"); a[i]=1; i=(i+1)%5; full++; } else{ printf("超市货架满...\n\n"); } } //消费函数 void consumer() { int j=0;
然后通过主函数 int full=0; 满缓冲区数目 int empty=1; 空缓冲区的数目 int a[5]; 作为货架 1 表示有货,0 表示没货 void producer():若 empty>0,即有空位,可以生产产品上架,执行 p(empty),v(full)否则输出 货架满 void consumer():若 full>0.即架上有产品可消费,执行 p(full),消费产品后,执行 v(empty) 主函数 void main() { srand((unsigned)time(NULL)); while(1) { Sleep(1500); int n=rand()%2; 利用随机函数产生启动生产或者是消费函数的命令 int m=rand()%1000; 用于结束生产 if(m>950) 若大于 950 生产停止 {
相关文档
最新文档