版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《操作系统》课程实验报告实验题目:线程与进程同步与互斥实验概述【实验目的及要求】1。生产者消费者问题(信号量)参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。2。用线程实现睡觉的理发师问题,(同步互斥方式采用信号量或mutex方式均可)理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。3。读者写者问题教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。【实验环境】操作系统:Linuxmint编译器:gcc实验内容【实验过程】实验步骤:生产者消费者问题(信号量)1.1实验原理:通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者进程程之间的互斥关系来实现。与计算打印两进程同步关系相同,生产者和消费者两进程P和C之间应满足下列两个同步条件:
①
只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则消费者必须等待。
②
只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。1.2伪代码://创建信号量并初始化semaphoremutex=1;//对缓存区设置临界区semaphorefull=0;//缓冲区已经被占据的数目Semaphoreempty=N;//缓冲区空巣数目//生产者voidproduce(){While(1){P(empty);P(mutex);addToBuf();V(mutex);V(full);}}//消费者voidconsumer(){While(1){P(full);P(mutex);moveFromBuf();V(mutex);V(empty);}}1.3实验结果与分析分析:创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。生产者和消费者两进程P和C之间应满足下列两个同步条件:
①
只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则消费者必须等待。
②
只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。用线程实现睡觉的理发师问题2.1设计原理利用三个信号量和一个控制变量来协调理发师、理发椅和顾客之间的活动。
1.信号量customers用来记录等候理发的顾客数,并用于阻塞理发师进程,初值为0
2.信号量barbers记录正在等候顾客的理发师数,初值为1
3.信号量waiting用来记录等候理发的顾客数,初值为0
4.信号量mutex为waiting变量设置临界区,初值为12.2伪代码Semaphorecustomers=0;Semaphorebarbers=1;Semaphoremuttex=1;Intchairs=N;Intwaiting=0;Voidbarber(){While(1){P(cutomers);//若无顾客,理发师睡眠P(mutex);//进程互斥waiting:=waiting–1;//等候顾客数少一个V(barbers);//理发师去为一个顾客理发V(mutex);//开放临界区cuthair();//正在理发}}Voidconstomer(){While(1){P(mutex);//进程互斥if(waiting<chairs){waiting:=waiting+1;//等候顾客数加1V(customers);//必要的话唤醒理发师V(mutex);//开放临界区P(barbers);//无理发师,顾客坐着养神get-haircut();//一个顾客坐下等理/}elseV(mutex);//人满了,走吧!}}2.3实验结果与分析分析:理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;读者写者问题3.1设计原理写者优先,一旦一个写者到来,它应该尽快对文件进行写操作。则新来到的读者不允许进行读操作。读者到:1)无读者且无写者,新读者读2)有读者但无写者等待,新读者读3)有读者但有写着等待,读者等待4)有写者在写,新读者等待写者到:1)无读者且无写者,新写者写2)有读者在读,新写者等待3)有写者写,新写者等待3.2伪代码read:=1//读者信息量,用于第一个写者与读者互斥readcount:=0//记录当前读者的进程数mutex:=1//readcount变量的临界区的锁writecount:=0//记录当前写者排队的进程数write:=1//写者信息量,用于写者互斥,第一个读者与写者互斥mutex2:=1//writecount的临界区的锁//读者进程Voidreader(){While(1){
P(read)
P(mutex)
V(read)
readcount:=readcount+1;
if(readcount=1)
P(write)
V(mutex)
读文件
P(mutex)
readcount:=readcount-1
if(readcount=0)
V(write)
V(mutex)}//endofwhile}//endoffunction//写者进程Voidwriter(){While(1){P(mutex2)
writecount:=writecount+1
if(writecount=1)
P(read)
V(mutex2)
P(write)
写文件
V(write)
P(mutex2)
writecount:=writecount-1
if(writecount=0)
V(read)
V(mutex2)}}3.3实验结果与分析分析:读者到:1)无读者且无写者,新读者读2)有读者但无写者等待,新读者读3)有读者但有写着等待,读者等待4)有写者在写,新读者等待写者到:1)无读者且无写者,新写者写2)有读者在读,新写者等待3)有写者写,新写者等待实验参考函数用于Linux进程通信共享内存。共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。信号集操作函数:intsemget(key_tkey,intnsems,intsemflg);Intsemop(intsemSetId,sembufbuf,intlength)线程操作函数pthread_create()pthread_mutex_unlock()pthread_mutex_lock()信号操作函数:Sem_init()Sem_wait()Sem_post()小结生产者消费者问题该问题描述了两个共享固定大小缓冲区的进程或线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。理发师问题:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论