版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与软件学院操作系统上机实验报告学生姓名:学号:班级:实验日期:2014.5.20实验名称:生产者与消费者问题模拟实验目的:通过模拟生产者消费者问题理解进程或线程之间的同步与互斥。实验内容:设计一个环形缓冲区,大小为10,生产者依次向其中写入1到20,每个缓冲区中存放一个数字,消费者从中依次读取数字。相应的信号量;生产者和消费者可按如下两种方式之一设计;设计成两个进程;设计成一个进程内的两个线程。根据实验结果理解信号量的工作原理,进程或线程的同步\互斥关系。实验步骤及分析:(此部分为关键内容:要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案)一.管道(一)管道定义所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。写,写,句柄fd[1]管道读,句柄fd[0](二)管道的类型1、有名管道一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod()建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open()打开。2、无名管道一个临时文件。利用pipe()建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe()的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。二种管道的读写方式是相同的,本文只讲无名管道。3、pipe文件的建立分配磁盘和内存索引结点、为读进程分配文件表项、为写进程分配文件表项、分配用户文件描述符.4、读/写进程互斥内核为地址设置一个读指针和一个写指针,按先进先出顺序读、写。为使读、写进程互斥地访问pipe文件,需使各进程互斥地访问pipe文件索引结点中的直接地址项。因此,每次进程在访问pipe文件前,都需检查该索引文件是否已被上锁。若是,进程便睡眠等待,否则,将其上锁,进行读/写。操作结束后解锁,并唤醒因该索引结点上锁而睡眠的进程。(三)所涉及的系统调用1、pipe()建立一无名管道。系统调用格式pipe(filedes)参数定义intpipe(filedes);intfiledes[2];其中,filedes[1]是写入端,filedes[0]是读出端。该函数使用头文件如下:#include<unistd.h>#inlcude<signal.h>#include<stdio.h>2、read()系统调用格式:read(fd,buf,nbyte)功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。参数定义:intread(fd,buf,nbyte);intfd;char*buf;unsignednbyte;3、write()系统调用格式read(fd,buf,nbyte)功能:把nbyte个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。参数定义同read()。(四)参考程序#include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;main(){ intfd[2]; charoutpipe[100],inpipe[100]; pipe(fd);/*创建一个管道*/ while((pid1=fork())==-1); if(pid1==0) { lockf(fd[1],1,0); /*把串放入数组outpipe中*/ sprintf(outpipe,"child1isusingpipe!"); /*向管道写长为50字节的串*/ write(fd[1],outpipe,50); sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0);} else{ while((pid2=fork())==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,"child2isusingpipe!"); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); }else{ wait(0); /*同步*/ read(fd[0],inpipe,50);/*从管道中读长为50字节的串*/ printf("%s\n",inpipe); wait(0); read(fd[0],inpipe,50); printf("%s\n",inpipe); exit(0);}}}二、信号机制(一)信号1、信号的基本概念每个信号都对应一个正整数常量(称为signalnumber,即信号编号。定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一种模拟,故在早期的UNIX版本中又把它称为软中断。信号与中断的相似点:(1)采用了相同的异步通信方式;(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;(3)都在处理完毕后返回到原来的断点;(4)对信号或中断都可进行屏蔽。信号与中断的区别:(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。信号机制具有以下三方面的功能:(1)发送信号。发送信号的程序用系统调用kill()实现;(2)预置对信号的处理方式。接收信号的程序用signal()来实现对处理方式的预置;(3)收受信号的进程按事先的规定完成对相应事件的处理。2、信号的发送信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程就此结束。一个进程可能在其信号域中有多个位被置位,代表有多种类型的信号到达,但对于一类信号,进程却只能记住其中的某一个。进程用kill()向一个进程或一组进程发送一个信号。3、对信号的处理当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行:(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;(2)进程收到软中断后便退出(function=0);(3)执行用户设置的软中断处理程序。(二)所涉及的中断调用1、kill()系统调用格式intkill(pid,sig)参数定义intpid,sig;其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。(1)pid>0时,核心将信号发送给进程pid。(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。2、signal()预置对信号的处理方式,允许调用进程控制软中断信号。系统调用格式signal(sig,function)头文件为#include<signal.h>参数定义signal(sig,function)intsig;void(*func)()其中sig用于指定信号的类型,sig为0则表示没有收到任何信号,余者如下表:值名字说明01SIGHUP挂起(hangup)02SIGINT中断,当用户从键盘按^c键或^break键时03SIGQUIT退出,当用户从键盘按quit键时04SIGILL非法指令05SIGTRAP跟踪陷阱(tracetrap),启动进程,跟踪代码的执行06SIGIOTIOT指令07SIGEMTEMT指令08SIGFPE浮点运算溢出09SIGKILL杀死、终止进程10SIGBUS总线错误11SIGSEGV段违例(segmentationviolation),进程试图去访问其虚地址空间以外的位置12SIGSYS系统调用中参数错,如系统调用号非法13SIGPIPE向某个非读管道中写入数据14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号15SIGTERM软件终止(softwaretermination)16SIGUSR1用户自定义信号117SIGUSR2用户自定义信号218SIGCLD某个子进程死19SIGPWR电源故障function:在该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。function的解释如下:(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;(2)function=0时,缺省值,进程在收到sig信号后应终止自己;(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。(三)参考程序#include<stdio.h>#include<signal.h>#include<unistd.h>voidwaiting(),stop();intwait_mark;main(){ intp1,p2; intstdout1; while((p1=fork())==-1);/*创建子进程p1*/ if(p1>0){ while((p2=fork())==-1);/*创建子进程p2*/ if(p2>0) { wait_mark=1; signal(SIGINT,stop);/*接收到^c信号,转stop*/ waiting(); kill(p1,16);/*向p1发软中断信号16*/ kill(p2,17);/*向p2发软中断信号17*/ wait(0);/*同步*/ wait(0); printf("Parentprocessiskilled!\n"); exit(0); } else { wait_mark=1; signal(17,stop);/*接收到软中断信号17,转stop*/ waiting(); lockf(stdout1,1,0); printf("Childprocess2iskilledbyparent!\n"); lockf(st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年互联网企业收入确认准则
- 2026年区域教研员蹲点包校工作制度
- 2026年企业接班人选拔中的信任风险与培养机制
- 2026年漫画编辑如何指导作者优化分镜
- 滑雪场滑雪教练聘用合同2026
- 2026年高校知识产权信息服务中心建设
- 职业发展规划服务协议2026
- 2026年工业机器人自动化项目成本控制
- 2026年楼道走廊地面清洁与养护方法
- 企业财务报表估值合同
- 印尼东南亚群岛多元风情
- JT-T 1037-2022 公路桥梁结构监测技术规范
- 高中数学课本中的定理公式结论的证明
- 蚂蚁集团区块链计划书
- 地下水监测井建设规范
- 全国优质课一等奖高中物理必修一《曲线运动》课件
- 产业经济学-产业组织理论
- 缺血性脑卒中的抗凝治疗课件
- 江苏省南师附中、天一中学、海门中学、海安中学2022-2023学年高二下学期6月四校联考化学答案
- 医疗器械经营监督管理办法考核试题及答案
- 艾媒咨询:2023年中国虚拟人产业发展与商业趋势研究报告
评论
0/150
提交评论