linux下利用互斥实现线程访问共享资源(含源文件) (2)_第1页
linux下利用互斥实现线程访问共享资源(含源文件) (2)_第2页
linux下利用互斥实现线程访问共享资源(含源文件) (2)_第3页
linux下利用互斥实现线程访问共享资源(含源文件) (2)_第4页
linux下利用互斥实现线程访问共享资源(含源文件) (2)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、“计算机操作系统”课程设计大作业一、实验题目: linux下利用互斥实现线程访问共享资源二、实验目的:掌握线程创建和终止,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的通信。三、实验内容事先了解操作系统中经典的生产者-消费者问题,安装linux虚拟机(可以用virtualbox或者vmware软件)。在linux下创建三个生产者线程(P1,P2,P3)和一个消费者线程(C1),生产者和消费者线程共享一个长度为2KB的环型公共缓冲区,生产者向缓冲区写入消息,消费者从缓冲区中取走消息显示到屏幕。只要缓冲区未满,生产者可将消息送入缓冲区;只要缓冲区未空,消费者可从缓冲区取走一个消息。每

2、个消息具下列结构格式:消息长度(1个字节),消息内容(n个字节)。每个生产者每隔2秒生产一个消息加入缓冲区,并把消息产生时间和内容记录在一个文本文件中。P1每次生产的数据为26个大写字母, P2每次生产的数据为26个小写字母,P3每次生产的数据为10个阿拉伯数字。消费者C1每隔3秒读取缓冲区中的一个消息并将消息内容显示到屏幕上。用两种方法(不采线程用互斥和采用线程互斥技术)编写上述功能的程序,对比两种程序运行结果有何区别?不采线程用互斥时存在什么问题?备注:编程中用到的函数创建线程函数:pthread_create互斥锁初始化:pthread_mutex_init互斥锁加锁:pthread_m

3、utex_lock互斥锁解锁:pthread_mutex_unlock四、实验要求:每人完成一份大作业实验报告。报告分设计思想、数据定义、处理流程、源程序、运行结果截图、设计体会等部分。1) 给出数据定义和详细说明;2) 给出实现思想和设计流程;3) 调试完成源程序;4) 屏幕观察运行结果;5) 总结自己的设计体会;编程语言及操作系统平台不限。五、提交内容本大作业每个人必须单独完成。最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、算法思路及流程图、心得体会。大作业必须以WORD附件的形式提交。大作业严禁抄袭。发现抄袭一律以不及格论。大作业内容要完整,一定要有算法思路、流程图、

4、心得体会、运行输出信息截屏等内容,如果只提交源代码则大作业成绩记为不合格。 2016-10-20linux下利用互斥实现线程访问共享资源一、原理的理解生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。多

5、个生产/消费者在有界缓冲上操作。它利用N个字节的共享内存作为有界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费者应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者线程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者线程就从该单元中读出字符,并报告读取位置。生产者不能向同一单元中连续写两次以上相同的字符,消费者也不能从同一单元中连续读两次以上相同的字符。二、完成步骤1、思路分析本作业是完善课件上的线程综合实例的练习生产者-消费者问题,重构这个程序的框架,完成性能分析,使之进一步理解掌握Linux下线程的

6、同步、通信以及互斥和多线程的安全问题。一般情况下,解决互斥方法常用信号量和互斥锁,即semaphore和mutex,而解决这个问题,多采用一个类似资源槽的结构,每个槽位标示了指向资源的指针以及该槽位的状态,生产者和消费者互斥查询资源槽,判断是否有产品或者有空位可以生产,然后根据指针进行相应的操作。同时,为了告诉生产者或者消费者资源槽的情况,还要有一个消息传送机制,无论是管道还是线程通信。然而,本次试验有几个特殊的要求:A、循环缓冲。B、除了stderr,stdout等外,只用小于2个的互斥锁、C、放弃资源槽分配机制,采用额外的数据结构。D、生产者一直持续生产,形成生产消费的良性循环。首先,使用

7、一个互斥锁,意味着资源槽机制就不能使用了。因为资源槽虽以用一个互斥锁完成,但是需要有额外的通信,如果使用管道通信,则管道也必须是互斥,这就不满足1个互斥锁的要求。其次,要求生产者一直生产,这就否定了另外一种方法:消费者、生产者的位置均平等,消费者消费的时候生产者不能生产,生产者生产的时候消费者不能消费。因此,就需要采用A要求,也就是循环链表的形式。为了保证互斥要求,需要定义一个数据结构,这个数据结构包含两个指针,一个读一个写,同时有一个资源数目量,告诉生产者和消费者是否可以生产或者消费。由于该数据结构很小,因而可以对此结构互斥访问。同时,对于每组数据,都有一个标志位,表示此组数据是否被占用,生

8、产者和消费者均可以先占用此位置然后完成相应的操作。当消费者互斥访问此结构时,首先判断是否有数据可以取,如果没有,直接等待,若有数据可取,先更改标志位占用此数据,并将资源数目-1。然后交出互斥,把数据拷贝到自己缓冲区内,清空数据。当生产者访问时,首先判断有没有空位可以生产,如果没有,直接等待,若有数据可以生产,先判断该位是否被占用,如果没被占用,则占用此位置进行生产。生产完成后,将占用位改为未占用,同时将资源数目+1。这个过程可以如图所示:2、重要函数和数据结构(1)数据结构#define N 5 / 生产者的数目 #define N2 15 / 消费者数目 #define M 20 / 缓冲数

9、目#define debug 0 /调试模式#define nowait 1 /是否添加额外等待pthread_mutex_t mutex; / 互斥信号量int prod_id = 0; /生产者idint proc_id = 0; /消费者id/成功以及失败次数计数int SuccN+N2;int FailN+N2;/用于生产的填充数据char dt30=aaaaaaaaaabbbbbbbbbbcccccccccc;int toexit=0;/退出标记/共用数据区struct data_strucint Occupied; /该位置是否被占用 无论生产还是消费char d1024; /数据

10、struct data_struc* nx; /下一个指针;/互斥量struct mtxstruct data_struc* rd_p;struct data_struc* wr_p;int cnt; /产品数量;struct mtx *mymutex;(2)函数说明void printinfo();/调试函数,打印公用数据区的内容和状态void Create_Empty_DS();/初始化循环链表void *buy();/消费者void *sell();/生产者void *Recount();/数据统计,同时控制程序自动退出3、程序流程图A、主函数B、统计线程C、生产者线程D、消费者线程三、

11、实验数据1、程序运行截图虚拟机:VMware Workstation7.0,win7;硬件:i3,2G DDR1333;编译:gcc product.c pg lpthread;报告生成:gprof b。运行时截图:CPU占用情况(无额外等待):2、原始数据由于程序要求使用gprof进行分析,而在机器配置较好的情况下,使用gprof可能分析不出每个函数执行时间,甚至连函数都分析不全,因而在实际代码中添加了一些空循环来增加cpu占用。为了更便于观察,首先假设如下场景:消费者、生产者在执行各自动作前,均usleep(1),同时,消费者在成功消费之后,也会usleep(3)来为其他消费者让位。同时,

12、也将测试没有任何等待的数据。程序内有一计时线程,每个一秒会显示一次生产消费情况,当60秒后程序自动退出,从而保存数据已被分析。生产者数量1消费者数量1缓冲长度20额外等待有CPU占用97%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 54.59 2.08 2.08 buy 45.41 3.81 1.73 sell 0.00 3.81 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit

13、covers 4 byte(s) for 0.26% of 3.81 secondsindex % time self children called name 1 54.6 2.08 0.00 buy 1- 2 45.4 1.73 0.00 sell 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 1 buy 2 sell程序运行情况生产者: #1 成功次数:21260 失败次数:1146117485消费者: #1 成功次数:21240 失败

14、次数:1151177763生产者数量1消费者数量5缓冲长度20额外等待有CPU占用97%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 85.29 2.90 2.90 buy 14.71 3.40 0.50 sell 0.00 3.40 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.29% of 3.40 secondsindex %

15、time self children called name 1 85.3 2.90 0.00 buy 1- 2 14.7 0.50 0.00 sell 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 1 buy 2 sell程序运行情况生产者: #1 成功次数:10800 失败次数:362944304消费者: #1 成功次数:1980 失败次数:368988095消费者: #5 成功次数:2560 失败次数:391801113生产者数量3消费

16、者数量10缓冲长度20额外等待有CPU占用约4%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 94.08 1.59 1.59 sell 5.92 1.69 0.10 buy 0.00 1.69 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.59% of 1.69 secondsindex % time self children ca

17、lled name 1 94.1 1.59 0.00 sell 1- 2 5.9 0.10 0.00 buy 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 2 buy 1 sell程序运行情况生产者: #1 成功次数:161677 失败次数:0生产者: #2 成功次数:161412 失败次数:0生产者: #3 成功次数:161535 失败次数:0消费者: #1 成功次数:44264 失败次数:75030消费者: #2 成功次数:47878 失

18、败次数:67808消费者: #3 成功次数:47805 失败次数:67967消费者: #10 成功次数:45942 失败次数:71664生产者数量3消费者数量10缓冲长度20额外等待无CPU占用97%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 77.28 2.96 2.96 buy 22.72 3.83 0.87 sell 0.00 3.83 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sampl

19、e hit covers 4 byte(s) for 0.26% of 3.83 secondsindex % time self children called name 1 77.3 2.96 0.00 buy 1- 2 22.7 0.87 0.00 sell 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 1 buy 2 sell程序运行情况生产者: #1 成功次数:4640 失败次数:174184091生产者: #2 成功次数:4000

20、 失败次数:179724333生产者: #3 成功次数:4120 失败次数:170018676消费者: #1 成功次数:1280 失败次数:182205853消费者: #2 成功次数:1340 失败次数:173044281.消费者: #9 成功次数:1020 失败次数:166877134消费者: #10 成功次数:1380 失败次数:164803475生产者数量5消费者数量20缓冲长度40额外等待有CPU占用约9%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 96.37 4

21、.25 4.25 sell 3.63 4.41 0.16 buy 0.00 4.41 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.23% of 4.41 secondsindex % time self children called name 1 96.4 4.25 0.00 sell 1- 2 3.6 0.16 0.00 buy 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-I

22、ndex by function name 3 Create_Empty_DS 2 buy 1 sell程序运行情况生产者: #1 成功次数:139689 失败次数:0生产者: #2 成功次数:139235 失败次数:0.生产者: #5 成功次数:137801 失败次数:0消费者: #1 成功次数:25922 失败次数:96488消费者: #2 成功次数:39009 失败次数:70402消费者: #3 成功次数:39645 失败次数:69154.消费者: #20 成功次数:33775 失败次数:80811生产者数量5消费者数量20缓冲长度40额外等待无CPU占用97%函数分析情况 % cumu

23、lative self self total time seconds seconds calls Ts/call Ts/call name 80.29 2.81 2.81 buy 19.71 3.50 0.69 sell 0.00 3.50 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.29% of 3.50 secondsindex % time self children called name 1 80.3 2.81 0.00 buy 1- 2

24、19.7 0.69 0.00 sell 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 1 buy 2 sell程序运行情况生产者: #1 成功次数:4120 失败次数:81703999.生产者: #5 成功次数:4200 失败次数:91874644消费者: #1 成功次数:1080 失败次数:83483253消费者: #2 成功次数:1240 失败次数:85970149消费者: #3 成功次数:1360 失败次数:106265813消费者:

25、#4 成功次数:960 失败次数:82522392消费者: #5 成功次数:1360 失败次数:93462020消费者: #6 成功次数:1160 失败次数:91337608消费者: #7 成功次数:1520 失败次数:102954859消费者: #8 成功次数:1080 失败次数:91363902消费者: #9 成功次数:760 失败次数:105319175消费者: #10 成功次数:1320 失败次数:102144117消费者: #11 成功次数:720 失败次数:90933552消费者: #12 成功次数:1120 失败次数:90537228消费者: #13 成功次数:920 失败次数:

26、90670465消费者: #14 成功次数:840 失败次数:109153419消费者: #15 成功次数:1320 失败次数:91949204消费者: #16 成功次数:960 失败次数:80094023消费者: #17 成功次数:1120 失败次数:81866777消费者: #18 成功次数:1000 失败次数:87802980消费者: #19 成功次数:800 失败次数:79470741消费者: #20 成功次数:960 失败次数:93098801生产者数量30消费者数量100缓冲长度200额外等待有CPU占用26%函数分析情况 % cumulative self self total

27、time seconds seconds calls Ts/call Ts/call name 79.17 10.49 10.49 sell 20.83 13.25 2.76 buy 0.00 13.25 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.08% of 13.25 secondsindex % time self children called name 1 79.2 10.49 0.00 sell 1- 2 20.8 2.76 0.00 b

28、uy 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 2 buy 1 sell程序运行情况生产者: #1 成功次数:24555 失败次数:0生产者: #2 成功次数:24423 失败次数:0生产者: #3 成功次数:24529 失败次数:0生产者: #4 成功次数:24428 失败次数:0.生产者: #8 成功次数:24552 失败次数:0生产者: #9 成功次数:24467 失败次数:0生产者: #10 成功次数:24612 失败次数:0.生

29、产者: #29 成功次数:24439 失败次数:0生产者: #30 成功次数:24723 失败次数:0消费者: #1 成功次数:7351 失败次数:16473消费者: #2 成功次数:6408 失败次数:18192消费者: #3 成功次数:6725 失败次数:17620.消费者: #8 成功次数:7830 失败次数:15630消费者: #9 成功次数:7264 失败次数:16677消费者: #97 成功次数:6628 失败次数:17780消费者: #98 成功次数:7200 失败次数:16692消费者: #99 成功次数:6921 失败次数:17335消费者: #100 成功次数:7433 失

30、败次数:16319生产者数量30消费者数量100缓冲长度200额外等待无CPU占用97%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 78.77 2.82 2.82 buy 21.23 3.58 0.76 sell 0.00 3.58 0.00 1 0.00 0.00 Create_Empty_DSCall graphgranularity: each sample hit covers 4 byte(s) for 0.28% of 3.58 secondsindex %

31、time self children called name 1 78.8 2.82 0.00 buy 1- 2 21.2 0.76 0.00 sell 2- 0.00 0.00 1/1 main 83 0.0 0.00 0.00 1 Create_Empty_DS 3-Index by function name 3 Create_Empty_DS 1 buy 2 sell程序运行情况生产者: #1 成功次数:3600 失败次数:10645017生产者: #2 成功次数:4000 失败次数:16728291生产者: #3 成功次数:3200 失败次数:17111918生产者: #4 成功次数

32、:3400 失败次数:10212130生产者: #17 成功次数:1400 失败次数:15370944生产者: #18 成功次数:2200 失败次数:21377626生产者: #19 成功次数:2600 失败次数:11692857生产者: #20 成功次数:3800 失败次数:16007285生产者: #21 成功次数:2200 失败次数:14244794生产者: #22 成功次数:3600 失败次数:22401337.生产者: #29 成功次数:4000 失败次数:18425015生产者: #30 成功次数:4800 失败次数:25033822消费者: #1 成功次数:1800 失败次数:1

33、2785639消费者: #2 成功次数:2800 失败次数:16116393消费者: #3 成功次数:2400 失败次数:10309678消费者: #4 成功次数:800 失败次数:24464415消费者: #52 成功次数:0 失败次数:13483907消费者: #53 成功次数:0 失败次数:20152736消费者: #54 成功次数:0 失败次数:14236228消费者: #55 成功次数:800 失败次数:21535076消费者: #56 成功次数:400 失败次数:18554678消费者: #57 成功次数:200 失败次数:20539844消费者: #58 成功次数:800 失败次

34、数:12377087.消费者: #94 成功次数:1600 失败次数:14401603消费者: #95 成功次数:2000 失败次数:24301257消费者: #96 成功次数:1800 失败次数:15476220消费者: #97 成功次数:2600 失败次数:17645168消费者: #98 成功次数:1000 失败次数:15002154消费者: #99 成功次数:200 失败次数:14299381消费者: #100 成功次数:1600 失败次数:21723729生产者数量50消费者数量200缓冲长度500额外等待有CPU占用97%函数分析情况 % cumulative self self total time seconds seconds calls Ts/call Ts/call name 98.61 50.26 50.26 sell 1.3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论