搜索
bottom↓
回复: 12

操作系统得消息和消息队列得作用是什么?

[复制链接]

出0入0汤圆

发表于 2008-3-14 14:12:07 | 显示全部楼层 |阅读模式
操作系统得消息和消息队列得作用是什么?

出0入0汤圆

发表于 2008-3-14 14:30:21 | 显示全部楼层
最大的用途:可用于进程、线程间的同步、通信及数据交换。

出0入296汤圆

发表于 2008-3-14 14:39:06 | 显示全部楼层
为了避免进程与进程之间,或者线程与线程之间以全局变量的形式进行通讯(大的操作系统因为虚拟存储技术的应用,不允许不同进程之间以全局变量进行通讯),所以增加了一个消息队列,所有的进程和线程间通讯,原则上应该以消息的形式进行。

出0入0汤圆

 楼主| 发表于 2008-3-14 14:50:27 | 显示全部楼层
关于消息队列几个问题:
1.任务之间传递数据用BUF不就行了,用消息比BUF好在哪里?
  这里假设BUF已经包含临界断,可被多个任务操作。

2.消息队列采用什么数据结构好?数组还是链表?
如果用数组,感觉浪费空间,浪费代码,和用BUF没啥两样。
如果用链表,链表是用静态还是动态呢?
如果用静态,消息和消息队列全部要定义成全局或静态变量,定义全局变量太多,程序中使用起来也不方便。
相比直接把要传递的数据定义成全局变量,再加上临界断或者信号量,并没有实质性的改进。
如果用动态,要分配堆空间,并且效率也相对低点。

出0入296汤圆

发表于 2008-3-14 14:53:56 | 显示全部楼层
楼上需要补充虚拟存储的概念,然后你会发现你说的这些问题都不是问题……
进程之间,虚拟存储空间是相互独立的不同宇宙……是不同次元的……消息队列就是传说中的虫洞……虫洞是由上帝(操作系统)来提供的……我们无法超越所在的次元,要给其他次元通信,只有依靠上帝来代话。消息队列采用什么数据结构对进程来说是透明的。一般来说,操作系统会使用数组+动态内存块的联合结构作为消息队列,其中数组仅仅保存一个大小固定的索引头,而索引头则指向一个动态分配的存储空间,这个空间中保存着所需的数据。当消息传递给对应的次元以后,一般情况下辉进行所谓的次元变换——也就是把动态分配的存储空间重新在新次元中申请一下,然后复制过去(有时候并不进行这样的复制,而只是把动态分配的那块内存直接划给这个次元的动态页表中),这就完成了消息的传递。

出0入0汤圆

 楼主| 发表于 2008-3-14 15:17:27 | 显示全部楼层
当然,如果消息队列用动态分配,就方便多了。

但是在小RAM的单片机上,一般是不能用动态分配的。
或者用数组作为消息队列的存储空间。
或者把消息定义成静态变量。

我个人认为,如果用数组作为消息队列的存储空间,不会比用BUF好。
如果将消息都定义成全局变量,使用起来又比较麻烦。



我想给Protothreads加上消息队列,采用把消息队列定义成静态变量的办法,以下是使用消息队列一个简单例子,感觉太麻烦了。


THR_Create(Thread1);
THR_Create(Thread2);
TMR_Create(timer1);

TQueue queue;

uint8 Thread1(Tpt *pt)
{
  static TMessage message;
  static uint8 count=0;
  PT_BEGIN(pt);
    while(1)
    {
      GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_4,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_4));
      PT_TIMER_DELAY(&timer1,OS_TICKS_PER_SEC/10);
      
      if(++count>=10)
      {
        count=0;
        message.data='X';      
        MSG_Post(&queue,&message);  //每1S向线程2发送一个消息
       }
    }
   PT_END(pt);
}

uint8 Thread2(Tpt *pt)
{
  static TMessage *message;
  static uint8 data;
   PT_BEGIN(pt);
    while(1)
    {
      MSG_Pend(&queue,&message);     //等待消息
      data=message->data;            //读取消息中的数据
      GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_5,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_5));
    }
   PT_END(pt);
}

出0入296汤圆

发表于 2008-3-14 15:23:15 | 显示全部楼层
恕我直言……8位系统中,如果存储器小于1K,就没有必要使用消息系统……直接用全局变量更干脆……

出0入0汤圆

 楼主| 发表于 2008-3-14 15:31:46 | 显示全部楼层
看样子消息队列还是动态分配的好。

出0入0汤圆

发表于 2008-8-25 12:50:22 | 显示全部楼层
消息队列的讨论,一定要顶起来

出0入0汤圆

发表于 2012-1-6 18:21:29 | 显示全部楼层
看高手过招!偷偷学习!

出0入0汤圆

发表于 2013-10-31 17:48:59 | 显示全部楼层
正在困惑与消息队列与全局变量的选择

出0入0汤圆

发表于 2022-1-29 10:25:12 | 显示全部楼层
顶起来!

出0入4汤圆

发表于 2022-8-3 10:56:28 | 显示全部楼层
消息队列可以Pend起来。 当任务每次路过去查询该消息,有则处理,没有继续Pend。
常用于异步, 如外设的串口、USB、Ethernet
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 -- 东莞阿莫电子网站 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2023-1-28 19:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表