版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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互斥锁加锁:pth
3、read_mutex_lock互斥锁解锁:pthread_mutex_unlock四、实验要求:每人完成一份大作业实验报告。报告分设计思想、数据定义、处理流程、源程序、运行结果截图、设计体会等部分。1) 给出数据定义和详细说明;2) 给出实现思想和设计流程;3) 调试完成源程序;4) 屏幕观察运行结果;5) 总结自己的设计体会;编程语言及操作系统平台不限。五、提交内容本大作业每个人必须单独完成。最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、算法思路及流程图、心得体会。大作业必须以WORD附件的形式提交。大作业严禁抄袭。发现抄袭一律以不及格论。大作业内容要完整,一定要有算法思
4、路、流程图、心得体会、运行输出信息截屏等内容,如果只提交源代码则大作业成绩记为不合格。 2016-10-20设计报告线程的同步和互斥在操作系统中引入线程以及线程并发性的概念后,增加了系统的效率,同时,由于资源有限导致线程之间的资源竞争和共享,因此产生一个问题,例如,当多个线程同时申请一台打印机的时候,如果不加限制,很可能使多个线程的输出结果交织在一起,产生错误的打印。下面我来为大家主要介绍并发执行的线程使用临界资源时,同步与互斥的以及控制方法。1.临界资源的概念:多个线程不能同时使用的资源称为临界资源CR(Critical Resource)。临界资源可以是一些独占设备,比如打印机等,也可以是
5、一些共享变量,表格,链表等。2.临界区:不论硬件临界资源还是软件临界资源,多个线程必须互斥的对其进行访问。每个线程中访问临界资源的那段代码称为临界区CS(Critical Section)。每个线程在进入临界区以前,应该对欲访问的临界资源进行检查,看他是否正在被访问。若是,则该线程不能进入临界区,若否,则该线程可以进入临界区对该资源进行访问,并设置只在被访问的标志。3.线程互斥的概念:线程互斥是指多个线程不能同时使用同一个临界资源,即两个或两个以上线程必须互斥的使用临界资源,当然不能同时进入临界区。如:现在系统中有一台打印机,两个线程都要使用,为了保证打印结果正确,只能一个线程用完后另一个再用
6、。在一个线程使用时必须做上占用标记,用完以后必须清楚标记。这样,另一个线程才会知道打印机空闲,然后开始使用。这两个逻辑上完全独立,毫无关系的线程,由于竞争同一个资源而相互制约,这就称为线程的互斥。4.线程同步的概念:线程同步是指有协作关系的线程之间不断地调整他们之间的相对速度或者执行过程,以保证临界资源的合理利用和线程的顺利执行。实现线程同步的机制称为线程同步机制。不同的同步机制实现同步的方法可能不同,但一般都借助一个中间媒介来实现,如信号量,锁等。在现实中存在线程同步关系的线程很多,如:两个线程合作使用同一缓冲区,设线程A负责向缓冲区中输入数据,线程B负责缓冲区中输出数据。当线程A将数据缓冲
7、区输满时,则只有当线程B将该数据输出后,线程 A才可以继续使用该缓冲区,否则将造成数据丢失。此时,线程A,B之间就形成了同步关系。 同步机制遵循的规则:(1)空闲让进:并发线程中某个线程不再临界区时,不阻止其它线程进入临界区。(2)忙则等待:只允许同一时刻一个线程进入临界区,其它欲进入临界区的线程等待。(3)有限等待:欲访问临界区的线程要在有限的时间内访问到临界区,避免陷入“死等”状态。(4)让权等待:当线程不能进入自己的临界区的时候,应立即释放CPU,以避免线程陷入“忙等”状态。锁机制:实现互斥的一种方式是采用锁机制,即提供上锁(Lock)和开锁(Unlock)原语,以及一个锁变量w或者锁位
8、(1bit)。当线程进入临界区之前,首先测试w的状态,w=1,表示上锁,意味着该资源以及占用;w=0表示开锁,意味着该资源以及空闲,可以进入临界区使用临界资源。这种利用锁机制解决互斥访问的方法安全可靠,但是效率不高。因此出现了信号量。信号量:(Semaphore)也叫信号灯,是在信号同步机制中用于实现线程的同步和互斥有效的数据结构。信号量有很多种类型的数据结构。如:整型信号量、记录型信号量、AND型信号量、及信号量集等。在这里我们主要介绍整型信号量,其它类型信号量读者可以自己查阅相关资料。整型信号量是信号量最简单的类型,也是各种信号量类型中必须包含的类型,整型信号量的数值表示当前系统中可用的该
9、类型临界资源的数量。如整型信号量s,则s值得意义为:s0:表示系统中空闲的该类临界资源的个数;s=0:表示系统中该类临界资源正好全部被占用,而且没有线程在等待该资源。s0:s的绝对值表示系统中等待该类临界资源的线程的个数。wait(s)和signal(s)的原语操作可以描述为: wait(s): while s=0 该线程等待 s:s=s-1; Signal(s): s: s=s+1;信号量机制:信号量机制中,申请和释放临界资源的两个原语操作为wait操作和signal操作,有时也称为P操作和V操作。线程同步问题的一个典型案例:生产者消费者问题,这是一个著名的线程同步问题。描述为:有一群生产者
10、线程在生产产品,并将这些产品提供给消费者线程去消费,为方便生产者线程与消费者线程能并发执行,在两者之间设置一个具有n个缓冲区的缓冲池,生产者线程将生产一个商品并放入到一个缓冲区中,消费者线程可以从一个缓冲区中取走一个商品消费。问题分析:显然消费者线程不能到一个空的缓冲区中去取商品,生产者线程也不能将产品放入一个已经装满产品且尚未取走的缓冲区中。一个数组表示具有n和缓冲区的缓冲池,设输入输出指针分别为in和out,in表示下一个可存放产品的缓冲区,out表示下一个可取得产品的缓冲区。考虑是循环缓冲池,每当生产者线程向缓冲池中生产一个产品时,in=(in+1)mod n;每当消费者线程从缓冲池中取
11、走一个产品后,out=(out+1)mod n。故当out=in时,缓冲池空,当out=(in+1)mod n时,表示缓冲池满。012in-2n-1 生产者消费者问题缓冲池为解决生产者消费者问题各线程的同步问题,设以下信号量:sem_mutex:互斥使用缓冲池信号量,初始情况下无线程进入缓冲池,因此初值设为1;empty_sem_mutex:使用缓冲池中空缓冲区的信号量,由于初始情况下所有缓冲区为空,因此设置为n;full_sem_mutex:使用缓冲池中满缓冲区的信号量,由于初始情况下所有缓冲区为空,因此设置为0;程序:#include#include#include#include#def
12、ine BUFF_SIZE10intbufferBUFF_SIZE;int in=0;int out=0;int p=1;sem_t sem_mutex;sem_tempty_sem_mutex;sem_tfull_sem_mutex;void *Producer() while(1) sem_wait(&empty_sem_mutex); sem_wait(&sem_mutex); if(p10) p=1; bufferin=p+; printf(nproduce%dn,bufferin); if(out=(in=(in+1)%BUFF_SIZE) printf(buffer isfulln
13、); sem_post(&sem_mutex); sem_post(&full_sem_mutex); void *Consumer() while(1) sem_wait(&full_sem_mutex); sem_wait(&sem_mutex); printf(nconsume%dn,bufferout); if(out=(out+1)%BUFF_SIZE)=in) printf(buffer isemptyn); sem_post(&sem_mutex); sem_post(&empty_sem_mutex); int main() pthread_t ptid,ctid; sem_i
14、nit(&sem_mutex,0,1);/unlocksem_mutex=1;sem_init(&empty_sem_mutex,0,10);/unlockempty_sem_mutex=10; sem_init(&full_sem_mutex,0,0);/lock printf(nmutex initedsuccess!); if(pthread_create(&ptid,NULL,Producer,NULL) printf(n Error creatingthread1); exit(1); else printf(ncreate thread1success!); if(pthread_
15、create(&ctid,NULL,Consumer,NULL) printf(n Error creatingthread2); exit(1); else printf(ncreate thread2success!); if(pthread_join(ptid,NULL) printf(n Error joining threadproducer); exit(1); if(pthread_join(ctid,NULL) printf(n Error joining threadconsumer); exit(1); sem_destroy(&empty_sem_mutex); sem_destroy(&full_sem_mutex); sem_destroy(&sem_mutex); /exit the main thread pthread_exit(NULL); re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- UWB定位算法仿真开发课程设计
- 博物馆奇妙夜课程设计
- 磨床研发工程师考试试卷及答案
- 搜索引擎元宇宙引擎课程设计
- FPGA实现UART通信技巧课程设计
- 毛绒玩具充棉工岗位操作考试试卷及答案
- 2026年小学四个引路人要求学习课件
- ETC门架接地防腐蚀措施方案
- 幼儿园:颜色变变变
- 2026年中秋节假期高中假期错题计划
- 职业病防治法规与工作场所风险评估
- 2025年全媒体记者笔试题目答案
- 严明战时纪律工作方案
- (正式版)DB51∕T 3322-2025 《水利工程建设质量检测管理规范》
- TCECS 1728-2024 消雾节水机械通风冷却塔冷凝模块性能试验方法标准
- 学校因病缺勤、缺课登记追踪制度
- 劳务员岗位知识培训课件
- TCSAE《摩托车和轻便摩托车操纵稳定性试验方法》编制说明
- 2025年发展对象考试测试题库附含答案
- 消除艾滋病、梅毒和乙肝母婴传播课件
- 外研版(三起)(2024)四年级上册英语 Unit 1 I love sports 单元整体教学设计(共5课时)
评论
0/150
提交评论