计算机操作系统课程设计报告(共16页).doc
《计算机操作系统课程设计报告(共16页).doc》由会员分享,可在线阅读,更多相关《计算机操作系统课程设计报告(共16页).doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上操作系统设计报告 姓名:韦李 学号:5 日期:2013年12月30日 目录第1章 需求分析1.1 设计题目用多线程同步方法解决生产者消费者问题1.2 设计目的1.通过编程实现生产者与消费者问题,了解进程同步的概念,理解信号量机制的原理。2.掌握运用信号量解决进程同步问题的方法,学会运用进程的同步于互斥结局生产者与消费者的冲突问题。3.通过研究Linux的线程机制和信号量实现生产者消费者问题的并发控制。1.3 设计环境与工具1.3.1 设计环境Fedora 10操作系统1.3.2 设计工具 Vi 编辑器,gcc编译器1.4 设计要求 1.有界缓冲区内设有20个存储单元,
2、放入/取出的数据项设定为1-20这20个整型数。2.每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。3.生产者和消费者各有两个以上。4.多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。第2章 概要设计2.1 设计内容与原理2.1.1 设计内容在同一个进程地址空间内执行的两个线程,生产者生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区,当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区,当消费者线程消费物品时,如果没有满
3、的缓冲区,那么消费者线程将被阻塞,知道新的物品被生产出来,我的具体做法也是如此,建立缓冲区,生产者生产的产品放入,消费者从中取产品,如果没有产品,则等待。2.1.2 设计原理 要实现生产者与消费者的互斥关系,生产者和消费者进程之间必须满足两个同步条件: 1.只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才可以从中提取消息,否则消费者必须等待。 2.只有缓冲池中至少有一个缓冲区是空时,生产者才可以把消息放入缓冲区中,否则生产者必须等待。要满足第一个同步条件,设置一个同步信号量full_sem,它的值为20时整个缓冲区满,这个资源是消费者进程所拥有,消费者进程可以申请资源,对它做P操作;另外一
4、个信号量empty_sem,它的初值为20,表示整个缓冲区都是空的。可以用full_sem表示空缓冲区数量,empty_sem表示满缓冲区数量,另外有界缓冲区是一个临界资源,必须互斥使用,所以必须再设置一个互斥信号量mux,初值为1。在生产者/消费者问题中,信号量实现两种功能,首先,它是跟踪资源的生产和消费的计数器,其次,它是协调产品的生产者和消费者之间动作同步的同步器。消费者通过再一指派给它的信号量上做P操作来表示消耗资源,而生产者通过再同一个信号量上做V操作来表示生产资源。而这种信号量的实施中,计数在每次P操作后减1,而在每次V操作后加1。这个计数器的初始值是可利用的资源数目,当资源是不可
5、利用时,将申请资源的进程防止在等待队列中,如果有一个资源释放,在等待队列中的第一个进程被唤醒并得到资源的控制权。假定在生产者和消费者之间的公用缓冲区中,具有n个缓冲区,这时可以利用互斥信号量mutex实现诸进程对缓冲区的互斥使用,利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量,又假定这些生产者和消费者互相等效果,只要缓冲区未满,生产者便可以将消息送入缓冲池,只要缓冲池未空,消费者便可以从缓冲池中取走一个消息。2.2 程序流程图生产一条数据是否可用存储单元是否可用存入一条数据归还使用权数据单元加1,唤醒一个消费者等待资源,阻塞被唤醒等待使用权,阻塞被唤醒无有否图 2.1
6、生产者流程图是否有数据单元是否可用取走一条数据归还使用权空单元加1,唤醒一个生产者消费数据等待资源,阻塞被唤醒等待使用权,阻塞被唤醒有是否图2.2 消费者流程图第3章 详细设计3.1 数据结构#define N 2 / 消费者或者生产者的数目#define M 10 / 缓冲数目int in = 0; / 生产者放置产品的位置int out = 0; / 消费者取产品的位置int buffM = 0; / 缓冲初始化为0, 开始时没有产品sem_t empty_sem; / 同步信号量, 当满了时阻止生产者放产品sem_t full_sem; / 同步信号量, 当没产品时阻止消费者消费pthr
7、ead_mutex_t mutex; / 互斥信号量, 一次只有一个线程访问缓冲int product_id = 0; /生产者idint prochase_id = 0; /消费者id3.2 算法说明3.2.1 同步机制原语算法P进程不能往“满”的缓冲区中放产品,设置信号量为sem_empty;Q进程不能从“空”的缓冲区中取产品,设置信号量为sem_full。先设置信号量:sem_empty初值为1,sem_full初值为0实现原语如下:P: Q:While(true) while(true) 生产一个产品; P(sem_full); P(Sem_empty); 从缓冲区去产品 送产品到缓冲
8、区; V(sem_empty); V(sem_full); 消费产品; P原语操作的主要动作是:1.sem减1;2.若sem减1后仍大于或等于零,则进程继续执行;3.若sem减1后仍小于零,则该进程被阻塞后与该信号所对应的队列中,然后转入进程调度;V原语操作的主要动作时:1Sem加1;2.若相加结果大于零;3.若相加结果小于或者等于零,则从该信号的等待队列中唤醒一等待队列,然后再返回原进程继续执行或转入进程调度。3.2.2 具体算法实现Semaphore mutex=1;/定义互斥信号量Semaphore empty=n;/定义同步信号量Semaphore full=0;itemn;/定义缓冲
9、池Int in=0;/生产者放置位置Int out=0;/消费者放置位置Producer() /生产者 While(true) Produce an item in next_product;/ 生产者产生数据 Swait(empty,mutex);/等待缓冲区空信号量 Arrayin=next_product;/将数据放入缓冲池 In=(in+1)%n; Ssignal(mutex,full); Consumer() /消费者 While(true) Swait(full,mutex);/等待缓冲池满信号量 Next_consumer=arrayout;/从缓冲池取出数据 Out=(out+
10、1)%n; Ssignal(mutex,empty); Consume the product in next_consumer;/等待下一个消费者取出数据 3.3 具体程序实现3.3.1 生产者方法在生产者方法的实现中,先产生一个数据,然后判断缓冲池空信号量,如果缓冲池至少有一个为空则将先将缓冲池上锁,然后将数据放入缓冲池,将放入数据位置指针后移,放入数据后将缓冲池解锁;如果缓冲池为满,则生产者线程进入阻塞状态,进入进程调度队列,并等待缓冲池空信号量。/* 生产者方法 */ void *product()int id = +product_id;while(1) / 用sleep的数量可以调
11、节生产和消费的速度,便于观察 sleep(1); /sleep(1); sem_wait(&empty_sem);/等待缓冲池空信号量 pthread_mutex_lock(&mutex);/对缓冲池上锁 in = in % M; printf(product%d in %d. like: t, id, in);/显示生产者ID buffin = 1; /将数据放入缓冲区 print(); /打印存数结果 +in; /写入位置指针后移 pthread_mutex_unlock(&mutex);/对缓冲池解锁 sem_post(&full_sem); /等待缓冲池满信号量3.3.2 消费者方法在
12、消费者方法实现中,首先判断缓冲池满信号量,如果缓冲池中不为空,则进行取数操作,并对缓冲池上锁,取数后,显示消费者ID,随后对缓冲池解锁;如果缓冲池为空,则不对缓冲池操作,消费者线程进入阻塞状态,进入线程调度队列。/* 消费者方法 */void *prochase()int id = +prochase_id;while(1) / 用sleep的数量可以调节生产和消费的速度,便于观察 sleep(1);/sleep(1); sem_wait(&full_sem);/等待缓冲池满指针 pthread_mutex_lock(&mutex);/对缓冲池上锁 out = out % M; printf(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 课程设计 报告 16
限制150内