北邮操作系统消费者与生产者实验报告
- 格式:doc
- 大小:359.50 KB
- 文档页数:9
操作系统实验课程报告
课题: 消费者与生产者实验
姓名张涛
学院计算机学院
班级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,