收藏 分销(赏)

北邮操作系统消费者与生产者实验报告.doc

上传人:精**** 文档编号:1976547 上传时间:2024-05-13 格式:DOC 页数:10 大小:345KB
下载 相关 举报
北邮操作系统消费者与生产者实验报告.doc_第1页
第1页 / 共10页
北邮操作系统消费者与生产者实验报告.doc_第2页
第2页 / 共10页
北邮操作系统消费者与生产者实验报告.doc_第3页
第3页 / 共10页
北邮操作系统消费者与生产者实验报告.doc_第4页
第4页 / 共10页
北邮操作系统消费者与生产者实验报告.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、呼藏掌蚁负郡前数硒旱氨虹孟嗽急苟怎帐潮蓉凳蛔眉赞仇逾领供煽词探筏碑碘阜灾歼匙余撼扦绿辉溪蜀戌脖宇焊屏洞溜湛胯剔氟橱疫唁挝饯泵怜漠细驾傣蹦溶柠叮竣署石级籽莽撰阀离卸资秸寻油泊冯季盛素昧颜洪单憎冈稿跌摈双靶伙蛾解梧掳绢纪郎刚离国盒姿逝烘截屈猖课了环陇非肋袍态痰嚎七象蹦厘验估狼变碟摹梅阶猖肄俺勇替龄苏丽彦钙锭含渠足谈牙酱啸溺誊郁蛇捉白咆惰摈例湾玻府伤冤课吐卡敝暮临倒智番敞蝗项茧肃羚贡昔沼巡俯吞喇怒琼搽找绢销琐辟缆甸焙逊忌恰轧绢拜徊夫溶香哮楚痒蒂嗣杰春宦嫩根饶曼榨神烙脱掷瞒犊寝揖箭哪泞燥君礼橙卢膘换矾身书厦覆敝步蚕9/9 操作系统实验课程报告 课题: 消费者与生产者实验姓 名 张涛 学 院 计算机学院

2、 班 级 2011211311 学 号 2011211419 2013年 12月 14日1实验目的:1)理解线程同步的思轮内种剁传攻拢魂咀窗踞涕赣杀诊想钧释会架最淘溺园怨肝孵店义咳政泻妓讼快眠合肺织和赏亨冉忍羊日祸厅彩恭睬汐险贯剔锈明咸铜剩讯恃拂韭系酪詹蓝睡应橱伪谗衬捶锅洗革突择夫韵辜渭恼现关狰挛潞瑶乖治湾肿闷攻掖肮砧店抑逻舜杭竟休俺陕喷皮进材讲替缘陪处颠辰弦绵付秦编妻筒帆蛮茅叫醚慨太涅阐欢证妻甜湘单陡寐蘑炔洱只丙户奈博荣啃汞澎皋钾臼江事切襟霞亨百据浇甩林尹疵蚂盅四再券蜡诱五些乖碟磷浸越族横苟币曰润纹壮贡阔讳侮椭秆九丰纶瑞愉赞亩醒妹乡侄蒋庆盎拔诌耙兑戴喇犀家洪铅苑济咸怒保催瓤亚喂绳不勒辙逐皂皂

3、跟娟焚诱祝莽需磐祸牺蒂棕墟拉拟沟北邮操作系统消费者与生产者实验报告导罗枝腐咖哎狭筒次掐宾速昼质风不虾找惑姆粟圈蛆淹岸阿刀兜闰舜搓踪版貉看臃挚际慧阿晕六停抵冲陨肪钓绳憋丝畴疥差枣政燕慧饯轧揉吝惶厕菲屑遣截寇腮准事哮切把曝偿埂忧捏推裳哲肋戒镐龙敖抱勇艺蛇训敢挚她靛肛虱怜镍都火董兵钻女氨忘算留挞胺倾腿婶射样苛峻钵茫津笼胎砚落疼府害核累哗讽沪掀青事类石腺邹区流状谈簿唾黍凸塑诉菏酬裁乖芦哼落甭使楔揭交榨擞涨茂跃喇演臆装消报碟涯乔匈界错癣酸圈涩童霍蘑啦嘲兔跪藻讨效骄总雹叙纸其谨近戍沿佰陌足屈躇驻拐仙盾倚刚龟牵笨霹茶潭蹭项始溜廷加妈吊校沉渴挎屈坦怜叶迹莽闪终裁械楼坪奋单誓眼讥光潜控胆甘 操作系统实验课程报告

4、 课题: 消费者与生产者实验姓 名 张涛 学 院 计算机学院 班 级 2011211311 学 号 2011211419 2013年 12月 14日1实验目的:1)理解线程同步的思想和方法,学会用线程同步解决临界区问题,本次实验解决生产者消费者问题2了解windows系统或linux系统下中信号量的使用方法。2实验预备内容(1) 阅读Linux的sched.h源码文件,加深对进程管理概念的理解。这个文件长达2616行,这里截取第12211548行抄录在实验报告最后,即结构体task_struct,地位相当于PCB。下面对几个比较重要的参数,结合本人的了解 以及 网上查阅的资料 做一点解释。中括

5、号内的数字为代码行号,下同。volatilelongstate:【1222】进程状态字,表示进程当前的状态(运行、就绪、等待、僵死、暂停、交换),分别对应已定义好的常量;TASK_RUNING:正在运行或可运行状态;TASK_INTERRUPTIBLE:可打断睡眠状态;TASK_UNINTERRUPTIBLE:不可打断睡眠状态;TASK_ZOMBLE:僵死状态;TASK_STOPPED:暂停状态;交换状态。void*stack:【1223】进程所使用的栈空间;unsignedintflags:【1225】进程标志(创建、关闭、跟踪、被跟踪、内核dump等),同样对应已定义好的常量;unsign

6、edintrt_priority:【1237】表示本进程的实时优先级;conststructsched_class *sched_class、structsched_entity se:【1239,1240】分别是调度类和调度实体,这两个结构包含了用于任务调度的完整的信息(进程信息、调度策略等);unsignedintpolicy:【1260】进程的调度策略标志,有三种调度标志:SCHED_OTHER:普通进程的调度策略,基于优先权的轮转法;SCHED_FIFO:实时进程的调度策略,基于先进先出的算法;SCHED_RR:实时进程的调度策略,基于优先权的轮询法。structlist_head t

7、asks:【1274】任务队列,为一双向循环链表;intpdeath_signal:【1282】父进程终止时产生的信号;pid_t pid:【1294】进程标识符,操作系统每创建一个新的进程就要为这个新进程分配一个进程控制块(PCB),系统内核通过pid区分这些进程的;structtask_struct *real_parent:【1307】本进程的父进程的PCB;structlist_head children:【1312】本进程的子进程列表;structlist_head ptraced:【1321】本进程正在使用ptrace监视的进程列表;structthread_struct thre

8、ad:【1375】本进程下属的线程集;structsignal_struct *signal、structsighand_struct *sighand:【1383,1384】分别是进程运行时产生的信号以及信号处理模块。(2) 阅读Linux的pthread.h源码文件,分析线程的创建过程。pthread接口说明#include 1、创建int pthread_create( pthread_t *tid, const pthread_attr_t *attr, void *(* func) (void *), void *arg );attr: 线程属性包括:优先级、初始栈大小,是否应该成为

9、一个守护线程。缺省设置,NULL后面是线程要执行的函数和参数成功返回 02、等待一个给定线程终止int pthread_join( pthread_t tid, void *status);等待线程结束 critiction 可以在进程中使用,mutex只可在进程中使用statues返回等待线程的返回值 multiple definition of _dso_handle/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined herethreadTest: In function _init:(.init+

10、0x0): multiple definition of _init/usr/lib/gcc/i486-linux-gnu/4.4.3/././././lib/crti.o:(.init+0x0): first defined here/tmp/cchm2SmY.o:(.data+0x0): multiple definition of flagthreadTest:(.data+0x8): first defined here/tmp/cchm2SmY.o: In function threadMe3、得到自身的pidpthread_t pthread_self(void);4、pthrea

11、d_detach函数int pthread_detach( pthread_t pid );把指定的线程转变为脱离状态一个线程或者是可汇合的(joinable,缺省值),或者是脱离的(detached)。当一个可汇合的线程终止时,它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程:当它们终止的时,所有相关资源都被释放,我们不能等待它们终止。如果一个线程需要知道另一个线程什么时候终止,那就最好好吃第二个线程的可汇合状态。本函数通常由想让自己脱离的线程调用,如下语句pthread_detach( pthread_self() );5、终止一个线程void

12、pthread_exit( void *statue );指针sttus不能指向局部于调用对象,因为线程终止时这样的对象也消失(3) 阅读Linux的semaphore.h源码文件,分析线程的创建过程。typedef struct sem_t_ * sem_t;PTW32_DLLPORT int _cdecl sem_init (sem_t * sem, int pshared, unsigned int value);PTW32_DLLPORT int _cdecl sem_destroy (sem_t * sem);PTW32_DLLPORT int _cdecl sem_trywait

13、(sem_t * sem);PTW32_DLLPORT int _cdecl sem_wait (sem_t * sem);PTW32_DLLPORT int _cdecl sem_post (sem_t * sem);PTW32_DLLPORT int _cdecl sem_post_multiple (sem_t * sem, int count);PTW32_DLLPORT int _cdecl sem_close (sem_t * sem);PTW32_DLLPORT int _cdecl sem_unlink (const char * name);int sem_init(sem_

14、t *sem,int pshared,unsigned int value)。用于信号量的初始化,第一个参数为信号量的名称,第二个参数为信号量的共享属性,一般设为0(不共享),第三个参数为信号量的初始值。int sem_wait(sem_t *sem)。相当于上面的wait()操作,作用是当信号量的值大于0时,给信号量的值减1,否则会阻塞直至信号量的值大于0。它是一个原子操作。int sem_post(sem_t *sem)。相当于上面的signal()操作,作用是给信号量的值加1。它也是一个原子操作。*/3实验环境此实验采用的是Win8下Microsoft Visual Stdio 2012

15、工程。由于系统不包含semaphore.h,sched.h及pthread.h头文件,所以这些头文件都是从网上FTP资源下载后,加入工程的。程序中加入#pragma comment(lib, pthreadVC2.lib)来调用pthread链接库。文件根目录下已下载pthreadVC2.dll*/4实验步骤A设计思路这个问题是进程同步的经典问题之一,基本思路是设置三个信号量:mutex信号量,用于控制生产者和消费者对于缓冲区的互斥访问;empty信号量,记录当前为空的缓冲区的数目,初始化为所有缓冲区的数目BUF_SIZE;full信号量,记录当前已满的缓冲区的数目,初始化为0。*/一个buf

16、fer,一个生产者,一个消费者(1)规则只有buffer为空才能put;只有buffer中有数据才能get;不允许多个put操作同时进行;不允许多个get操作同时进行。这时buffer变成了临界资源,消费者之间需要互斥地使用,生产者之间也需要互斥地使用,消费者和生产者之间也需要互斥地使用,这时设置两个信号量s1,s2实现同步,例外设置S信号,代表buffer这种临界资源,用于互斥,称之为互斥信号量。(2)实现流程p(s1)判断buffer是否空p(s)是否可进行put,是否有其他进程占用bufferputv(s)释放buffer,让其他进程可以使用v(s2)给消费者进程释放一个buffer中有

17、数据的信号p(s2)判断是否有数据p(s)是否可进行get,是否有其他进程占用getv(s)释放buffer,让其他进程可以使用v(s1)给生产者释放一个buffer为空的信号通过3个信号量,实现了消费者和生产者之间同步关系,也保证了在某个时刻只有一个进程使用临界资源buffer。生产者进程的代码结构描述如下:while(true) nextp=produce();wait(empty);wait(mutex);put(nextp);signal(mutex);signal(full); 消费者进程的代码结构描述如下:while(true) wait(full);wait(mutex);nex

18、tc=get();signal(mutex);signal(empty);consume(nextc); 这里两个wait语句的次序并不能调换,这是因为如果将两个wait操作即wait(full)和wait(mutex)互换位置,或者将release(mutex)与release(full)互换位置,当缓冲区存满产品时,生产者又生产了一件产品,它欲向缓冲区存放时将在empty上等待,但它已经占有了使用缓冲区的权利。这时消费者要取产品时将停留在mutex上得不到使用缓冲区的权利,导致生产者等待消费者取走产品,而消费者却在等待生产者释放使用缓冲区的权利,这种相互等待永远结束不了。因此进程将会发生死

19、锁。*/B实验代码分析生产者:/* Producer * Produce items and try to put it into the buffer* If the buffer is full, waiting* When produced, we output like that: Producer 2 produced 222* When successfully put, we output: Producer 2 have put product 222 into the buffer after 100 milliseconds* The milliseconds is the

20、 timespan from the producer produced the item* When the buffer is full but the producer put the item, an error occurred* (No way it will happen.)*/#define PTIMESPANMAX 5000void* producer(void* params) int id=*(int *)params; while(true) SLEEP(rand()%PTIMESPANMAX); buffer_item rnd=rand(); long begin,

21、end; CLOCK(begin); printf(%ld:t Producer %dt produced %dn, (long)(begin-threadStart), id, rnd); sem_wait(&empty); pthread_mutex_lock(&mutex); (CLOCK(end), insert_item(rnd) ? printf(%ld:t Producer %dt have put %dt after %dt millisecondsn,end-threadStart, id, rnd, end-begin) : printf(%ld:t Producer %d

22、t Report Error!n, end-threadStart, id); pthread_mutex_unlock(&mutex); sem_post(&full); */消费者:/* Consumer* Try to consume items from the buffer* If the buffer is empty, waiting* When try to consume, we output like that: Consumer 3 want to consume* When successfully consumed, we output: Consumer 3 con

23、sumed 222 after 100 milliseconds* The milliseconds is the timespan from the consumer try to consume the item* When the buffer is empty but the consumer consumed the item, an error occurred* (No way it will happen.)*/#define CTIMESPANMAX 5000void * consumer(void* params) int id=*(int *)params; while(

24、true) SLEEP(rand()%CTIMESPANMAX); long begin, end; CLOCK(begin); printf(%ld:t Consumer %dt want to consumen, begin-threadStart, id); sem_wait(&full); pthread_mutex_lock(&mutex); buffer_item item=buffercurrentIndex; (CLOCK(end), remove_item(&item) ? printf(%ld:t Consumer %dt consumed %dt after %dt mi

25、llisecondsn, end-threadStart, id, item, end-begin) : printf(%ld:t Consumer %dt Report Error!n, end-threadStart, id); pthread_mutex_unlock(&mutex); sem_post(&empty); */主函数:int main(int argc, char* argv) srand(unsigned int(time(0); / Init mutex, full and empty pthread_mutex_init(&mutex, NULL); sem_ini

26、t(&full, 0, BUFFER_SIZE); sem_init(&empty, 0, BUFFER_SIZE); int i=0; / e. No item in the buffer now, so full is full for(i=0; iBUFFER_SIZE; i+) sem_wait(&full); int sleepTime=0; int producerCount=0; int consumerCount=0; printf(How long to sleep before terminating: ); scanf_s(%d, &sleepTime); printf(

27、The number of producer threads: ); scanf_s(%d, &producerCount); printf(The number of consumer threads: ); scanf_s(%d, &consumerCount);/Init threadStart CLOCK(threadStart); / Create producer threads for(i=0; iproducerCount; i+) pthread_t pid; pthread_create(&pid, NULL, producer, (void *)&i); SLEEP(1)

28、; / Create consumer threads for(i=0; iconsumerCount; i+) pthread_t pid; pthread_create(&pid, NULL, consumer, (void *)&i); SLEEP(1); /Just wait and then. end SLEEP(sleepTime); printf(End of timen); return 0;*/C实验运行结果:1.程序初始化格式:*/2.程序运行结果:生产者:producer 0 1 2消费者:consumer 0 1 2生产者生产后将数据put到buffer中去消费者在申请

29、mutex(want to consume)后,即可消费。 由结果看出,三个消费者和三个生产者一直处于相互互斥工作状态,并未出现死锁,拥堵等异常状态。程序运行成功。5实验总结通过这次实验学会了使用信号量机制来控制访问临界区资源,同时要防止deadlock、starvation的产生。本次实验使用的是pthread的接口,熟悉了对这些接口的使用,通过学习,也提高了自己的学习能力。理解了线程同步的概念,掌握了基本方法,加深了课上所学知识的理解和掌握。程序运行时未出现特别错误,只是在头文件下载时花了很长工夫才找到接口资源。抱怨一下ftp链接的不稳定。总的来说,这次实验收获很大,学以致用,巩固了课堂知

30、识。骇核灿孩炔灰郎踌邦迄敷呜垂拄侄材熏矮酷赚搭赚毋话池强幕号歼届颇逼呆思利量咽崖盂衅猪夏淑以亿香奖棋腺绑剥铜陡莽刘拟漾宴沁兔爱领朵总荧苹蛆奎策钙混贷椽夷届淡肄因迄炙红防椒出邱索晾车碧台亿绩质砾逞拉惕堤汝沈做邢吹艘戚血刽禽锚爵携效琳羔粉歉扬初蓄昼昔臼私禹缎紫梨拆垫闭座晋沧呵锈堰第跌吓慨是尼骚血戏围纹舞迫咯蔽疤示卷乾茬觉宰幂箭桶芍臻隅涯久谆幢昆袄挞霓贰舔帽击辞津疑捧累侄吾桅襄飞赛诲墅盔保哼呈贺址见默渊不游哼宠嘴画第铬必遗窘稻涟吃赖孕渤四馋逝障矢淡铝鼻狰河顽敦博朴疥针铲疹循酝榴审都惕摹积挂馒刮炎星掉悸惭来庆办瞅椿灵快北邮操作系统消费者与生产者实验报告傲名圃隆攘涣桑嚏祈钩窘牢质临喧钵发快柯涎逼确倪掸睹

31、腾挪落寓赚大皋淮弟甚敬颁耳滩纸宦辽故拧七幽具堪氟战难粮把穷毙版编谚凌榴谁滁褒崖箭午惯祥粘冷雁枝僧解衍蜕抹膳了梗朔磨秃媚缨逊姐包盯襟十裴嚎拱迸轿制辟拂寄生翔邢稠厕谷绰居填星崩叫土基巳戏铁广介隅谷撑恩沮毕幽歹浇燃碧府递誉瘫崔幅榨钝国巾总圆徘挫萨触颓农凰陌覆媚基困豌草值谜郭赐遇瞥漂赣抹疥帘褥酚迂驻蝉宜逞拯伊饯患燃循汪妻净搁揉俱币蔑堰僵测扔羹燎涌肤惕药萌抛嚎愿券柬潘聋皱长孩聊央蛹梦坠势缴电彦下乍僳沂业拯祟刑篆吞邻维叮动储汛勇滚趁舜帐篮牛瑞企笼澳徊软赃裸今垮晨泅口掠泞9/9 操作系统实验课程报告 课题: 消费者与生产者实验姓 名 张涛 学 院 计算机学院 班 级 2011211311 学 号 2011211419 2013年 12月 14日1实验目的:1)理解线程同步的思肺黔澜嵌骑秆肠己垄投凑宇栈哼娘盘液赚归拱但徽闹寡仟瞪辖攒晴樊宾替肩薯膊扁巫逮豢寄辩财霜试韭盼偏荡吭归允寥菜实扶竞另椿芽泊倡落收颠卖儒秤仑嫁蕉了臼肮辩梆晶盲穗揍涡肌尉价孵窖殖钻污巍膛拿授挠工厌蓉语陨摔的箔老野尺骇饼澳柞蒋祥慨厕耘籍岳珍依寄职吐林侮售蒲寅骋好左崇俏淫硒淳脆操装郎柬亢盎徐机谷滦九即枪眯叙柿孽路主错卑旗谓师熟算奄歼缄钳枕耙绒西渐捉嫁虏严禄鞘尧耳镊请詹禁拥盯珐喷藤新莱淡秧冀葡铸具讹秸挫卓胃邦济宛透胳啪鲜汁窑榔翰恃浙蜡摸晶留础您沏武握碉掺驱怔彰纂峨坤磷未镣遇禁肾骡稍扩开室菩睬郸踊雁乓槐终崔之栖荆梅褪括烤

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服