北邮操作系统消费者与生产者实验报告.doc
《北邮操作系统消费者与生产者实验报告.doc》由会员分享,可在线阅读,更多相关《北邮操作系统消费者与生产者实验报告.doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、北邮操作系统消费者与生产者实验报告 中括号内的数字为代码行号,下同。volatile long state:【1222】进程状态字,表示进程当前的状态(运行、就绪、等待、僵死、暂停、交换) ,分别对应已定义好的常量;TASK_RUNING :正在运行或可运行状态;TASK_INTERRUPTIBLE :可打断睡眠状态; TASK_UNINTERRUPTIBLE :不可打断睡眠状态;TASK_ZOMBLE :僵死状态;TASK_SPED :暂停状态;交换状态。void _stack:【1223】进程所使用的栈空间;unsigned int flags:【 1225】进程标志(创建、关闭、跟踪、被
2、跟踪、内核dump 等),同样对应已定义好的常量;unsigned int rt_priority :【 1237】表示本进程的实时优先级;const struct sched_class _sched_clas、sstruct sched_entity se:【 1239,1240】分别是调度类和 调度实体,这两个结构包含了用于任务调度的完整的信息(进程信息、调度策略等);unsigned int po l i cy : 【 1 260】进程的调度策略标志,有三种调度标志:SCHED_OTHER :普通进程的调度策略,基于优先权的轮转法; SCHED_FIFO :实时进程的调度策略,基于先进
3、先出的算法;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_he
4、ad ptraced: 【1321】本进程正在使用 ptrace 监视的进程列表;struct thread_struct thread:【1375】本进程下属的线程集;struct signal_struct _signal、 struct sighand_struct _sighand:【 1383,1384】分别是进程运行时 产生的信号以及信号处理模块。pthread 接口说明#include 1、创建int pthread_create( pthread_t _tid, const pthread_attr_t _attr, void _(_func) (void _), void _
5、arg ); attr: 线程属性包括:优先级、初始栈大小,是否应该成为一个守护线程。缺省设置, NULL后面是线程要执行的函数和参数成功返回 02、等待一个给定线程终止int pthread_join( pthread_t tid, void _status);等待线程结束 critiction 可以在进程中使用, mute_ 只可在进程中使用statues返回等待线程的返回值multiple defi niti on of #; _dso_ha ndle#;/usr/lib/gcc/i486-linu_-gnu/4.4.3/crtbegin.o:(.data+0): first defin
6、ed herethreadTest: In function #;_init#;:(.init+0): multiple definition of #;_init#;/usr/lib/gcc/i486-linu_-gnu/4.4.3/././././lib/crti.o:(.init+0): first defined here/tmp/cchm2SmY.o:(.data+0): multiple definition of #;flag#; threadTest:(.data+0_8): first defined here /tmp/cchm2SmY.o: In function #;t
7、hreadMe3、得到自身的 pidpthread_t pthread_self(void);4、pthread_detach 函数int pthread_detach( pthread_t pid );把指定的线程转变为脱离状态一个线程或者是可汇合的(joinable,缺省值),或者是脱离的(detached)。当一个可汇 合的线程终止时,它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程:当它们终止的时, 所有相关资源都被释放, 我们不能等待它们终止。如果 一个线程需要知道另一个线程什么时候终止,那就最好好吃第二个线程的可汇合状态。本函数通常由想让
8、自己脱离的线程调用,如下语句pthread_detach( pthread_self() );5、终止一个线程void pthread_e_it( void _statue );指针sttus不能指向局部于调用对象,因为线程终止时这样的对象也消失( 3)阅读 Linu_ 的 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_
9、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 coun t);PTW32_DLLPORT int _cdecl sem_close (sem_t _sem);PTW32_DLLPORT int _c
10、decl sem_u nlin k (co nst 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
11、。它也是一个原子操作。_/实验环境此实验采用的是 8下 Visual Stdio 20_ 工程。由于系统不包含semaphored,sched.h及pthread.h头文件,所以这些头文件都是从网上FTP资源下载后,加入工程的。程序中加入 #pragma comment(lib , “pthreadVC2.lib”)来调用 pthread链接库。文件根目录下已下载 pthreadVC2.dll _/实验步骤A .设计思路这个问题是进程同步的经典问题之一,基本思路是设置三个信号量:mute_信号量,用于控制生产者和消费者对于缓冲区的互斥访问;empty信号量,记录当前为空的缓冲区的数目,初始化为
12、所有缓冲区的数目 BUF_SIZE full信号量,记录当前已满的缓冲区的数目, 初始化为0。_/一个buffer,一个生产者,一个消费者(1)规则只有buffer为空才能put;只有buffer中有数据才能get;不允许多个put操作同时进行; 不允许多个get操作同时进行。这时buffer变成了临界资源,消费者之间需要互斥地使用,生产者之间也需要互斥地使 用,消费者和生产者之间也需要互斥地使用,这时设置两个信号量s1, s2实现同步,例外设置 S信号,代表buffer这种临界资源,用于互斥,称之为互L /宀口曰.斥信号量。(2 )实现流程生产者p (s1)“判断buffer是否空”p (
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 消费者 生产者 实验 报告
限制150内