Java进程间通信之消息队列

作者:月半木斤 时间:2023-05-24 01:44:27 

消息队列

1.消息队列的原理

  • 1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护,

  • 1.2 系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ。

  • 1.3在进行进程间通信时,一个进程将消息加到MQ尾端,另一个进程从消息队列中取消息(不一 定以先进先出来取消息,也可以按照消息类型去取消息)这样就实现了进程间的通信。

Java进程间通信之消息队列

2.消息队列的接口:

2.1创建消息队列

int msgget(key_ t key, int msgflg);

Java进程间通信之消息队列

参数:

  • key:消息队列的标识符

  • msgflg:创建的标志,例如IPC_CREAT

  • IPC_CREAT:如果不存在就创建:按位或上一个权限(8进制的数字)

返回值:

  • 成功:返回队列ID

  • 失败:返回-1,并设置erron

2.2向消息队列发送消息

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

  • msgid:消息队列ID

  • msgp:指向msgbuf 的指针,用来指定发送的消息

    • 操作系统为该函数发送的消息定义了发送格式,只是定义了一部分,另一部分要程序员自己去定义

Java进程间通信之消息队列

  • msgsz:要发送消息的长度,消息内容的长度

  • msgflg:创建标记,如果指定IPC_NOWAIT,失败会立即返回

    • 0:阻塞发送

    • IPC_NOWAIT:非阻塞发送

返回值:

  • 成功:返回0

  • 失败:返回-1,并设置erron

2.3接收消息:

ssize_t msgrcv(int msqid, void *msgp, sizet msgsz, long msgtyp, int msgflg);

Java进程间通信之消息队列

参数:

  • msgid:消息队列ID

  • msgp:指向msgbuf的指针,用来接收消息

  • msgsz:要接收消息的长度

    • 注意:参数msgsz 指定由msgp 参数指向的结构的成员mtext的最大大小(以字节为单位)

msgtyp:接收消息的方式

  • 1. msgtyp = 0:读取队列中的第一条消息(不在乎当前对头元素时什么消息类型,将他当作普通队列来处理)

  • 2. msgtyp > 0:读取队列中类型为msgtyp 的第一条消息。(就是读取对列元素中第一个香蕉)除非在msgflg中指定了MSG_ EXCEPT, 将读取类型不等于msgtyp 绝对值的第一条消息

  • 3. msgtyp< : 0:读取队列中最小类型小于或等于msgtyp 绝对值的第一条消息

msgflg:创建标记,如果指定IPC_ NOWAIT,获取失败会立刻返回

返回值:

  • 成功返回实际读取消息的字节数

  • 失败返回-1,并设置erron

2.4操作消息队列的接口

int msgctl(int msqid, int cmd, struct msqid_ ds *buf);

参数:

  • msqid:消息队列ID

  • cmd:控制命令,

    • 例如IPC_ RMID,删除命令 ,

    • IPC STAT,获取状态

  • buf:存储消息队列的相关信息的buf

返回值:

  • 成功根据不同的cmd有不同的返回值,

  • 失败返回-1,并设置erron

2.5代码测试:

创建一个消息对列,写端发送消息对列,读端读取消息对列中的内容。

Java进程间通信之消息队列

我们运行写端代码两次发现消息对列中写入20条消息,

Java进程间通信之消息队列

运行读端代码我们发现成功读出

Java进程间通信之消息队列

我们运行三次可以发现再无法从消息对列中读出,说明消息对列每次获取到消息后,就会将消息对列中相应的消息出对列

Java进程间通信之消息队列

信号量:

信号量的原理

  • 信号量本质上就是资源计数器,能够保证多个进程之间访问临界资源,执行临 界区代码时,互斥访问。同时也可以用于同步

    • 临界资源:多个进程都可以访问到的资源(例如:同一块内存)

    • 临界区:访问临界资源时的代码,区域称之为临界区

Java进程间通信之消息队列

互斥访问:同一时刻,多个进程当中,只有一个进程可以访问临界区资源。多个资源通过信号量保证互斥访问的时候,需要先获取信号量,如果能获取正确的信息量,则才能访问临界资源,如果获取不了,则阻塞等待。等待访问的进程将信号量设置为1,然后再访问。

Java进程间通信之消息队列

  • 如果不进行互斥访问会造成结果二义性。(结果不同)(多核cpu同时运行多个进程访问临界资源,单核抢占式执行,操作系统调度不可控)

  • 同步:当临界资源空闲之后,通知等待的进程进行访问

Java进程间通信之消息队列

来源:https://blog.csdn.net/weixin_45897952/article/details/123604519

标签:Java,进程通信,消息队列
0
投稿

猜你喜欢

  • MTK Android平台开发流程

    2023-06-23 08:59:11
  • 详解jeefast和Mybatis实现二级联动的问题

    2022-11-10 05:10:15
  • 详解Java发送HTTP请求

    2022-01-09 14:53:57
  • C#获取进程或线程相关信息的方法

    2021-06-27 16:37:23
  • spring基础概念AOP与动态代理理解

    2022-01-29 20:55:13
  • C#简单实现显示中文格式星期几的方法

    2021-09-08 12:27:05
  • Java中的CAS和ABA问题说明

    2021-08-19 11:08:18
  • Java面试题冲刺第五天--基础篇2

    2023-10-07 13:17:04
  • 深入探讨JAVA中的异常与错误处理

    2023-06-11 00:30:24
  • 详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    2022-03-22 13:03:02
  • C语言时间函数之strftime()详解

    2023-06-26 02:42:32
  • java Semaphore共享锁实现原理解析

    2021-11-02 23:12:38
  • Android Studio SVN使用方法教程

    2022-06-29 23:58:12
  • 学会使用C#异常

    2021-08-17 23:31:19
  • Android开发中编写蓝牙相关功能的核心代码讲解

    2021-07-26 00:24:53
  • JAVA调用SAP WEBSERVICE服务实现流程图解

    2023-11-07 03:54:57
  • SpringBoot Admin用法实例讲解

    2021-07-26 17:57:58
  • Java 判断字符为中文实例代码(超管用)

    2021-08-24 13:18:31
  • java实现KFC点餐系统

    2021-09-06 11:36:34
  • mall整合SpringSecurity及JWT实现认证授权实战

    2022-10-04 03:16:33
  • asp之家 软件编程 m.aspxhome.com