北邮操作系统消费者与生产者实验报告
- 格式:doc
- 大小:359.50 KB
- 文档页数:9
北京邮电大学操作系统实验实验报告班号:姓名:学号:实验日期: 2014.11.16 实验名称:操作系统实验一、实验目的1、熟悉LINUX的基本环境,了解LINUX下进程和线程的实现二、实验内容1、熟悉UNIX/LINUX的常用基本命令2、利用fork()生成子进程和clone()生成线程。
3、通过mutex来实现生产者和消费者问题。
三、项目要求及分析(1)下载并安装LINUX,可以使用FEDORA或Ubuntu.(2)熟悉UNIX/LINUX的常用基本命令如ls、who、wc、pwd、ps、pstree、top,cat,cd,chgrp,chmod,chown,comm,cmp,cp,rm,diff,mv,rmdir等,了解环境。
(3)比较fork()和clone()的功能,利用fork()生成子进程和clone()生成线程。
(4)利用pthread库,通过其中的mutex来实现生产者和消费者问题。
(5) 使用System V的信号灯,实现第二类读者-写者问题(写者优先,新来的读者不允许进行写操作)。
四、具体实现(1):熟悉UNIX/LINUX的常用基本命令名称: ls使用权限: 所有使用者使用方式: ls [-alrtAFR] [name...]说明: 显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。
参数:-a 显示所有档案及目录(ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)-l 除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出-r 将档案以相反次序显示(原定依英文字母次序)-t 将档案依建立时间之先后次序列出-A 同-a ,但不列出"." (目前目录) 及".." (父目录)-F 在列出的档案名称后加一符号;例如可执行档则加"*", 目录则加"/"-R 若目录下有档案,则以下之档案亦皆依序列出名称: who使用权限: 所有使用者都可使用使用方式: who - [husfV] [user]说明: 显示系统中有那些使用者正在上面,显示的资料包含了使用者ID,使用的终端机,从哪边连上来的,上限时间,呆滞时间,CPU 使用量,动作等等。
操作系统课程设计报告生产者与消费者算法的实现课程名称:计算机操作系统课程设计小组成员:班级:时间:操作系统课程设计生产者与消费者实现目录1 课设简介: (1)1.1课程设计题目 (1)1.2课程设计小组成员 (1)1.3小组成员任务分配情况及每人所占工作比例 (1)2 生产者和消费者原理分析 (1)3 生产者与消费者功能描述: (1)4 数据结构分析 (2)5 生产者与消费者实现代码 (2)6 心得体会 (7)参考文献: (7)相关工具: (8)致谢: (8)1 课设简介:1.1课程设计题目生产者与消费者算法的实现1.2课程设计小组成员张洋、巢蕾、段敏1.3小组成员任务分配情况及每人所占工作比例张洋负责:分析设计消费一个产品方法和主方法并且画出流程图,后期组织组内成员成果汇总进行本组总体报告撰写。
巢蕾负责:分析设计生产者的行为方法和消费者的行为方法,并且画出流程图段敏负责:分析设计生产产品的方法和把新生产的产品放入缓冲区,并且画出流程图。
2生产者和消费者原理分析在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
3 生产者与消费者功能描述:3.1生产者功能描述在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
3.2消费者功能描述消费者线程从缓冲区中获得物品,然后释放缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
《操作系统课程设计》实验报告生产者消费者问题2013年12 月25 日一设计目标运用条件变量和互斥锁原理实现线程同步问题,解决生产者消费者问题1.1 背景知识说明在Linux环境下需要使用POSIX库进行设计实现,POSIX是Portable Operating System Interface of Unix的缩写。
由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO 标准化。
POSIX的诞生和Unix的发展是密不可分的,Unix于70年代诞生于贝尔实验室,并于80年代向美各大高校分发V7版的源码以做研究。
加利福尼亚大学伯克利分校在V7的基础上开发了BSD Unix。
后来很多商业厂家意识到Unix的价值也纷纷以贝尔实验室的System V或BSD 为基础来开发自己的Unix,较著名的有Sun OS,AIX,VMS。
文档收集自网络,仅用于个人学习基于posix的线程标准库是pthreadPOSIX线程(POSIX Thread),简称Pthread,是线程的POSIX 标准。
该标准定义了创建和操纵线程的一整套API。
在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthread作为操作系统的线程。
Windows操作系统也有其移植版pthread-win32。
文档收集自网络,仅用于个人学习Pthreads定义了一套C语言的类型、函数与常量,它以pthread.h头文件和一个线程库实现。
1.2 原理在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
操作系统课程设计(一号黑体加粗)用多进程同步方法解决生产者-消费者问题(小二黑体加粗)院系:小二黑体加粗班级:学号:姓名:同组者:时间:目录(小二黑体加粗)一、题目:............................... 错误!未定义书签。
二、设计目的:........................... 错误!未定义书签。
三、总体设计思想概述:................... 错误!未定义书签。
四、说明:............................... 错误!未定义书签。
五、设计要求:........................... 错误!未定义书签。
六、设计方案:........................... 错误!未定义书签。
七、流程图:............................. 错误!未定义书签。
八、运行结果............................. 错误!未定义书签。
九、源程序............................... 错误!未定义书签。
十、总结................................. 错误!未定义书签。
十一、参考文献........................... 错误!未定义书签。
四号黑体一、题目:(标题2,即三号黑体加粗)用多进程同步方法解决生产者-消费者问题。
二、设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。
三、总体设计思想概述:1、生产者—消费者问题是一种同步问题的抽象描述。
2、计算机系统中的每个进程都可以消费或生产某类资源。
当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。
3、而当某个进程释放资源时,则它就相当一个生产者。
四、说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。
实验一模拟生产者-消费者问题和读者-写者问题生产者-消费者问题一组生产者进程生产产品给一组消费者进程消费。
一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。
生产者——消费者问题实际上是相互合作进程关系的一种抽象。
该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。
使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。
用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,in加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,out加1。
缓冲池是循环数组。
可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
本实验模拟了生产者——消费者问题。
实验内容与步骤清单1模拟了生产者——消费者问题。
步骤1:登录进入Windows 系统。
步骤2:在―开始‖菜单中单击―程序-Microsoft Visual Studio 6.0 – Microsoft Vis ual C++ 6.0‖命令,进入Visual C++窗口。
步骤3:在工具栏单击―打开‖按钮,在―打开‖对话框中找到并打开实验源程序1.cpp。
步骤4:单击―Build‖菜单中的―Compile 1.cpp‖命令,并单击―是‖按钮确认。
系统对1.cpp进行编译。
步骤5:编译完成后,单击―Build‖菜单中的―Build 1.exe‖命令,建立1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?运行结果(记录第一个消费者以及其执行前的记录):读者-写者问题一个数据文件或者记录可被多个进程(或线程)共享。
其中,有些进程(或线程)要求读;而另一些进程(或线程)要求能写或者修改。
只要求读的进程(或线程)称为―Reader 进程‖,其他进程(或线程)称为―Witer进程(或线程)‖。
重庆交通大学综合性设计性实验报告班级:软件专业 2010 级一班姓名:李佳奇实验项目名称:生产者与消费者实验项目性质:操作系统多任务实验所属课程:计算机操作系统实验室(中心):语音大楼 8 楼 801指导教师:米波实验完成时间: 2012 年 11 月 23 日一、实验目的1、通过实验来模拟生产者与消费者,来深入了解什么事操作系统的进程,以及进程有些什么特性。
2、了解进程间是如何做到同步的,进程间是如何做到通信的。
3、通过实验来了解进程之间同步和通信机制。
二、实验内容及要求做一个能够能直观地体现多个进程之间通过临界区进行数据的访问修改,体现出生产者和消费者关系,通过信号量进行控制。
三、实验设备PC机,windows7,eclipse。
四、设计方案㈠设计主要思想(1).要模拟多线程并发,则首先需要可视化地体现进程的运行,这样我们才能看到效果,所以可以通过进度条的长度表示生产者的生产过程和消费者的消费过程,而临界缓冲区则定义一个自定义的栈。
(2).分别定义一个生产者和两个消费者,这三个进程是完全独立的,生产者不断的向缓冲区放货物,当缓冲区满了的时候,则阻塞自己,直到消费者取走了一个货物后,将通知生产者将其唤醒。
(3).消费者不断的从缓冲区里取数据,当缓冲区为空时,则阻塞自己,直到生产者将一个货物放到缓冲区时,通知消费者,将消费着唤醒,消费者重新开始消费。
㈡设计的主要步骤(1).创建一个自定义的栈类StackBuffer,在压栈和出栈时实现同步互斥,在压栈的时候先判断堆栈是否已满,若满,则使压栈线程阻塞,否则压栈。
在出栈的时候先判断是否栈为空,若空,则将出栈线程阻塞。
核心代码:public synchronized void push(JLabel product){while(isFull()){try{this.wait();} catch (InterruptedException e){e.printStackTrace();}}this.notifyAll();productbuffer[sip++].setVisible(true);}public synchronized JLabel pop(){while(isEmpty()){try{this.wait();} catch (InterruptedException e){e.printStackTrace();}}this.notifyAll();productbuffer[--sip].setVisible(false);return productbuffer[sip];}(2).创建一个customer类继承JProgressBar类,接口Runnable,并且拥有一个StackBuffer类,在run()方法中实现在不断向StackBuffer类对象中出栈。
操作系统实验报告实验一.doc计算机操作系统实验报告一、实验一生产者-消费者问题二、实验目的:通过对生产者-消费者问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用。
了解线程互斥和同步机制。
操作系统实验报告了解PV原语和信号量在线程互斥和同步机制中的运用。
三、实验内容有界缓冲区内设有5个存储单位,放入/取出的数据项设定为1~5这5个整形数。
要求每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者/消费者标识符四、分析设计实验陈述:1、基础知识:本实验用到几个API函数:CreatThread, CreatMutex, CreatSemaphore, WaitForSingleObject, ReleaseSemaphore, ReleaseMutex, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection这些函数的作用:??????CreatThread: 创建一个线程,该线程在调用进程的地址空间中执?????CreatMutex : 产生一个命名的或者匿名的互斥量对象。
WaitForSingleObject(对应p操作)锁上互斥锁,ReleaseMutex(对应v操作)打开互斥锁。
???CreateSemaphore:创建一个命名的或者匿名的信号对象。
操作系统实验报告信号量可以看作是在互斥量上的一个扩展。
??WaitForSingleObject:使程序处于等待状态,直到信号量(或互斥量)hHandle出现或者超过规定的等待最长时间,信号量出现指信号量大于或等于1,互斥量出现指打开互斥锁。
在返回之前将信号量减1或者锁上互斥锁。
?? ReleaseSemaphore:将所指信号量加上指定大小的一个量,执行成功,则返回非0值。
? ?ReleaseMutex:用来打开互斥量,即将互斥量加1。
计算机操作系统课程设计报告《生产者---消费者问题》《计算机操作系统》课程设计题目:生产者---消费者问题专业:软件工程年级:2010级小组成员: A B指导教师:时间:地点:2012年5 月摘要生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。
该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。
生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。
与此同时,消费者也在缓冲区消耗这些数据。
该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
目录1. 概述 (4)2. 课程设计任务及要求 (4)2.1 设计任务 (4)2.2 设计要求 (4)2.3 分工日程表 (4)3. 算法及数据结构 (5)3.1算法的总体思想 (5)3.2 生产者模块 (5)3.3 消费者模块 (7)4. 程序设计与实现 (8)4.1 程序流程图 (8)4.2 程序代码 (9)4.3 实验结果 (14)5. 结论 (17)6. 收获、体会和建议 (17)6.1收获......................................... 错误!未定义书签。
7. 参考文献 (18)1. 概述本课题设计是完成了“操作系统原理”课程进行的一次全面的综合训练,通过这次课程设计,充分检验学生对课程的掌握程度和熟练情况,让学生更好的掌握操作系统的原理及其实现方法,加深对课程的基础理论和算法的理解,加强学生的动手能力。
操作系统实验课程报告
课题: 消费者与生产者实验
姓 名 张涛 学 院 计算机学院 班 级 2011211311 学 号 2011211419
2013年 12月 14日 1.实验目的: 1) 理解线程同步的思想和方法,学会用线程同步解决临界区问题,本次实验解决生产者消费者问题 2了解windows系统或linux系统下中信号量的使用方法。
2.实验预备内容
(1) 阅读Linux的sched.h源码文件,加深对进程管理概念的理解。 这个文件长达2616行,这里截取第1221~1548行抄录在实验报告最后,即结构体task_struct,地位相当于PCB。 下面对几个比较重要的参数,结合本人的了解 以及 网上查阅的资料 做一点解释。 中括号内的数字为代码行号,下同。 volatile long state:【1222】进程状态字,表示进程当前的状态(运行、就绪、等待、僵死、暂停、交换),分别对应已定义好的常量; TASK_RUNING:正在运行或可运行状态; TASK_INTERRUPTIBLE:可打断睡眠状态; TASK_UNINTERRUPTIBLE:不可打断睡眠状态; TASK_ZOMBLE:僵死状态; TASK_STOPPED:暂停状态; 交换状态。 void *stack:【1223】进程所使用的栈空间; unsigned int flags:【1225】进程标志(创建、关闭、跟踪、被跟踪、内核dump等),同样对应已定义好的常量; unsigned int rt_priority:【1237】表示本进程的实时优先级; const struct sched_class *sched_class、struct sched_entity se:【1239,1240】分别是调度类和调度实体,这两个结构包含了用于任务调度的完整的信息(进程信息、调度策略等); unsigned int policy:【1260】进程的调度策略标志,有三种调度标志: SCHED_OTHER :普通进程的调度策略,基于优先权的轮转法; SCHED_FIFO:实时进程的调度策略,基于先进先出的算法; SCHED_RR:实时进程的调度策略,基于优先权的轮询法。 struct list_head tasks:【1274】任务队列,为一双向循环链表; int pdeath_signal:【1282】父进程终止时产生的信号; pid_t pid:【1294】进程标识符,操作系统每创建一个新的进程就要为这个新进程分配一个进程控制块(PCB),系统内核通过pid区分这些进程的; struct task_struct *real_parent:【1307】本进程的父进程的PCB; struct list_head children:【1312】本进程的子进程列表; struct list_head ptraced:【1321】本进程正在使用ptrace监视的进程列表; struct thread_struct thread:【1375】本进程下属的线程集; struct signal_struct *signal、struct sighand_struct *sighand:【1383,1384】分别是进程运行时产生的信号以及信号处理模块。
(2) 阅读Linux的pthread.h源码文件,分析线程的创建过程。 pthread接口说明 #include 1、创建 int pthread_create( pthread_t *tid, const pthread_attr_t *attr, void *(* func) (void *), void *arg ); attr: 线程属性包括:优先级、初始栈大小,是否应该成为一个守护线程。 缺省设置,NULL 后面是线程要执行的函数和参数 成功返回 0 2、等待一个给定线程终止 int pthread_join( pthread_t tid, void **status);等待线程结束 critiction 可以在进程中使用,mutex只可在进程中使用 statues返回等待线程的返回值 multiple definition of `__dso_handle' /usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined here threadTest: In function `_init': (.init+0x0): multiple definition of `_init' /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.init+0x0): first defined here /tmp/cchm2SmY.o:(.data+0x0): multiple definition of `flag' threadTest:(.data+0x8): first defined here /tmp/cchm2SmY.o: In function `threadMe 3、得到自身的pid pthread_t pthread_self(void); 4、pthread_detach函数 int pthread_detach( pthread_t pid ); 把指定的线程转变为脱离状态 一个线程或者是可汇合的(joinable,缺省值),或者是脱离的(detached)。当一个可汇合的线程终止时,它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程:当它们终止的时,所有相关资源都被释放,我们不能等待它们终止。如果一个线程需要知道另一个线程什么时候终止,那就最好好吃第二个线程的可汇合状态。 本函数通常由想让自己脱离的线程调用,如下语句 pthread_detach( pthread_self() ); 5、终止一个线程 void pthread_exit( void *statue ); 指针sttus不能指向局部于调用对象,因为线程终止时这样的对象也消失 (3) 阅读Linux的semaphore.h源码文件,分析线程的创建过程。 typedef struct sem_t_ * sem_t; PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, int pshared, unsigned int value); PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, int count); PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); PTW32_DLLPORT int __cdecl sem_unlink (const char * name);
int sem_init(sem_t *sem,int pshared,unsigned int value)。用于信号量的初始化,第一个参数为信号量的名称,第二个参数为信号量的共享属性,一般设为0(不共享),第三个参数为信号量的初始值。 int sem_wait(sem_t *sem)。相当于上面的wait()操作,作用是当信号量的值大于0时,给信号量的值减1,否则会阻塞直至信号量的值大于0。它是一个原子操作。 int sem_post(sem_t *sem)。相当于上面的signal()操作,作用是给信号量的值加1。它也是一个原子操作。
******************************************************************************/ 3.实验环境 此实验采用的是Win8下Microsoft Visual Stdio 2012工程。由于系统不包含semaphore.h,sched.h及pthread.h头文件,所以这些头文件都是从网上FTP资源下载后,加入工程的。
程序中加入#pragma comment(lib, "pthreadVC2.lib")来调用pthread链接库。
文件根目录下已下载pthreadVC2.dll ******************************************************************************/
4.实验步骤 A.设计思路 这个问题是进程同步的经典问题之一,基本思路是设置三个信号量:mutex信号量,用于控制生产者和消费者对于缓冲区的互斥访问;empty信号量,记录当前为空的缓冲区的数目,初始化为所有缓冲区的数目BUF_SIZE;full信号量,记录当前已满的缓冲区的数目,初始化为0。
******************************************************************************/ 一个buffer,一个生产者,一个消费者 (1)规则 只有buffer为空才能put;只有buffer中有数据才能get;不允许多个put操作同时进行;不允许多个 get操作同时进行。 这时buffer变成了临界资源,消费者之间需要互斥地使用,生产者之间也需要互斥地使用,消费者和生产者之间也需要互斥地使用,这时设置两个信号量 s1,s2实现同步,例外设置S信号,代表buffer这种临界资源,用于互斥,称之为互斥信号量。
(2)实现流程 p(s1)"判断buffer是否空"