在开始之前先说明三个概念,任务间的同步,互斥,通信。
同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理。这就是一个任务与另一任务之间的同步控制。
互斥,是指两个以上任务要使用同一块内存数据或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. php yii框架使用MongoDb

    1.安装 运行 php composer.phar require --prefer-dist yiisoft/yii2-mongodb or add "yiisoft/yii2-mongo ...

  2. Java [Leetcode 118]Pascal's Triangle

    题目描述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...

  3. Squid 反向代理加速网站

    本实例的域名是 wenjin.cache.ibm.com.cn,通过DNS的轮询 技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请 ...

  4. 【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)

    Java获得当前时间 java.util.Date date = new java.util.Date(); Timestamp time = new Timestamp(date.getTime() ...

  5. redis发布/订阅模式

    其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个 场 ...

  6. Android中ListView中有button,checkbox,GridView时事件问题

    最近做项目,用到了listview的item的一些问题,现在抽空把它们总结一下: 转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/67 ...

  7. bjfu1250 模拟

    这题貌似是蓝桥杯的一题改了个题面. 就是模拟啦,应该有比我的更简洁的方法. 我的方法是把所有的人(蚂蚁)按位置排完序以后从左往右看,每次有一个向左走的,就会把最左边的t出,这个变成向右中,同时,从左端 ...

  8. 通过简单的Linux内核启动程序代码窥探操作系统的启动原理

    作者:吴乐  山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...

  9. Tkinter教程之Scale篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811313 '''Tkinter教程之Scale篇'''#Scale为输出限定范围的数字区间, ...

  10. web.py实现jsonp

    浏览器端请求 $.getJSON("/currenttime?callback=?", function (json){ $("#time").html(jso ...