版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第10讲讲 任务通信与同步任务通信与同步 主要内容主要内容 概述概述 信号灯信号灯 消息队列消息队列 事件事件 管道管道 概述概述 多任务系统中任务之间的关系多任务系统中任务之间的关系 相互独立相互独立 仅竞争仅竞争CPU资源资源 竞争除竞争除CPU外的其他资源(互斥)外的其他资源(互斥) 同步同步 协调彼此运行的步调,保证协同运行的协调彼此运行的步调,保证协同运行的 各个任务具有正确的执行次序各个任务具有正确的执行次序 通信通信 彼此间传递数据或信息,以协同完成某彼此间传递数据或信息,以协同完成某 项工作项工作 进程同步的例子进程同步的例子 只有当售票员关门之后司机才能启动车辆,只有当售票
2、员关门之后司机才能启动车辆, 只有司机停车之后售票员才能开车门。司只有司机停车之后售票员才能开车门。司 机和售票员的行动需要一定的协调。同样机和售票员的行动需要一定的协调。同样 地,两个进程之间有时也有这样的依赖关地,两个进程之间有时也有这样的依赖关 系,因此我们也要有一定的同步机制保证系,因此我们也要有一定的同步机制保证 它们的执行次序它们的执行次序 任务能以以下方式与中断处理程序或其任务能以以下方式与中断处理程序或其 他任务进行同步或通信:他任务进行同步或通信: 单向同步或通信单向同步或通信:一个任务与另一个任务或:一个任务与另一个任务或 一个一个ISR同步或通信。同步或通信。 双向同步或
3、通信双向同步或通信:两个任务相互同步或通信。:两个任务相互同步或通信。 双向同步不能在任务与双向同步不能在任务与ISR之间进行,因为之间进行,因为 ISR不能等待。不能等待。 概述概述 ISR x Task y POSTPEND Task xTask y POSTPEND POSTPEND Task xTask y POSTPEND 在单处理器平台上,嵌入式操作系统内在单处理器平台上,嵌入式操作系统内 核提供的同步、互斥与通信机制主要包核提供的同步、互斥与通信机制主要包 括:括: 信号灯信号灯(semaphore),用于互斥与同步),用于互斥与同步 事件(组)事件(组)(event group
4、),用于同步),用于同步 异步信号异步信号(asynchronous signal),用于),用于 同步同步 邮箱邮箱(mailbox)、)、消息队列消息队列(message queue),用于消息通信),用于消息通信 管道管道(pipe),提供非结构化数据交换和实),提供非结构化数据交换和实 现同步现同步 概述概述 以下一些机制也可用于同步与通信(在以下一些机制也可用于同步与通信(在 单处理器或多处理器系统中):单处理器或多处理器系统中): 全局变量全局变量 共享内存共享内存 套接字(套接字(Sockets) 远程过程调用(远程过程调用(Remote Procedure Call) 概述概述
5、 Linux下任务通信手段下任务通信手段 信号信号 消息队列消息队列 管道管道 信号灯信号灯 套接字套接字 共享存储段共享存储段 第一节第一节 信号灯信号灯 信号灯的种类及用途信号灯的种类及用途 互斥信号灯互斥信号灯 二值信号灯二值信号灯 计数信号灯计数信号灯 信号灯机制的主要数据结构信号灯机制的主要数据结构 典型的信号灯操作典型的信号灯操作 信号灯信号灯(Semaphore(Semaphore或称信号量)用于实现任务或称信号量)用于实现任务 与任务之间、任务与中断处理程序之间的与任务之间、任务与中断处理程序之间的同步同步 与与互斥互斥。 信号灯一般分为三种:信号灯一般分为三种: 信号灯的种类
6、及用途信号灯的种类及用途 用于解决互斥问题。它比较特殊,可能用于解决互斥问题。它比较特殊,可能 会引起优先级反转问题。会引起优先级反转问题。 用于解决同步问题用于解决同步问题 用于解决资源计数问题用于解决资源计数问题 用互斥信号灯保护的代码区称作用互斥信号灯保护的代码区称作“临界区临界区”,临界区,临界区 代码通常用于对代码通常用于对共享资源共享资源的访问。的访问。 互斥信号灯的值被初始化成互斥信号灯的值被初始化成1 1,表明目前没有任务进入,表明目前没有任务进入 “临界区临界区”,但最多只有一个任务可以进入,但最多只有一个任务可以进入“临界临界 区区”。 第一个试图进入第一个试图进入“临界区
7、临界区”的任务将成功获得互斥信的任务将成功获得互斥信 号灯,而随后试图进入用同一信号灯保护的临界区的号灯,而随后试图进入用同一信号灯保护的临界区的 所有其他任务就必须等待。所有其他任务就必须等待。 当任务离开当任务离开“临界区临界区”时,它将释放信号灯并允许正时,它将释放信号灯并允许正 在等待该信号灯的任务进入在等待该信号灯的任务进入“临界区临界区”。 互斥信号灯互斥信号灯 Task1 Task2 共享资源共享资源 互斥信号灯互斥信号灯 共享资源可能是一段存储器空间、一个数据结构共享资源可能是一段存储器空间、一个数据结构 或或I/OI/O设备,也可能是被两个或多个并发任务共享设备,也可能是被两
8、个或多个并发任务共享 的任何内容。的任何内容。 使用互斥信号灯可以实现对共享资源的串行访问,使用互斥信号灯可以实现对共享资源的串行访问, 保证只有成功地获取互斥信号灯的任务才能够释保证只有成功地获取互斥信号灯的任务才能够释 放它。放它。 互斥信号灯是一种特殊的二值信号灯,一般它支互斥信号灯是一种特殊的二值信号灯,一般它支 持持所有权所有权、递归访问递归访问、任务删除安全任务删除安全和一些和一些避免避免 优先级反转、饥饿、死锁等互斥所固有问题的协优先级反转、饥饿、死锁等互斥所固有问题的协 议议。 互斥信号灯状态图互斥信号灯状态图 互斥信号灯状态图互斥信号灯状态图 开启开启锁定锁定 初始化初始化
9、值为值为1 申请并获得申请并获得 值为值为0 释放释放 值为值为1 申请申请(递归递归)并获得并获得 锁定数加锁定数加1 释放释放(递归递归) 锁定数减锁定数减1 互斥信号灯互斥信号灯 所有权:当一个任务通过获取互斥信号灯所有权:当一个任务通过获取互斥信号灯 而将其锁定时,得到该互斥信号灯的所有而将其锁定时,得到该互斥信号灯的所有 权。相反,当一个任务释放信号灯时,失权。相反,当一个任务释放信号灯时,失 去对其的所有权。去对其的所有权。 当一个任务拥有互斥信号灯时,其他的任当一个任务拥有互斥信号灯时,其他的任 务不能再锁定或释放它,即任务要释放互务不能再锁定或释放它,即任务要释放互 斥信号灯,
10、必须事前先获取该信号灯。斥信号灯,必须事前先获取该信号灯。 二值信号灯二值信号灯 二值信号灯主要用于二值信号灯主要用于任务与任务之间任务与任务之间、任务与中任务与中 断服务程序断服务程序之间的同步之间的同步 用于同步的二值信号灯初始值为用于同步的二值信号灯初始值为0,表示同步事件尚未,表示同步事件尚未 产生;产生; 任务任务申请信号灯申请信号灯以等待该同步事件的发生;以等待该同步事件的发生; 另一个任务或另一个任务或ISR到达同步点时,到达同步点时,释放信号灯释放信号灯(将其值(将其值 设置为设置为1)表示同步事件已发生,以唤醒等待的任务。)表示同步事件已发生,以唤醒等待的任务。 Task1T
11、ask2 二值信号灯二值信号灯 初值为初值为0 二值信号灯二值信号灯 二值信号灯状态图二值信号灯状态图 可获得可获得不可获得不可获得 申请并获得申请并获得 (值为值为0) 释放释放 (值为值为1) 初始化初始化 值为值为0 Task1() 执行一些操作执行一些操作; 将信号灯将信号灯sem1置置1; 申请信号灯申请信号灯sem2; Task2() 申请信号灯申请信号灯sem1; 执行一些操作执行一些操作; 将信号灯将信号灯sem2置置1; Task2申请信号灯申请信号灯 sem1失败,系统失败,系统 切换到切换到Task1 s e m 1 被 置被 置 1 后 ,后 , Task2得到得到se
12、m1并并 抢占抢占Task1 Task2运行到某处运行到某处 时因某种原因被时因某种原因被 阻塞,系统切换阻塞,系统切换 到到Task1 计数信号灯计数信号灯 计数信号灯用于控制系统中共享资源的多计数信号灯用于控制系统中共享资源的多 个实例的使用,允许多个任务同时访问同个实例的使用,允许多个任务同时访问同 一种资源的多个实例一种资源的多个实例 计数信号灯被初始化为计数信号灯被初始化为n(非负整数),(非负整数),n 为该种共享资源的数目。为该种共享资源的数目。 Task1 Task2 共享资源实例共享资源实例n Task m 共享资源实例共享资源实例1 计数信号灯计数信号灯 计数信号灯状态图计
13、数信号灯状态图 可获得可获得不可获得不可获得 初始化初始化 值大于值大于0 申请并获得申请并获得 值为值为0 释放释放 值为值为1 申请并获得申请并获得 值减值减1 释放释放 值加值加1 计数信号灯计数信号灯 1 2 3 4 n 生产者任务生产者任务 消费者任务消费者任务 计数信号灯使用实例:生产者计数信号灯使用实例:生产者- -消费者问题(有界缓冲消费者问题(有界缓冲 问题)问题) 问题描述:问题描述:一个仓库可以存放一个仓库可以存放n件物品。生产者每生产一件产品,将件物品。生产者每生产一件产品,将 产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,产品放入仓库,仓库满了就停止
14、生产。消费者每次从仓库中去一件物品, 然后进行消费,仓库空时就停止消费。然后进行消费,仓库空时就停止消费。 生产者任务生产者任务 do 产生一个数据项产生一个数据项 申请申请empty 申请申请mutex 将新生成的数据项添加到缓冲中将新生成的数据项添加到缓冲中 释放释放mutex 释放释放full while (1); 消费者任务消费者任务 do 申请申请full 申请申请mutex 从缓冲中移出一个数据项的内容从缓冲中移出一个数据项的内容 释放释放mutex 释放释放empty 消费新获得的数据项内容消费新获得的数据项内容 while (1); 计数信号灯计数信号灯full:已被填充的数据
15、项数目,取值范围:已被填充的数据项数目,取值范围0n,初始值为,初始值为0 计数信号灯计数信号灯empty:空闲数据项数目,取值范围为:空闲数据项数目,取值范围为0n,初始值为,初始值为n; 互斥信号灯互斥信号灯mutex:控制生产者任务和消费者任务对有界缓冲的访问,:控制生产者任务和消费者任务对有界缓冲的访问, 初始值为初始值为1。 哲学家就餐问题哲学家就餐问题 问题描述:问题描述: 一个房间内有一个房间内有5个哲学家,他们的生活就是思个哲学家,他们的生活就是思 考和进食。房间里有一张圆桌,中间放着一盘考和进食。房间里有一张圆桌,中间放着一盘 通心粉(假定通心粉无限多)。桌子周围放有通心粉(
16、假定通心粉无限多)。桌子周围放有 五把椅子,分别属于五位哲学家每两位哲学家五把椅子,分别属于五位哲学家每两位哲学家 之间有一把叉子,哲学家进食时必须同时使用之间有一把叉子,哲学家进食时必须同时使用 左右两把叉子。左右两把叉子。 仅当哲学家的左右两支筷子都可用时仅当哲学家的左右两支筷子都可用时, ,才允才允 许他拿起筷子进餐。利用信号量的保护机许他拿起筷子进餐。利用信号量的保护机 制实现。通过信号量制实现。通过信号量mutexmutex对就餐之前的取对就餐之前的取 左侧和右侧叉子的操作进行保护,使之成左侧和右侧叉子的操作进行保护,使之成 为一个原子操作,这样可以防止死锁的出为一个原子操作,这样可
17、以防止死锁的出 现。现。 信号灯机制的主要数据结构信号灯机制的主要数据结构 SCB1 SCB2 信号灯控制块信号灯控制块 count 信号灯名字或信号灯名字或ID Task1Task2 任务等待列表任务等待列表 信号灯机制的主要数据结构信号灯机制的主要数据结构 信号灯控制块信号灯控制块:管理所有创建的信号灯,内核:管理所有创建的信号灯,内核 在系统运行时动态分配和回收信号灯控制块在系统运行时动态分配和回收信号灯控制块 互斥和二值信号灯控制块结构互斥和二值信号灯控制块结构: : Binary_Semaphore_Control_BlockBinary_Semaphore_Control_Bloc
18、k wait_queue任务等待队列任务等待队列 attributes信号灯属性信号灯属性 lock_nesting_behavior试图嵌套获得时的规则试图嵌套获得时的规则 wait_discipline任务等待信号灯的方式任务等待信号灯的方式 priority_ceiling优先级天花板值优先级天花板值 lock是否被占有是否被占有 holder拥有者拥有者 nest_count嵌套层数嵌套层数 计数信号灯控制结构计数信号灯控制结构 Counting_Semaphore_Control_BlockCounting_Semaphore_Control_Block wait_queuewait
19、_queue 任务等待队列任务等待队列 attributesattributes 计数信号灯属性计数信号灯属性 maximum_countmaximum_count 最大计数值最大计数值 wait_disciplinewait_discipline任务等待信号灯的方式任务等待信号灯的方式 countcount当前计数值当前计数值 信号灯机制的主要数据结构信号灯机制的主要数据结构 典型的信号灯操作典型的信号灯操作 创建信号灯创建信号灯 获取(申请)信号灯获取(申请)信号灯 释放信号灯释放信号灯 删除信号灯删除信号灯 清除信号灯的任务等待列表清除信号灯的任务等待列表 获取有关信号灯的各种信息获取有
20、关信号灯的各种信息 第二节第二节 消息队列消息队列 通信方式概述通信方式概述 消息队列机制的主要数据结构消息队列机制的主要数据结构 典型的消息队列操作典型的消息队列操作 消息队列的其他典型使用消息队列的其他典型使用 任务间的通信方式任务间的通信方式 直接通信直接通信。在通信过程中双方必须明确地知。在通信过程中双方必须明确地知 道(命名)彼此:道(命名)彼此: Send (P,message) 发送一个消息到任务发送一个消息到任务P Receive(Q,message) 从任务从任务Q接收一个消接收一个消 息息 间接通信间接通信。通信双方不需要指出消息的来源。通信双方不需要指出消息的来源 或去向
21、,而通过中间机制来通信。如:或去向,而通过中间机制来通信。如: send(A,message) 发送一个消息给邮箱发送一个消息给邮箱A receive(A,message) 从邮箱从邮箱A接收一个消息接收一个消息 通信方式概述通信方式概述 消息队列:消息队列:属于间接通信方式属于间接通信方式 消息:消息:内存空间中一段长度可变的缓冲区,其内存空间中一段长度可变的缓冲区,其 长度和内容均可以由用户定义,其内容可以是长度和内容均可以由用户定义,其内容可以是 实际的数据、数据块的指针或空。实际的数据、数据块的指针或空。 对消息内容的解释由应用完成。对消息内容的解释由应用完成。 从从操作系统观点看,消
22、息没有定义的格式,所有的观点看,消息没有定义的格式,所有的 消息都是字节流,没有特定的含义。消息都是字节流,没有特定的含义。 从从应用观点看,根据应用定义的消息格式,消息被观点看,根据应用定义的消息格式,消息被 解释成特定的含义。解释成特定的含义。 应用可以只把消息当成一个标志,这时消息机制用应用可以只把消息当成一个标志,这时消息机制用 于实现于实现同步 概述概述 消息队列就是一个消息的链表。每个消息消息队列就是一个消息的链表。每个消息 队列都有一个队列头,用结构队列都有一个队列头,用结构struct struct msg_queuemsg_queue来描述。队列头中包含了该消息来描述。队列头
23、中包含了该消息 队列的大量信息,包括消息队列键值、用队列的大量信息,包括消息队列键值、用 户户IDID、组、组IDID、消息队列中消息数目等等,、消息队列中消息数目等等, 甚至记录了最近对消息队列读写进程的甚至记录了最近对消息队列读写进程的IDID。 读者可以访问这些信息,也可以设置其中读者可以访问这些信息,也可以设置其中 的某些信息。的某些信息。 消息队列机制的主要数据结构消息队列机制的主要数据结构 队列控制块队列控制块 队列长度队列长度 QCB1 队列名或队列名或ID Task3Task4 接收任务等待列接收任务等待列 表表 Task1Task2 发送任务等待列发送任务等待列 表表最大最大
24、 消息消息 长度长度 QCB2 消息队列及其相关的参数和支持数据结构消息队列及其相关的参数和支持数据结构 消息队列状态图消息队列状态图 非空非空 满满 队列创建队列创建 消息数为消息数为0 消息队列状态图消息队列状态图 消息发送消息发送 消息数加消息数加1 空空 消息发送消息发送 消息数为消息数为1 消息接收消息接收 消息数为消息数为0 消息接收消息接收 消息数减消息数减1 消息接收消息接收 消息数减消息数减1 消息发送消息发送 消息数等于队列长度消息数等于队列长度 消息队列机制的主要数据结构消息队列机制的主要数据结构 消息队列控制块消息队列控制块 管理所有创建的消息队列,系统运行时动态分配和
25、回管理所有创建的消息队列,系统运行时动态分配和回 收消息队列控制块收消息队列控制块 消息队列缓冲区消息队列缓冲区 存放发送到该队列的消息,接收者从缓冲区中取出消存放发送到该队列的消息,接收者从缓冲区中取出消 息。息。 消息的发送或接收有两种方法(影响消息缓冲区结消息的发送或接收有两种方法(影响消息缓冲区结 构):构): 将数据从发送任务的空间完全拷贝到接收任务的空间中(效率将数据从发送任务的空间完全拷贝到接收任务的空间中(效率 较低,执行时间与消息大小有关)较低,执行时间与消息大小有关) 只传递指向数据存储空间的指针(提高系统性能)只传递指向数据存储空间的指针(提高系统性能) number_o
26、f_message max_message_count number_of_message max_message_size wait_discipline wait_queue queue_start queue_in queue_out queue_end message message message message message message message message message max_message_count 消息队列消息队列 控制块控制块 消息队列消息队列 缓冲区缓冲区 消息队列机制的主要数据结构消息队列机制的主要数据结构 消息队列机制的主要数据结构消息队列机制的
27、主要数据结构 max_message_count queue_end queue_start queue_out number_of_message queue_in 消息指针消息指针 Linux中的消息队列中的消息队列 Linux Linux 维护了一系列消息队列的维护了一系列消息队列的 msgquemsgque 向量表。向量表。 其中的每一个单元都指向一个其中的每一个单元都指向一个 msqid_dsmsqid_ds 的数据的数据 结构,完整描述这个消息队列。当创建消息队列结构,完整描述这个消息队列。当创建消息队列 的时候,从系统内存中分配一个新的的时候,从系统内存中分配一个新的 msqid
28、_dsmsqid_ds 的数据结构并插入到向量表中。的数据结构并插入到向量表中。 每一个每一个 msqid_dsmsqid_ds 数据结构都包括一个数据结构都包括一个 ipc_permipc_perm 的数据结构和进入这个队列的消息的指的数据结构和进入这个队列的消息的指 针。另外,针。另外, Linux Linux 保留队列的改动时间,例如上保留队列的改动时间,例如上 次队列写的时间等。次队列写的时间等。 Msqid_dsMsqid_ds 队列也包括两个队列也包括两个 等待队列:一个用于向消息队列写,另一个用于等待队列:一个用于向消息队列写,另一个用于 读。读。 每一次一个进程试图向写队列写消
29、息,它的有效用户和组每一次一个进程试图向写队列写消息,它的有效用户和组 的标识符就要和队列的的标识符就要和队列的 ipc_permipc_perm 数据结构的模式比较。数据结构的模式比较。 如果进程可以想这个队列写,则消息会从进程的地址空间如果进程可以想这个队列写,则消息会从进程的地址空间 写到写到 msgmsg 数据结构,放到消息队列的最后。每一个消息数据结构,放到消息队列的最后。每一个消息 都带有标记。因为都带有标记。因为 Linux Linux 限制写的消息的数量和长度,限制写的消息的数量和长度, 可能会没有空间容纳消息。这时,进程会被放到消息队列可能会没有空间容纳消息。这时,进程会被放
30、到消息队列 的写等待队列,然后调用调度程序选择一个新的进程运行。的写等待队列,然后调用调度程序选择一个新的进程运行。 当一个或多个消息从这个消息队列中读出去的时候会被唤当一个或多个消息从这个消息队列中读出去的时候会被唤 醒。醒。 从队列中读是一个相似的过程。进程的访问权限一样被检从队列中读是一个相似的过程。进程的访问权限一样被检 查。一个读进程可以选择是不管消息的类型从队列中读取查。一个读进程可以选择是不管消息的类型从队列中读取 第一条消息还是选择特殊类型的消息。如果没有符合条件第一条消息还是选择特殊类型的消息。如果没有符合条件 的消息,读进程会被加到消息队列的读等待进程,然后运的消息,读进程
31、会被加到消息队列的读等待进程,然后运 行调度程序。当一个新的消息写到队列的时候,这个进程行调度程序。当一个新的消息写到队列的时候,这个进程 会被唤醒,继续运行。会被唤醒,继续运行。 典型的消息队列操作典型的消息队列操作 创建消息队列创建消息队列 发送普通消息发送普通消息 发送紧急消息发送紧急消息 发送广播消息发送广播消息 接收消息接收消息 删除消息队列删除消息队列 获取有关消息队列的各种信息获取有关消息队列的各种信息 创建消息队列创建消息队列 创建消息队列时,调用者可以指定如下参创建消息队列时,调用者可以指定如下参 数:数: 消息的最大长度消息的最大长度 每个消息队列中最多的消息数每个消息队列
32、中最多的消息数 消息队列的属性消息队列的属性 任务等待消息时的排队方式:任务等待消息时的排队方式:FIFO或或PRIORITY 系统为新创建的消息队列分配唯一的系统为新创建的消息队列分配唯一的ID ID 发送消息发送消息 根据紧急程度的不同,消息通常可分为根据紧急程度的不同,消息通常可分为 普通消息普通消息与与紧急消息紧急消息。 如果有任务正在等待消息(即消息队列为如果有任务正在等待消息(即消息队列为 空),则普通消息发送和紧急消息发送的执空),则普通消息发送和紧急消息发送的执 行效果是一样的。行效果是一样的。任务从等待队列移到就绪任务从等待队列移到就绪 队列中,消息被拷贝到任务提供的缓冲区中
33、队列中,消息被拷贝到任务提供的缓冲区中 (或者由接收任务得到指向消息的指针)(或者由接收任务得到指向消息的指针)。 如果没有任务等待,发送普通消息将消息放如果没有任务等待,发送普通消息将消息放 在队列尾,而发送紧急消息将消息放在队列在队列尾,而发送紧急消息将消息放在队列 头。头。 发送消息发送消息 Msg 3 接收任务接收任务 等待列表等待列表 Msg 2Msg 1 消息队列消息队列 发送普通消息先进先出发送普通消息先进先出 (FIFO)次序)次序 Msg 3 接收任务接收任务 等待列表等待列表 Msg 2Msg 1 消息队列消息队列 发送紧急消息后进先出发送紧急消息后进先出 (LIFO)次序
34、)次序 发送消息发送消息 如果发送消息时如果发送消息时队列已被填满队列已被填满,则不同的操作,则不同的操作 系统可能采取不同的处理办法:系统可能采取不同的处理办法: 挂起试图向已满的消息队列中发送消息的任务(不挂起试图向已满的消息队列中发送消息的任务(不 适用于中断服务程序)适用于中断服务程序) 简单地丢弃该条消息并向调用者返回错误信息简单地丢弃该条消息并向调用者返回错误信息 广播消息广播消息。在此之前所有试图从队列中接收消。在此之前所有试图从队列中接收消 息的任务此时都将获得相同的消息。该功能拷息的任务此时都将获得相同的消息。该功能拷 贝消息到各任务的消息缓冲中(或者让所有的贝消息到各任务的
35、消息缓冲中(或者让所有的 等待任务得到指向消息的指针),并唤醒所有等待任务得到指向消息的指针),并唤醒所有 的等待任务。的等待任务。 接收消息接收消息 如果指定的消息队列中有消息,则将其如果指定的消息队列中有消息,则将其 中的第一条消息拷贝到调用者的缓冲区中的第一条消息拷贝到调用者的缓冲区 (或者将第一条消息指针传递给调用(或者将第一条消息指针传递给调用 者),并从消息队列中删除它。者),并从消息队列中删除它。 如果此时消息队列中没有消息,则可能如果此时消息队列中没有消息,则可能 出现以下几种情况:出现以下几种情况: 永远等待消息的到达永远等待消息的到达:等待消息的任务按:等待消息的任务按 F
36、IFO或优先级高低顺序排列在等待队列中或优先级高低顺序排列在等待队列中 等待消息且指定等待时限等待消息且指定等待时限:等待消息的任务:等待消息的任务 按按FIFO或优先级高低顺序排列在等待队列或优先级高低顺序排列在等待队列 中中 不等待,强制立即返回不等待,强制立即返回 接收消息接收消息 限时等待可有效预防死锁限时等待可有效预防死锁 中断服务程序接收消息时必须选择不等待,因为中断服务程序接收消息时必须选择不等待,因为 中断服务程序是不能被阻塞的。中断服务程序是不能被阻塞的。 如果消息队列被应用删除,则所有等待该消息队如果消息队列被应用删除,则所有等待该消息队 列的任务都被返回一个错误信息,并回
37、复到就绪列的任务都被返回一个错误信息,并回复到就绪 状态。状态。 接收消息接收消息 Task 4 High 消息队列消息队列 接收任务等待列表接收任务等待列表 任务等待列表基于任务等待列表基于 优先级的次序优先级的次序 Task 2 medium Task 3 medium Task 1 Low Task 4 High 消息队列消息队列 接收任务等待列表接收任务等待列表 任务等待列表先进先出任务等待列表先进先出 (FIFO)次序)次序 Task 2 medium Task 3 medium Task 1 Low 删除消息队列删除消息队列 从系统中删除指定的消息队列,释放从系统中删除指定的消息队
38、列,释放消息队列控消息队列控 制块制块及及消息队列缓冲区消息队列缓冲区。 任何知道此消息队列任何知道此消息队列IDID号的代码都可以删除它。号的代码都可以删除它。 消息队列被删除后,所有等待从这个消息队列接消息队列被删除后,所有等待从这个消息队列接 收消息的任务都回到收消息的任务都回到就绪态就绪态,并得到一个错误信,并得到一个错误信 息表明消息队列已被删除。息表明消息队列已被删除。 消息队列的其他典型使用消息队列的其他典型使用 紧耦合的单向数据通信:发送任务发送消紧耦合的单向数据通信:发送任务发送消 息后要求一个响应信号,表明接收任务已息后要求一个响应信号,表明接收任务已 经成功接收到消息。经
39、成功接收到消息。 Task1Task2 消息队列的其他典型使用消息队列的其他典型使用 紧耦合的双向数据通信紧耦合的双向数据通信 :如果数据需要在:如果数据需要在 任务之间双向流动,则可以采用紧耦合的任务之间双向流动,则可以采用紧耦合的 双向数据通信模式(也称为全双工通信)。双向数据通信模式(也称为全双工通信)。 Task1 Task2 第三节第三节 事事 件件 概述概述 事件机制的主要数据结构事件机制的主要数据结构 典型的事件操作典型的事件操作 事件机制的典型应用事件机制的典型应用 在嵌入式实时内核中,事件是指一种表明预先在嵌入式实时内核中,事件是指一种表明预先 定义的系统事件已经发生的机制。
40、定义的系统事件已经发生的机制。 事件机制用于任务与任务之间、任务与事件机制用于任务与任务之间、任务与ISRISR之之 间的同步。其主要的特点是可实现间的同步。其主要的特点是可实现一对多的同一对多的同 步步。 一个事件就是一个标志,不具备其它信息。一个事件就是一个标志,不具备其它信息。 一个或多个事件构成一个事件集。事件集可以一个或多个事件构成一个事件集。事件集可以 用一个指定长度的变量(用一个指定长度的变量(比如一个比如一个8bit, 8bit, 16bit16bit或或32bit32bit的无符号整型变量的无符号整型变量,不同的,不同的 操作系统其具体实现不一样)来表示,而每个操作系统其具体
41、实现不一样)来表示,而每个 事件由在事件集变量中的某一位来代表。事件由在事件集变量中的某一位来代表。 概述概述 事件及事件集有以下特点:事件及事件集有以下特点: 事件间相互独立事件间相互独立 事件仅用于同步,不提供数据传输功能事件仅用于同步,不提供数据传输功能 事件无队列,即多次发送同一事件,在未经过任何事件无队列,即多次发送同一事件,在未经过任何 处理的情况下,其效果等同于只发送一次。处理的情况下,其效果等同于只发送一次。 提供事件机制的意义在于:提供事件机制的意义在于: 当某任务要与多个任务或中断服务同步时,就需要当某任务要与多个任务或中断服务同步时,就需要 使用事件机制。使用事件机制。
42、若任务需要与一组事件中的任意一个发生同步,可若任务需要与一组事件中的任意一个发生同步,可 称为称为独立型同步独立型同步(逻辑(逻辑“或或”关系)。关系)。 任务也可以等待若干事件都发生时才同步,称为任务也可以等待若干事件都发生时才同步,称为关关 联型同步联型同步(逻辑(逻辑“与与”关系)。关系)。 概述概述 概述概述 任务任务 任务任务 任务任务 任务任务 ISR ISR OR AND “与与”型同步型同步 “或或”型同步型同步 事件集事件集 事件集事件集 POST POST PEND PEND 概述概述 任务任务 任务任务 任务任务 ISR OR AND 事件集事件集 事件集事件集 事件集事
43、件集 (8,16或或32位)位) POST PEND PEND 术语:术语: 发送事件集发送事件集 。指在一次发送过程中发往接。指在一次发送过程中发往接 收者(比如任务)的一个或多个事件的组合。收者(比如任务)的一个或多个事件的组合。 待处理事件集待处理事件集。指已被发送到一个接收者但。指已被发送到一个接收者但 还没有被接收(即正在等待处理)的所有事还没有被接收(即正在等待处理)的所有事 件的集合。件的集合。 事件条件事件条件。指事件接收者在一次接收过程中。指事件接收者在一次接收过程中 期待接收的一个或多个事件的集合。期待接收的一个或多个事件的集合。 “或或”同步:待处理事件集只要包括事件条件
44、中同步:待处理事件集只要包括事件条件中 的任一事件即可满足要求;的任一事件即可满足要求; “与与”同步:其二是待处理事件集必须包括事件同步:其二是待处理事件集必须包括事件 条件中的全部事件方可满足要求条件中的全部事件方可满足要求。 概述概述 事件机制的主要数据结构事件机制的主要数据结构 事件集控制块:管理所有事件集控制块:管理所有创建创建的事件集的事件集 或者或者 事件集附属于任务,事件集附属于任务,不需创建不需创建,其相关参,其相关参 数成为任务控制块的一部分数成为任务控制块的一部分 典型的事件操作典型的事件操作 创建事件集创建事件集 删除事件集删除事件集 发送事件(集)发送事件(集) 接收
45、事件(集)接收事件(集) 获取有关事件集的各种信息获取有关事件集的各种信息 设置事件设置事件 设置事件设置事件 Task1 ISR 来自某设备的来自某设备的 中断中断 Task2 消息队列消息队列Q 事件标志集事件标志集 信号灯信号灯S 01000100 发送消息发送消息 释放信号灯释放信号灯 接收消息接收消息 获取信号获取信号 量量 事件机制的典型应用事件机制的典型应用 解决复杂的应用设计问题解决复杂的应用设计问题 发送方(发送方(Task1Task1或或ISRISR) 发送信息(消息或信号发送信息(消息或信号 灯);灯); 发送方(发送方(Task1Task1或或ISRISR) 设置相应的
46、事件标志设置相应的事件标志 (指示消息或信号灯的(指示消息或信号灯的 发送);发送); 接收方(接收方(Task2Task2)检)检 测事件标志集,判断是测事件标志集,判断是 否满足其接收条件否满足其接收条件 (“与与”条件接收或条件接收或 “或或”条件接收);条件接收); 接收方(接收方(Task2Task2)根)根 据事件标志集的指示定据事件标志集的指示定 向接收信息(消息或信向接收信息(消息或信 号灯),达到和不同发号灯),达到和不同发 送方(送方(Task1Task1或或ISRISR)同)同 步或通信的目的。步或通信的目的。 第四节第四节 管道管道 概述概述 管道机制的主要数据结构管道
47、机制的主要数据结构 典型的管道操作典型的管道操作 管道机制的典型应用管道机制的典型应用 管道机制概述管道机制概述 管道(管道(pipepipe)是提供非结构化数据交换和)是提供非结构化数据交换和 实现任务间同步的内核对象。在传统的实实现任务间同步的内核对象。在传统的实 现中,管道是单向数据交换设施。现中,管道是单向数据交换设施。 Task1Task2 管道管道 管道中的数据管道中的数据 写描述符写描述符读描述符读描述符 向管道向管道 写数据写数据 从管道从管道 读数据读数据 数据在管道内像一个非结构字节流,按数据在管道内像一个非结构字节流,按FIFOFIFO的次序从管道的次序从管道 中读出。当
48、管道空时,阻塞读者,当管道满时,阻塞写者。中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。 管道机制概述管道机制概述 管道允许有多个读者和写者。管道允许有多个读者和写者。 Task1 Task5 管道管道 Task2 Task3 Task4 Task6 ISR1 ISR2 ISR3 公共管道操作公共管道操作 管道机制概述管道机制概述 管道与消息队列的区别管道与消息队列的区别 管道不存储多个消息,它存储的数据是非结管道不存储多个消息,它存储的数据是非结 构化的字节流;构化的字节流; 管道中的数据严格地遵循先进先出的顺序;管道中的数据严格地遵循先进先出的顺序; 管道支持选择(管道支持选择(select)操作,而消息队列)操作,而消息队列 不支持。不支持。 管道机制概述管道机制概述 管道的状态管道的状态 非空非空 满满 创建管道创建管道 无写入数无写入数 据据 读数据,有读数据,有 剩余数据剩余数据 空空 写数据写数据 读数据,读数据, 无数据留无数据留 下下 写数据,有写数据,有 剩余空间剩余空间 读数据读数据 写数据,无写数据,无 剩余空间剩余空间 管道机制概述管道机制概述 命名管道和无名管道:命名管道和无名管道: 一个一个命名管道具有一个类似于文件名的名字,具有一个类似于文件名的名字, 并像一个文件或设备出现在文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云安全架构与数据保护策略-深度研究
- 权限管理框架研究-深度研究
- 智慧城市技术与治理模式创新-深度研究
- 2025年应天职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年庆阳职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 有机光电子材料开发-深度研究
- 2025年广东轻工职业技术学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年平顶山文化艺术职业学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年山东旅游职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 教育-工作错配对劳动收入的影响研究
- 2023-2024学年度人教版一年级语文上册寒假作业
- 软件运维考核指标
- 空气动力学仿真技术:格子玻尔兹曼方法(LBM)简介
- 对表达方式进行选择与运用
- GB/T 18488-2024电动汽车用驱动电机系统
- 投资固定分红协议
- 高二物理题库及答案
- 职业发展展示园林
- 七年级下册英语单词默写表直接打印
- 2024版医疗安全不良事件培训讲稿
- 中学英语教学设计PPT完整全套教学课件
评论
0/150
提交评论