在开始之前先说明三个概念,任务间的同步,互斥,通信。
同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理。这就是一个任务与另一任务之间的同步控制。
互斥,是指两个以上任务要使用同一块内存数据或IO资源时引发的竞争状态。
任务间通信,很简单,就是使一个任务通过某个条件或某段数据与另一个任务发生联系时,就产生了通信,同步与互斥都是任务间通信的一种方式。

关于任务间的同步与通信方式,每个人脑子里会蹦出很多,信号量,互斥量,消息队列,管道,信号,事件等等,开始就从最简单的说起。

忽略VxWorks在6.X中开始支持进程的概念,在多数常规VxWorks的应用中所有的任务或内核都是运行在同一份线性内存中,所以这里的所谓共享内存的概念相对就非常简单,也就是对于所有你定义的全局或外部可见的数据,不同任务都可以操作,当然这个操作包含了读与写。比如你定义如下全局数据,那在所有任务就就可以操作my_data的值,
int my_data = 0;
也许你会觉得这个简直是废话,呵呵,慢慢来,前面说了从最简单的开始。(虽然很简单,但正因为所有任务都共享内存,使很多时候都是通过此种方式外加同步互斥的控制来实现的)
因为不管是抢占式还是时间片轮转调度,任务间都是可调度的,既然有了在多任务中对共享数据的读与写,而原生共享的数据单元并不具备对自身的保护与控制,所以这种情况下也就势必存在数据的竞态与互斥,需要我们额外的对共享的数据进行保护。

要避免任务间发生对数据竞争状态,第一种方式也是最直接的方式是使任务不可被切换,那么可以使用taskLock和taskUnlock,代码如下:

void fooA()
{
taskLock();
.
. /* critical region of code that cannot be interrupted by other tasks */
.
taskUnlock();
}
但是这种方式也是最不常见,不合理的一种方式。因为它阻止任务间的抢占,会破坏实时性,而且即使其他高优先级任务没有访问到该临界区数据,也会被阻止抢占。如果一定要使用,势必确保锁间的处理很短。在下一篇我们会介绍更优雅更合理更常见的处理方式------信号量。

【VxWorks系列】任务间同步与通信之共享内存的更多相关文章

  1. python并发——进程间同步和通信

    一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...

  2. rtt学习之线程间同步与通信

    一 线程间的同步与互斥:信号量.互斥量.实践集 线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作.临界区操作操作方法有: rt_hw_interrupt_ ...

  3. linux进程间的通信之 共享内存

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  4. 进程间的八种通信方式----共享内存是最快的 IPC 方式

    1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2.高级管道(popen):将另一个程序当做一个新 ...

  5. linux 进程通信之 共享内存

    共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...

  6. Linux 进程通信(共享内存区)

    共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...

  7. linux进程通信之共享内存

    共享内存同意两个或多个进程共享一给定的存储区,由于数据不须要来回复制,所以是最快的一种进程间通信机制.共享内存能够通过mmap()映射普通文件(特殊情况下还能够採用匿名映射)机制实现,也能够通过系统V ...

  8. Linux进程通信之共享内存实现生产者/消费者模式

    共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...

  9. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

随机推荐

  1. version_info

    import sys def check_version(): v = sys.version_info if v.major == 3 and v.minor >= 4: return Tru ...

  2. Java [Leetcode 231]Power of Two

    题目描述: Given an integer, write a function to determine if it is a power of two. 解题思路: 判断方法主要依据2的N次幂的特 ...

  3. 【C#学习笔记】smtp发邮件

    using System; using System.Net; using System.Net.Mail; using System.Text; namespace ConsoleApplicati ...

  4. liunx上运行mybase

    mybase 是个人知识管理软件,国内用他的人很多,尤其是程序员.我也是mybase的忠实使用者,有大量的积累.    以前一直用Windows,mybase使用完全没有问题,后来转投ubuntu阵营 ...

  5. 关于CCSprite改变box2d刚体位置以及角度。

    同事今天在讨论一个事情,box2d中,body不可以直接设置位置,这样是不合理的,因为在物理的世界,你去左右它的物理检测.它就没有存在的必要了.但是,有人就想直接用box2d的碰撞.不用物理模拟.怎么 ...

  6. linux下配置双网卡及RAC规划——1

    使用背景: 操作系统:centos 虚拟机:virtualbox RAC系统中需要双网卡,一个为公共的网络环境,一个为私有的网络环境,从而需要搭建双网络. 在菜单FILE中选择preferences, ...

  7. MVC中的ActionResult

    ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为 ...

  8. PHP图像操作:3D图、缩放、旋转、裁剪、添加水印(三)

    来源:http://www.ido321.com/887.html 5.PHP对图像的旋转 1: <div> 2: <h4>旋转之前</h4> 3: <img ...

  9. KMP(字符串匹配)

    1.KMP是一种用来进行字符串匹配的算法,首先我们来看一下普通的匹配算法: 现在我们要在字符串ababcabcacbab中找abcac是不是存在,那么传统的查找方法就是一个个的匹配了,如图: 经过六趟 ...

  10. JAVA WEB SQLHelper类的封装

    在这次做项目中,我对自己最满意的就是封装了一下SQLHelper类,我对自己感到骄傲主要是 我是初学者,我刚开始不知道可以这样做,我只是想着试着去这样做了,结果真的可以,所以我 在我的模块就自己封装了 ...