操作系统实验,实验8 消息队列
- 格式:ppt
- 大小:473.50 KB
- 文档页数:21


【实验目的】1.了解ADS集成开发环境,完成ADS的安装;2. 嵌入式实时操作系统µC/OS-II中消息队列机制的基本原理和使用方法。
【实验原理】1. 操作系统配置如下:#define TASK_STACK_SIZE 10*1024#define TASK_PRIO 10#define TSK_NUM 5#define N_MSG 10#define TASK1 1#define TASK2 22.相关系统调用如下:OSTaskCreate():建立一个新任务OSQCreate():建立一个消息队列OSQPend():等待消息OSQPostFront() :向消息队列发送消息OSQPost():向消息队列发送消息OSQQuery() :取得消息队列的信息OSQFlush ():清空消息队列OSQDel() :删除消息队列OSTimeDly ():任务延时3. 设计消息结构。
定义如下结构体:typedef struct msg_type{ // 定义消息结构体INT8U num; // 数据INT8U who; // 标记发送方}MY_MSG;对于who 可取的值,定义如下宏:#define TASK1 1#define TASk2 24. 定义消息指针数组与事件控制块void *MsgGrp[N_MSG]; //定义消息指针数组OS_EVENT* Msg_Q;//定义事件控制块事件控制块的初始化:(在主函数中)Msg_Q = OSQCreate( &MsgGrp[0], N_MSG); // create msg queue【实验要求】通过消息队列在任务间传递数据:1.任务TA1以随机(或固定)时间间隔依次将数据1、2、3、...发送至消息队列q1,每次发送一个数据。
2.TA2以随机(或固定)时间间隔将随机数据发送至q1。
3.TA3从消息队列q1中每次接收一个数据:如果数据来自TA1,则计算出所有已接收的来自TA1的数据之和,然后延时;如果数据来自TA2,则将数据输出到屏幕,然后延时(模拟处理数据所需的时间);调整发送数据和处理数据的速度,观察发送速度大于处理速度的结果。
消息队列介绍及原理消息队列(Message Queue)是一种进程间通信的方式,通过消息的方式进行数据传输和交互。
它将消息按照一定的顺序存放在队列中,接收方可以按照一定的规则从队列中取出消息进行处理。
消息队列常用于分布式系统或异步处理的场景中,它能够实现异步解耦、削峰填谷、异步处理等功能。
同时,消息队列还具有高可用、可靠性强等特点,使得它成为了当前分布式系统中不可或缺的重要组件。
下面将介绍消息队列的原理及其基本特点。
一、消息队列的基本原理消息队列的基本原理可以归纳为三个关键组成部分:生产者、队列和消费者。
1. 生产者(Producer):消息的生产者负责将需要传递的消息发送到队列中。
生产者只负责把消息发送到队列,不需要知道消息被谁接收。
2. 队列(Queue):消息队列是消息传递的媒介,它负责存储所有发送过来的消息。
消息队列通常是基于先进先出(FIFO)原则进行消息的存储和处理。
3. 消费者(Consumer):消费者从队列中获取消息并进行处理。
消费者需要从消息队列中主动获取消息,因此消费者和队列之间是解耦的。
消息队列的基本原理可以表示为:生产者将消息发送到队列,消费者从队列中获取消息进行处理。
生产者和消费者之间通过消息队列实现了解耦,生产者和消费者之间并不直接通信。
二、消息队列的基本特点消息队列具有以下的基本特点,使得它成为了一种重要的分布式系统通信方式。
1.异步解耦:生产者和消费者之间通过消息队列进行通信,生产者发送消息后即可继续其他逻辑处理,而不需要等待消费者的处理结果。
这样能够实现异步解耦,提高系统的响应速度和吞吐量。
2.削峰填谷:队列作为中间媒介,能够将消息暂时存储起来。
当消费者无法及时处理消息时,消息可以在队列中排队等待处理。
这样能够避免突发流量对系统的影响,平滑处理请求,达到平均请求速率。
3.可靠性:消息队列通常具备持久化机制,可以确保消息不会丢失。
即使在生产者发送消息后,但在消费者接收消息之前,如果发生系统故障,消息也不会丢失。
MSG一、实验目的1、了解什么是消息2、熟悉消息传送的机理。
二、实验内容消息的创建、发送和接收。
使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序三、实验内容指导提示(一)、什么是消息消息(message)是一个格式化的可变长的信息单元。
消息机制允许由一个进程给其它任意的进程发送一个消息。
当一个进程收到多个消息时,可将它们排成一个消息队列。
消息使用二种重要的数据结构:一是消息首部,其中记录了一些与消息有关的信息,如消息数据的字节数;二个消息队列头表,其每一表项是作为一个消息队列的消息头,记录了消息队列的有关信息。
1、消息机制的数据结构(1)消息首部记录一些与消息有关的信息,如消息的类型、大小、指向消息数据区的指针、消息队列的链接指针等。
(2)消息队列头表其每一项作为一个消息队列的消息头,记录了消息队列的有关信息如指向消息队列中第一个消息和指向最后一个消息的指针、队列中消息的数目、队列中消息数据的总字节数、队列所允许消息数据的最大字节总数,还有最近一次执行发送操作的进程标识符和时间、最近一次执行接收操作的进程标识符和时间等。
2、消息队列的描述符UNIX中,每一个消息队列都有一个称为关键字(key)的名字,是由用户指定的;消息队列有一消息队列描述符,其作用与用户文件描述符一样,也是为了方便用户和系统对消息队列的访问。
(二)、涉及的系统调用1. msgget( )创建一个消息,获得一个消息的描述符。
核心将搜索消息队列头表,确定是否有指定名字的消息队列。
若无,核心将分配一新的消息队列头,并对它进行初始化,然后给用户返回一个消息队列描述符,否则它只是检查消息队列的许可权便返回。
系统调用格式:msgqid=msgget(key,flag)该函数使用头文件如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义int msgget(key,flag)key_t key;int flag;其中:key是用户指定的消息队列的名字;flag是用户设置的标志和访问方式。