下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 操作系统-pv操作

操作系统-pv操作.doc

操作系统-pv操作

高睿圣
2017-09-30 0人阅读 举报 0 0 暂无简介

简介:本文档为《操作系统-pv操作doc》,可适用于IT/计算机领域

操作系统pv操作《现代操作系统》课程设计课程设计报告(论文)报告(论文)题目:PV操作解决生产者消费者问题作者所在系部:计算机科学与工程系作者所在专业:网络工程作者所在班级:*******作者姓名:******作者学号:************指导教师姓名:*******完成时间:年月日*******************第页共页《现代操作系统》课程设计PV操作原理生产者消费者问题描述程序流程图调试工具与命令关键代码分析有PV控制运行结果无PV控制运行结果有PV控制进程结束无PV控制进程结束第页共页《现代操作系统》课程设计进程同步机制的主要任务是对多个机关进程在执行次序上进行协调使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源并能很好的相互合作从而使程序的执行具有再现性。生产者和消费者是典型的进程同步问题它说明了进程同步与临界资源的关系。在生产者消费者问题中所描述的是生产者生产和消费者消费之间的关系。为使生产者进程与消费者进程并发执行在两者之间设置了一个具有n个缓冲区的缓冲池。生产者进程将它所生产的产品按序放入一个缓冲区中。消费者进程也按序从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的但他们之间必须保持同步关系即不允许消费者进程到一个空缓冲区中取产品也不允许生产者进程向一个已装满产品且尚未取走的缓冲区中投放产品。一般来说信号量S>=时S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源因此S的值减当S<时表示已经没有可用资源请求者必须等待别的进程释放该类资源它才能运行下去。而执行一个V操作意味着释放一个单位资源因此S的值加若S<=表示有某些进程正在等待该资源因此要唤醒一个等待状态的进程使之运行下去。多线程就是有两个或两个以上的信号量线程同步的运行。第页共页《现代操作系统》课程设计操作系统是现代计算机系统中最基本和最重要的系统让软件它是计算机科学与技术专业的一门重要的基础课程。通过讲授本课程学生可以全面的了解操作系统的概念操作系统是一组能有效的组织和管理计算机硬件和软件资源合理地对各类资源进行调度以方便用户使用的程序的集合。其作用是管理好这些设备提高利用率和系统的吞吐量为用户和应用程序提供简单的接口便于用户使用。学完操作系统可以更好的搭建学生的专业基础知识。本次课程设计在本着加强课本知识运用能力的前提下我选取了用PV操作来解决生产者消费者问题这个题目。该题目主要是解决操作系统中进程的同步与互斥的问题。图书馆五楼计算机系软二机房在Linux下用C语言调用Linux提供的系统函数编写程序实现操作系统中生产着与消费者的同步于互斥问题结合操作系统理论课程中学习到的记录型信号量机制进程的创建、调度、终结方法在Linux操作系统下进行实际编程模拟操作完成PV操作解决生产者消费者问题使进程能够在系统中有条不紊的运行从而使大家对可以把理论知识运用到实践中来加深对理论的理解。设计PV操作算法用信号量机制实现生产者与消费者同步与互斥问题并与无PV情况下进行对比。定义个缓冲区将其初始化为。调用随机函数rand()生成随机数把随机数通过生产者放入缓冲区。若缓冲区满则其值非。当消费者从缓冲区中去数后缓冲区值变为。程序可显示缓冲区中的全部内容方便观察生产者与消费者的行为。程序可通过设置sleep(time)中time的值来控制生产者与消费者的执行顺序。第页共页《现代操作系统》课程设计Ubuntu默认桌面环境采用GNOME(TheGNUNetworkObjectModelEnvironmentGNU网络对象模型环境)一个UNIX和Linux主流桌面套件和开发平台。PV信号量机制是一种卓有成效的进程同步工具。在长期的广泛应用中得到了很大的发展信号量机制已被广泛地应用于但处理机和多处理机系统中。在记录型信号量中svalue的初始值表示系统中某资源的数目因而又成为资源信号量。对它的每次p操作意味着进程请求一个单位的该资源使系统中可供分配的该类资源减少一个因此描述为svalue:=svalue当svalue<时表示该类资源已分配完毕因此进程调用block原语进行自我阻塞放弃处理机并插入到信号量链表SL中。对信号量的每次v操作表示执行进程释放一个单元资源使系统中可供分配的该类资源数增加一个。故svalue:=svalue操作表示资源数目加。若加后仍是svalue<=则表示在该信号量链表中仍有等待该资源的进程被阻塞故还应调用wakeup原语将SL链表中的第一个等待进程唤醒。如果svalue的初始值为表示只允许一个进程访问临界资源此时信号量转化为互斥信号量用于进程互斥。为了实现生产者与消费者同步与互斥的问题该程序用记录型信号量机制来实现。假定在生产者与消费者之间利用一个公共的缓冲池来进行通信生产者将所生产的信息放入其中消费者cognitive缓冲池中取得消息来消费该缓冲池具有n个缓冲区其编号为,n设置一个互斥信号量mutex用于实现诸进程对缓冲池的互斥使用其初值为利用资源信号量empty表示缓冲池中空缓冲区的数目其初值为nfull分别表示缓冲池中满缓冲区的数目其初值为又假定这些生产者和消费者相互等效只要缓冲池未满生产者便可将消息送入由指针in所指的缓冲区只要缓冲池未空消费者变可以从由指针out所指示的缓冲区中取走一个消息。对生产者消费者的问题可以描述如下:第页共页《现代操作系统》课程设计Varmetux,empty,full:semaphore=,n,Buffer:array,nofitemIn,out:integer:=Begin:PabeginProducer:beginRepeatProduceranitemnextpP(empty)P(mutex)buffer(in):=nextpin:=(in)modnV(mutex)V(full)UntilfalseEndConsumer:beginRepeatP(full)P(mutex)nextc:=buffer(out)out:=(out)modnV(mutex)V(empty)UntilfalseEndParendEnd第页共页《现代操作系统》课程设计创建进程模拟生产者消费者消费者生产者阻塞N有消费请求?存在空缓冲区阻塞Y阻塞此请求可满足?另一生产者正Y在写?N确定产品位置进入临界区阻塞此产品正被消费?从空缓冲区中为本生产者分配一个空间进入临界区(对同一产品进行请求的消费者之间互斥)退出临界区消费产品、并判断是否应该释放在该缓冲区中写入产品产品所占缓冲区通过信号量通知等待本产品的消费者退出临界区结束消费者进程结束生产者进程图程序流程图第页共页《现代操作系统》课程设计启动vi编辑器:vi文件:q!不存盘退出。:w将缓冲区内的资料写入磁盘中但并不离开vi:q直接退出。:wq存盘并退出:wq!强行存盘退出(相当于ZZ)编译命令:gcco目标文件名源文件名执行命令:目标文件名.信号量操作创建信号量函数:intsemget(keytkey,intnsems,intsemflg)控制信号量函数:intsemctl(intsemid,intsemnum,intcmd,unionsemunarg)PV操作函数:intsemop(intsemid,structsembuf*sops,unsignednsops)信号量的使用是一个很容易出错的问题如在程序退出时必须还原所有的加锁否则程序会运行出错。本系统在缓冲区操作时分为两种情况semp(emptyid,)之后如果要写入的缓冲区为空则执行写入操作然后semv(fullid,)如果要写入的缓冲区为空则执行程序不能写入换冲区要执行还原操作执行semv(emptyid,)操作。本程序定义的信号量有emptyid、fullid、mutexid。fullid=semget(IPCPRIVATE,,IPCCREAT|)emptyid=semget(IPCPRIVATE,,IPCCREAT|)mutexid=semget(IPCPRIVATE,,IPCCREAT|)共享内存操作创建共享内存:shmget(char*pathname,intprojid,sizetsize)arrayid=shmget(IPCPRIVATE,sizeof(int)*MAXSHM,IPCCREAT|)getid=shmget(IPCPRIVATE,sizeof(int),IPCCREAT|)setid=shmget(IPCPRIVATE,sizeof(int),IPCCREAT|)删除共享内存:shmctl(char*viraddr,intshmid)本程序定义的共享内存有array、set、get。其中array为个共享缓冲区set为多个生产者进程共同的取数端和计数器get为消费者的计数器。进程操作第页共页《现代操作系统》课程设计创建进程函数:fork()进程退出函数:exit()这进程等待子进程退出函数:wait(sumert,(int*),)Main主进程使用fork()生成子进程这样就生成里一个消费者或生产者进程并且还为主进程的子进程。当子程序执行了exit()在Linux下编译源文件用命令gcc:如图。图编辑命令gcc在Linux先执行目标文件用命令目标文件。如图。图执行命令目标文件第页共页《现代操作系统》课程设计PV有PV控制下的运行结果如图所示图有PV控制下的运行结果PV无PV控制下的运行结果如图所示图无PV控制下的运行结果第页共页《现代操作系统》课程设计PV有PV控制下的进程结束显示结果如图所示图有PV控制下的进程结束PV无PV控制下的进程结束显示结果如图所示图无PV控制下进程的结束第页共页《现代操作系统》课程设计此次课程设计学习了在C语言里定义信号量、共享内存的使用、用fork()函数创建子进程以及定义信号量的PV操作并通过sleep函数来调整生产者和消费者对缓冲区的操作在无PV时初始时让sleep(time)中的time=可以看到消费者对缓冲区进行读而此时生产者并无向缓冲区中放东西。在有PV控制下必须是缓冲区非空且无生产者对缓冲区进行操作时消费者才能对缓冲区操作同理只有缓冲区不满而且无消费者操作时生产者才能对缓冲区操作。通过与无PV控制下对缓冲区进行读写可以进一步理解在信号量控制下的作用。这次试验让我深刻的了解了操作系统的PV操作也加深了对操作系统的认识课本上的概念也有了深入的印象使我对操作系统这个学科有了整体观感这次试验使我受益匪浅感谢老师的指导和帮助感谢同学的帮助和关心!第页共页《现代操作系统》课程设计汤小丹梁红兵哲凤屏汤子瀛著。现代操作系统。电子工业出版社年月汤小丹梁红兵哲凤屏汤子瀛编著。计算机操作系统。现电子科技大学出版社年月《计算机操作系统教程》清华大学出版社张尧学第页共页《现代操作系统》课程设计#include<unistdh>数据结构*#include<stdioh>unionsemunarg#include<stdlibh>*定义共享内存*#include<stringh>intshmid,shmid,shmid#include<timeh>int*buffer,*get,*set#include<systypesh>*创建信号量并初始化*#include<linuxsemh>emptyid=semget(IPCPRIVAT#include<linuxshmh>E,,IPCCREAT|)#defineMAX定义缓冲fullid=semget(IPCPRIVATE,区的大小,IPCCREAT|)*定义信号量内部标识*mutexid=semget(IPCPRIVATintemptyidE,,|IPCCREAT)intfullidargval=*为信号量intmutexid赋初值*intmain()if(semctl(mutexid,,SETVAL,a{rg)==)printf("**********使用pv操perror("semctlsetval作***********n")error")pv()argval=*为信号量printf("*************无pv操赋初值*作*********n")if(semctl(emptyid,,SETVAL,anoPV()rg)==)}perror("semctlsetvalintpv()error"){argval=inti,C,C,p,p,mif(semctl(fullid,,SETVAL,arg)srand(time())==)*定义P、V操作所用的数据perror("semctlsetval结构*error")structsembufP,V*定义信号量的P操作**定义给信号量赋初值的参数Psemnum=第页共页《现代操作系统》课程设计Psemop=semop(emptyid,P,)Psemflg=对emptyid执行P操作*定义信号量的V操作*semop(mutexid,P,)Vsemnum=对mutexid执行P操作Vsemop=if((*set)<MAX)Vsemflg={*创建并附接共享内存*printf("nPputshmid=shmget(IPCPRIVATEdatainNodn",*set),MAX,|IPCCREAT)printf("printfallthedatainthebuffer:")buffer=(int*)shmat(shmid,,)buffer*set=(rand())for(m=m<MAXm)for(m=m<MAXm){bufferm=for(m=m<MAXm)}printf("d*创建缓冲区信号量buffer、",bufferm)读缓冲区号的计数get以及写缓冲区号的printf("n")计数set并初始化*}shmid=shmget(IPCPRIVATE(*set),,|IPCCREAT)semop(mutexid,V,)set=(int*)shmat(shmid,,)semop(fullid,V,)(*set)=对fullid执行V操作shmid=shmget(IPCPRIVATEif((*set)>=),,|IPCCREAT)breakget=(int*)shmat(shmid,,)}(*get)=printf("Pover!n")while((p=fork())==)exit()创建生产者子进程直到成功为止,p存}放子进程的pid号while((p=fork())==)if(p==)创建生产者子进程直到成功为止,p存返回值=表示子进程返回放子进程的pid号{if(p==)返回值=表for(i=i<MAXi)示子进程返回{{sleep()for(i=i<MAXi)第页共页《现代操作系统》课程设计{{sleep()sleep()semop(emptyid,P,)semop(fullid,P,)对emptyid执行P操作对fullid执行P操作semop(mutexid,P,)semop(mutexid,P,)对mutexid执行P操作if((*get)<MAX)if((*set)<MAX){{printf("nCgetprintf("nPputnumberfromNodn",*get)datainNodn",*set)buffer*get=printf("printfallprintf("printfallthedatainthebuffer:")thedatainthebuffer:")buffer*set=(rand())for(m=m<MAXm)for(m=m<MAXm)printf("dprintf("d",bufferm)",bufferm)printf("n")printf("n")}}(*get)(*set)semop(mutexid,V,)semop(mutexid,V,)semop(fullid,V,)semop(emptyid,V,)对emptyid执行对fullid执行V操作V操作if((*set)>=)if((*get)>=MAX)breakbreak}}sleep()printf("Cover!n")printf("Pover!n")exit()exit()}}while((C=fork())==)创while((C=fork())==)建消费者子进程创建消费者子进程if(C==)if(C==){{for(i=i<MAXi)for(i=i<MAXi){第页共页《现代操作系统》课程设计sleep()的共享内存semop(fullid,P,)shmdt(set)断开附接对fullid执行P操作的共享内存semop(mutexid,P,)shmctl(shmid,IPCRMID,)撤消共享内if((*get)<MAX)存和信号量集{semctl(emptyid,IPCRMID,)printf("nCgetsemctl(fullid,IPCRMID,)numberfromNodn",*get)semctl(mutexid,IPCRMID,)buffer*get=wait()printf("printfall}thedatainthebuffer:")intnoPV(){for(m=m<MAXm)inti,C,C,p,p,m*定义P、printf("dV操作所用的数据结构*",bufferm)*定义共享内存*printf("n")intshmid,shmid,shmid}int*buffer,*get,*set(*get)*创建并附接共享内存*semop(mutexid,V,)shmid=shmget(IPCPRIVATE,MAX,|IPCCREAT)semop(emptyid,V,)对emptyid执行V操作buffer=(int*)shmat(shmid,,)if((*get)>=MAX)for(m=m<MAXm)break{}bufferm=printf("Cover!n")}exit()*创建缓冲区信号量buffer、}读缓冲区号的计数get以及写缓冲区号的wait()计数set并初始化*等待子进程终止shmid=shmget(IPCPRIVATEwait(),,|IPCCREAT)wait()set=(int*)shmat(shmid,,)shmdt(buffer)断(*set)=开附接的共享内存shmid=shmget(IPCPRIVATEshmdt(get)断开附接,,|IPCCREAT)第页共页《现代操作系统》课程设计get=(int*)shmat(shmid,,)if(p==)(*get)=返回值=表示子进程返回while((p=fork())==){创建生产者子进程直到成功为止,p存for(i=i<MAXi)放子进程的pid号{if(p==)sleep()返回值=表示子进程返回if((*set)<MAX){{for(i=i<MAXi)printf("nPput{datainNodn",*set)printf("printfallthesleep()datainthebuffer:")if((*set)<MAX)buffer*set=(rand()){for(m=m<MAXm)printf("nPputdatainNodn",*set)for(m=m<MAXm)printf("printfallprintf("dthedatainthebuffer:")",bufferm)buffer*set=(rand())printf("n")for(m=m<MAXm)}(*set)for(m=m<MAXm)if((*set)>=)printf("dbreak",bufferm)}printf("n")printf("Pover!n")}exit()(*set)}if((*set)>=)while((C=fork())==)break创建消费者子进程}if(C==)printf("Pover!n"){exit()for(i=i<MAXi)}{sleep()while((p=fork())==)if((*get)<MAX)创建生产者子进程直到成功为止,p存{放子进程的pid号printf("nCget第页共页《现代操作系统》课程设计numberfromNodn",*get)thedatainthebuffer:")buffer*get=printf("printfallfor(m=m<MAXm)thedatainthebuffer:")printf("d",bufferm)for(m=m<MAXm)printf("n")printf("d}",bufferm)(*get)printf("n")if((*get)>=MAX)}break(*get)}if((*get)>=MAX)printf("Cover!n")breakexit()}}printf("Cover!n")wait()等待子进程终止exit()wait()}wait()while((C=fork())==)shmdt(buffer)断创建消费者子进程开附接的共享内存if(C==)shmdt(get)断开附接的共{享内存for(i=i<MAXi)shmdt(set)断开附接{的共享内存shmctl(shmid,IPCRMID,)sleep()撤消共享内存和信号量集if((*get)<MAX)semctl(emptyid,IPCRMID,){semctl(fullid,IPCRMID,)printf("nCgetsemctl(mutexid,IPCRMID,)numberfromNodn",*get)wait()buffer*get=printf("printfall}第页共页《现代操作系统》课程设计评语指导教师评语及设计成绩课程设计成绩:指导教师:日期:年月日第页共页

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/26

操作系统-pv操作

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利