消息队列最大数目

消息队列:

1.每次msgrcv一个消息,1.那个消息会在内核中移除 2.每次msgrcv都只会给一个消息出来,不管你rcv用多大的buf来接收,都是可以的。如果msgrcv的bufSize小于实际的该消息的大小,那么可以设置一个标志:表示截断。 如果不设置,那么会报错。取不出来。

2.消息满了,则默认0为阻塞,直到有了空间位置,才能snd消息进入到内核。

消息空了,则默认为0阻塞,直到有了一个消息位置,才能 rcv消息进入到进程内存。

3.如果指定msgflg:MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除了。

几乎所有的 Linux 发行版本都包含 ipcs 命令,该命令可以提供当前加载到系统上的
IPC 资源信息。通过 ipcs 可以确定系统的当前 IPC 限制,还可以检查系统当前使用的上述
三类IPC资源的状态。例如,假若应用程序启动失败,可以检查系统上的 IPC使用情况来
判断是否已超出了某个IPC限制。为了确定系统的IPC资源状态,可以在 root用户权限下
执行带有-u 选项的 ipcs 命令。 
# ipcs -u

------ Shared Memory Status -------- 
segments allocated 32 
pages allocated 2361 
pages resident 253 
pages swapped   982 
Swap performance: 0 attempts     0 successes

------ Semaphore Status -------- 
used arrays = 128 
allocated semaphores = 256

------ Messages: Status --------

allocated queues = 0 
used headers = 0 
used space = 0 bytes 
对于“ipcs -u”命令所显示的IPC资源,如果要确定其限制,可以使用“ipcs -l”命令: 
# ipcs -l

------ Shared Memory Limits -------- 
max number of segments = 4096 
max seg size (kbytes) = 32768 
max total shared memory (kbytes) = 8388608 
min seg size (bytes) = 1

------ Semaphore Limits -------- 
max number of arrays = 128 
max semaphores per array = 250 
max semaphores system wide = 32000 
max ops per semop call = 32 
semaphore max value = 32767

------ Messages: Limits -------- 
max queues system wide = 16            【系统最多的消息队列数量(最多支持同时16个消息队列)】
max size of message (bytes) = 8192  【单个消息的最大字节数】
default max size of queue (bytes) = 16384  【默认的单个队列的大小16384】
上述输出表明,该系统已经到达信号量数组(或信号量集合)的数目上限。这个限制可
以通过增加内核参数 semmni 的取值来解决,该参数定义了系统能够拥有的信号量集合的
总数。Linux 可以动态调整大多数内核IPC 参数值的大小,也可以静态地修改

消息队列为进程提供了一种异步传递消息的方法。在使用 msgget()建立了一条消息队
列之后,发送进程和接收进程就可以通过这条消息队列交换消息。发送进程将消息发送到
指定的消息队列,而接收者试图从指定的消息队列中获取消息。如果该队列中没有消息的
话,则接收者根据自己是否要等待的意愿而阻塞或返回某个标志。 
表 13-2 简要描述了在当前Linux 2.4/2.6 内核实现中提供的3 个消息队列参数。 
表 13-2 与消息队列相关的内核参数 
名    称 描    述 默 认 值 最 大 值 
msgmni 最大消息队列数 16 2GB 
msgmax 最大消息长度(字节数) 8192 2GB 
msgmnb 消息队列中的最大字节数 16384 2GB

注意,第 4 列中给出的最大值取决于数据类型。上述 3 个内核参数都是 int 类型,因
此在32 位Intel 机器上,硬性上限是2GB。 
Linux 还定义了其他当前未用的消息队列相关参数。 
以下各节具体分析与消息队列相关的参数

13.5.1 msgmni 
msgmni 定义了系统范围内的消息队列上限。与信号量一样,消息队列也拥有一个相关
的标识符。在系统初始化阶段里,内核创建一个指向消息队列标识符结构的指针数组。该
数组的项数由 msgmni确定。对于每个消息队列,Linux 内核为标识符分配44B,为消息队
列数据结构分配 96B。为了获得更多的消息队列资源,可以动态增加 msgmni 取值。和信
号量一样,消息队列标识符的最大数目也受限于IPCMNI。msgmni的默认上限为 16B,这
可能不足以保证一些大型数据库应用平滑地运行。如果在系统上要运行数据库应用的话,
推荐默认上限值是 128B。 
13.5.2 msgmax 
msgmax 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发
送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整

13.5.3 msgmnb 
msgmnb 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个
域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为
16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来
增加现有消息队列的容量

修改消息队列的参数

1.永久修改
root用户下修改/etc/sysctl.conf 文件。

参数msgmax,msgmni,msgmnb都已经成功修改  更改的方法:  在配置文件/etc/sysctl.conf中加上  kernel.msgmax=value  kernel.msgmni=value  kernel.msgmnb=value  然后运行sysctl -p  即可进行修改

max queues system wide = // msgmni
max size of message (bytes) = //msgmax
default max size of queue (bytes) = //msgmnb

2.临时修改
root用户下sysctl -w kernel.msgmnb= 1048576

消息队列在linuxC/c++里面没有找到有异步的信息,但是java..net有,而且windows的消息队列就是异步实现的。

http://hi.baidu.com/yelangdefendou/item/410e5a13b61b33038ebde4e9

http://hi.baidu.com/w_empty/item/467c004fa0b2460ac116132b

http://wenku.baidu.com/view/96c978dd360cba1aa811dac5.html

http://hi.baidu.com/w_empty/item/467c004fa0b2460ac116132b

http://hi.baidu.com/yelangdefendou/item/410e5a13b61b33038ebde4e9

http://blog.csdn.net/goodluckwhh/article/details/8841999

http://www.jb51.net/article/37412.htm

消息队列最大数目,布布扣,bubuko.com

时间: 2024-08-07 21:20:45

消息队列最大数目的相关文章

IPC: 消息队列

#################################################### 消息队列   消息队列分为: 1.posix消息队列:可以在同一主机上有亲缘关系或无亲缘关系的进程间使用. 2.system v消息队列:同上. 消息队列有随内核的持续性. ----------------------------------------------------------- posix消息队列: gcc -lrt #include <mqueue.h> #include

消息队列接口API(posix 接口和 system v接口)

消息队列 posix API 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.信号这种通信方式更像\"即时\"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent):管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制消息队列就是一个消息的链表.可以把消

Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

posix消息队列与system v消息队列的差别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则可以返回任意指定优先级的消息. (2)当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或启动一个线程,system v消息队列则不提供类似机制. 队列中的每个消息具有如下属性: 1.一个无符号整数优先级(posix)或一个长整数类型(system v) 2.消息的数据部分长度(可以为0) 3.数据本身(如果长度大于0) Posix消息队

进程间通信(6) - 消息队列posix

1.前言 本篇文章的所有例子,基于RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686). 2.介绍 消息队列是先进先出FIFO原则. 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消息.消息队列是随内核持续的. 目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,System V消息队列目前被

Linux环境编程之IPC进程间通信(五):Posix消息队列1

对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的.而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每个消息都是一个记录,它由发送者赋予一个优先级.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后的某个时刻读出这些消息.这跟管道和FIFO不一样,当一个管道或FIFO的最后一次关闭时

进程间通信(二)——Posix消息队列

1.概述 消息队列可认为是消息链表.有足够写权限的线程可以往队列中放置消息,有足够读权限的进程可以从队列中取走消息.每个消息是一个记录,由发送着赋予一个优先级. 在像队列中写入消息时,不需要某个进程在该队列上等待消息到达.这与管道不同,管道必须现有读再有写. 消息队列具有随内核的持续性,与管道不同.进程结束后,消息队列中消息不会消失.当管道最后一次关闭,其中的数据将丢弃. 消息队列具有名字,可用于非亲缘关系的进程间. Posix消息队列读总是返回最高优先级的最早消息,而System V消息队列的

进程间通信(IPC)之消息队列

★IPC方法包括管道(PIPE).消息队列(Message_Queue).旗语.共用内存(ShareMemory)以及套接字(Socket).进 程间通信主要包括了管道.系统IPC(包括了消息队列.信号以及共享存储).套接字(SOCKET).此文将详细叙述消息队列的相 关内容. ★产生原因: 所谓消息队列,其实就是消息(数据)传输过程中保存的容器.既然有了管道通信的方式,何必又有消息队列呢? 因为根据管道的特性,我们知道其在一定程度上存在或多或少的局限性,首先匿名管道以及命名管道是随进程的,进

linux消息队列操作

对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以: 注:消息队列描写叙述字是由在系统范围内唯一的键值生成的,而键值能够看作相应系统内的一条路经. 2. 读写操作 消息读写操作很easy,对开发者来说,每一个消息都相似例如以下的数据结构: struct msgbuf{ long mtype; char mtext[1]; }; mtype成员代表消

消息队列ipc的一些设置

Linux IPC 参数设定- 命令方式: echo 80 > /proc/sys/vm/overcommit_ratio, etc MSGMNB 每个消息队列的最大字节限制. MSGMNI 整个系统的最大数量的消息队列. MSGGSZ 消息片断的大小(字节).大于该值的消息被分割成多个片断. MSGSEG 在单个队列里能存在的最大数量的消息片断. MSGTQL 整个系统的最大数量的消息. MSGMAX 单个消息的最大size.在某些操作系统例如BSD中,你不必设置这个.BSD自动设置它为MSG