多道程序缓冲区协调操作操作系统报告

上传人:飞*** 文档编号:47150809 上传时间:2018-06-30 格式:PDF 页数:12 大小:426.65KB
返回 下载 相关 举报
多道程序缓冲区协调操作操作系统报告_第1页
第1页 / 共12页
多道程序缓冲区协调操作操作系统报告_第2页
第2页 / 共12页
多道程序缓冲区协调操作操作系统报告_第3页
第3页 / 共12页
多道程序缓冲区协调操作操作系统报告_第4页
第4页 / 共12页
多道程序缓冲区协调操作操作系统报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《多道程序缓冲区协调操作操作系统报告》由会员分享,可在线阅读,更多相关《多道程序缓冲区协调操作操作系统报告(12页珍藏版)》请在金锄头文库上搜索。

1、苏州科技学院天平学院操作系统课程设计报告多道程序缓冲区协调操作专业年级计算机工程 2010 班级计算机工程 1022 计算机工程 1022 学号1032107209 1032107202 姓名刘志愿金志献成绩指导教师陆卫忠2012年 7 月4日1 任务分配情况姓名承担的任务金志献编写主函数编译执行程序并修改刘志愿协助修改程序编写报告多道程序缓冲区协调操作一概述1. 目的:(1)了解提出信号量的背景(2)掌握信号量的基本概念及PV 操作的原理(3)进一步熟悉信号量解决的经典问题(4)利用信号量的原理实现不同操作系统下同步互斥问题2. 主要完成的任务:有 10 个 Put 操作要不断循环地向InB

2、uffer 送数据,有一个Move 操作要不断地将InBuffer的数据取到OutBuffer ,有 20 个 GET 操作要不断地从OutBuff 中取数据。 InBuffer 的容量是10, OutBuff 的容量是 20, Put、 Move、 Get 每次操作一个数据,为了在操作的过程中要保证数据不丢失 ,每个 Buffer 每次只能接受一个Put 或一个 Move 或一个 Get,多个操作不能同时操作同一Buffer( 即需要互斥操作)。设计一个多道程序完成上述操作。试用、原语(或Wait、Signal)协调 Put、 Move、Get 的操作,并说明每个信号量的含义、初值和值的范围

3、。3. 使用的开发工具:VMware Workstation,Red Hat Linux2.4.20-8 2 4. 解决的主要问题:需求分析利用信号量实现缓冲区管理临界区协调问题。解决由于进程线程共享内存而出现的与时间有关的错误。二使用的基本概念和原理2.1. 信号量:为解决多进程线程同步与互斥问题,让两个或多个多道进程线程通过特殊的变量展开交互。2.2. 线程:是进程的一个实体,是进程上下文中执行的代码序列,是被系统调度的基本单元。2.3. 进程:进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源。2.4. 互斥与同步:进程的同步与互斥是指进程在推进时的相互制约关系。进程同

4、步:它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。进程互斥:它主要源于资源共享,是进程之间的间接制约关系。三总体设计生产者消费者问题是相互合作的进程关系的一种抽象,可以利用信号量机制来解决生产者消费者问题,利用互斥信号量mutex 实现进程对缓冲池的互斥使用。对信号量的操作只能通过两个原子操作:Wait(s)和 Signal(s).Wait(s)是等待信号的操作,进行S=S-1 操作;Signal(s)是发送信号的操作,进行S=S+1操作。wait 若 s-1 后仍大于或等于零,则进程继续执行;若s-1 后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调

5、度;若相加结果大于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度如下图所示,有10 个 PUT (相当于生产者)操作要不断循环地向Buffer1送数据,有一个Move(相当于搬运者)操作要不断地将Buffer1的数据取到Buffer2 ,有 20 个 GET (相当于消费者)操作要不断地从Buff2中取数据。 BUFF1是 10,BUFF2 的容量是20, PUT 、 MOVE 、 GET每次操作一个数据, 为了在操作的过程中要保证数据不丢失, 每个 Buffer每次只能接受一个PUT或一个 Move或一个 Get, 多个操作不能同时操作同一BUFFER

6、。 设计一个多道程序完成上述操作。试用、原语协调PUT 、 MOVE 、GET的操作,并说明每个信号量的含义、初值和值的范3 围。设计总体流程图如下:InBufferOutBuffer MovePutGet四详细设计4.1 线程规划我们创建三类线程: ( 1)PUT线程(往BUFFER1 里放数据,相当于生产者)。( 2)MOVE 线程(从BUFFER1 里取数据并放到BUFFER2 里,相当于搬运者) 。( 3)GET线程(从BUFFER2 里取数据,相当于消费者)。每类线程可由用户自行设定线程的个数。4.2 信号量的设置需要设置六个信号量full1 empty1 buff1 full2 e

7、mpty2 buff2。各信号量含义及初值如下:full1表示 buffer1是否有数据,初值为0;empty1 表示 buffer1是否有空间,初值为m ;buff1表示 buffer1是否可操作,初值为1;full2表示 buffer2是否有数据,初值为0;empty2 表示 buffer2是否有空间,初值为n;buff2表示 buffer2是否可操作,初值为1。五编码设计1. 开发环境为Linux ,我们在进入RedHat Linux 后输入 startx进入图形界面,在任务菜单里可以寻找终端,即可进行代码编写与执行。2.程序源代码如下/* 定义头文件 */ #include #incl

8、ude #include 4 #include #include #include #include /* 定义头变量 */ sem_t iFull,iEmpty; sem_t oFull,oEmpty; int iIn=0,iOut=0,oIn=0,oOut=0; sem_t sem1,sem2; char inBuffer10; char outBuffer20; int data1,data2,data3; void put(void *arg); void move(void *arg); void get(void *arg); /* mian函数 */ main(int argc,

9、 char *argv) int i,j; int *task110; int *task220; pthread_t id110,id2,id320; int ret; /* 初始化信号量imutex 为 1*/ ret=sem_init( if(ret!=0) perror(“sem_init“); /* 初始化信号量omutex 为 1*/ ret=sem_init( 5 if(ret!=0) perror(“sem_init“); /* 初始化信号量iFull为 1*/ ret=sem_init( if(ret!=0) perror(“sem_init“); /* 初始化信号量iEmp

10、ty 为 10*/ ret=sem_init( if(ret!=0) perror(“sem_init“); /* 初始化信号量oFull为 0*/ ret=sem_init( if(ret!=0) perror(“sem_init“); /* 初始化信号量oEmpty 为 20*/ ret=sem_init( if(ret!=0) perror(“sem_init“); /* 创建三个线程*/ /move 线程ret=pthread_create( if(ret!=0) perror(“pthread thread move error.“); /put线程for(i=0;i10;i+) t

11、ask1i = (int *)malloc(sizeof(int); *task1i = i; ret=pthread_create( 6 if(ret!=0) perror(“pthread thread put error.“); /get线程for(j=0;j20;j+) task2j = (int *)malloc(sizeof(int); *task2j = j; ret=pthread_create( if(ret!=0) perror(“pthread thread get error.“); for(i=0;i10;i+) pthread_join(id1i,NULL); pt

12、hread_join(id2,NULL); for(j=0;j20;j+) pthread_join(id3j,NULL); exit(0); /* put操作线程函数 */ void put(void *arg) int i; int *threadid1; threadid1 = (int *)arg; srand(time(NULL); while(1) sleep(1); data1= rand() % 128; /* 信号量减一, P 操作 */ 7 sem_wait( sem_wait( sleep(1); printf(“put%d:iIn=%d,nThe data put in

13、to the inBuffer is:%dn“,*threadid1,iIn,data1); inBufferiIn=data1; iIn=(iIn+1)%10; /* 信号量加一, V 操作 */ sem_post( sem_post( sleep(2); /* move操作线程函数 */ void move(void *arg) int ret; while(1) /* move操作将数据取出inBuffer缓冲区 */ sem_wait( sem_wait( sleep(1); data2=inBufferiOut; printf(“move:iOut=%d,nThe data get

14、out of the inBuffer is:%dn“,iOut,data2); iOut=(iOut+1)%10; sem_post( sem_post( sleep(1); 8 /* move操作将数据放入outBuffer缓冲区 */ sem_wait( sem_wait( sleep(1); outBufferoIn=data2; printf(“move:oIn=%d,nThe data put into the outBuffer is:%dn“,oIn,data2); oIn=(oIn+1)%20; sem_post( sem_post( sleep(1); /* get操作线程

15、函数 */ void get(void *arg) int ret; int *threadid2; threadid2 = (int *)arg; while(1) sem_wait( sem_wait( sleep(1); data3=outBufferoOut; printf(“get%d:oOut=%d,nThe data get out of the outBuffer is:%dn“,*threadid2,oOut,data3); oOut=(oOut+1)%20; sem_post( sem_post( 9 sleep(1); 六测试时出现过的问题及解决方法1. 一开始写程序时无从下手,后来经过老师指点将本程序的P.V 原语写出, 程序就可以按照 P.V 原语的顺序往下写。2. 一开始不明白程序的线程操作上锁与解锁的含义,后来经老师指导得知线程互斥与同步就是信号量的互斥与同步,创建信号量就可以表示出线程间的关系。3. 出现段错误,后改成输入的数据有随机数生成函数产生即解决此问题。一开始不明白程序的线程操作上锁与解锁的含义,后来

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号