CN112328412B - 一种基于linux平台下用户层的ipc通信方法 - Google Patents
一种基于linux平台下用户层的ipc通信方法 Download PDFInfo
- Publication number
- CN112328412B CN112328412B CN202011272377.4A CN202011272377A CN112328412B CN 112328412 B CN112328412 B CN 112328412B CN 202011272377 A CN202011272377 A CN 202011272377A CN 112328412 B CN112328412 B CN 112328412B
- Authority
- CN
- China
- Prior art keywords
- thread
- information
- receiving
- linked list
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000004891 communication Methods 0.000 title claims abstract description 50
- 238000000034 method Methods 0.000 title claims abstract description 29
- 230000006870 function Effects 0.000 description 8
- 230000007246 mechanism Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 230000002068 genetic effect Effects 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000001105 regulatory effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开一种基于LINUX平台下用户层的IPC通信方法,包括S1:初始化LINUX系统中的线程通信信号并存放在结构体中;S2:发送线程获取接收线程的句柄,将待发送的信息插入到接收线程内部的数据信息链表中,当全部插入完毕后,使发送线程处于休眠状态,直到读线程唤醒;S3:接收线程判断是否有新的信息,若有则唤醒读线程读取接收线程句柄的数据信息链表的数据;若没有则进入休眠状态。本发明实现用户层多进程实时通信,避免了用户层到内核层、内核层到用户层之间的数据拷贝,而且又包含了内核中的消息队列的功能,尤其针对C/S架构中多个客户端对一个服务端进行通信,降低了CPU的使用率,提高了整个系统的通信效率。
Description
技术领域
本发明涉及通信控制技术领域,特别涉及一种基于LINUX平台下用户层的IPC通信方法。
背景技术
随着通信技术的发展,对于多用户、多任务的操作系统,进程间的通信(IPC,Inter-Process Communication)是整个系统得以有条不紊运作的基础。Linux中虽然集成了无名管道(PIPE)、有名管道通信(FIFO)、内存映射、消息队列、共享内存、信号量等多种通讯机制,但是每一种通信机制都有它的一定局限性。
例如无名管道是一种半双工的通信方式,实现简单,但数据只能单向流动,而且只能在具有亲缘关系的进程之间通信;有名管道是以一种实现简单的半双工通信方式,相比无名管道它可以实现无亲缘关系的进程之间通信;消息队列是一种消息的链接表,存放在内核中并由消息队列标识符标识,该通信机制克服了无名管道和有名管道的缺点,提供了一种类似信箱的作用,发送方不必等待接收方检查它所收到的消息就可以继续工作下去,接收方如果没有收到信息也不需要等待,但消息队列对每个数据块都有一个最大长度限制,总数据块大小也有限制,且不同进程的消息传递都是以内核作为中转媒介,会出现大量的用户层到内核层、内核层到用户层之间的数据拷贝,对于进程较多的复杂程序来说,通信显得性能较差;共享内存是在多个进程之间共享一块内存空间,实现进程的交互通信和交换信息,但在创建的时候已经规定好固定大小,后期无法调整相应的空间,以及多个进程对该共享存储访问时,必须获得键值Key才能访问该共享内存,没获得的进程进入休眠等待,不适合高频率读写操作的进程通信。
发明内容
针对现有技术中Linux系统通信效率较低的问题,本发明提出一种基于LINUX平台下用户层的IPC通信方法,采用线程信号量结合数据链表的方式,实现用户层多进程实时通信,避免了用户层到内核层、内核层到用户层之间的数据拷贝,而且又包含了内核中的消息队列的功能,当多个客户端对一个服务端进行通信时,降低了CPU的使用率,提高了整个系统的效率。
为了实现上述目的,本发明提供以下技术方案:
一种基于LINUX平台下用户层的IPC通信方法,具体包括以下步骤:
S1:初始化LINUX系统中的线程通信信号并存放在结构体中;
S2:发送线程获取接收线程的句柄,将待发送的信息插入到接收线程内部的数据信息链表中,当全部插入完毕后,使发送线程处于休眠状态,直到读线程唤醒;
S3:接收线程判断是否有新的信息,若有则唤醒读线程读取接收线程内部的数据信息链表的数据;若没有则进入休眠状态。
优选的,所述S1具体包括:
S1-1:当LINUX系统中线程开始工作时,利用Linux系统函数创建线程互斥、读线程信号量和写线程信号量,生成该线程IPC通信的句柄以创建数据信息链表;
S1-2:初始化数据信息链表的读写位置和接收信息计数器,并创建结构体用于保存数据信息,该结构体的地址为线程通信的句柄。
优选的,所述S1-2中,定义变量A标识数据信息链表的读位置,B标识数据信息链表的写位置,C表示接收信息计数器接收的信息数量和接收信息的最大长度。
优选的,所述结构体是一种线程通信信息,包含信息源头、目的地、命令、参数、标志和反馈状态。
优选的,所述S2中,将待发送的信息插入到接收线程句柄内部的数据信息链表中队尾,写位置变量加一,同时接收信息计数器加一。
优选的,所述S3包括:
S3-1:接收线程判断接收信息计数器中次数大于0,代表接收到新的信息,依次弹出接收线程内部的数据信息链表中读指针指向的数据,每读取完毕后移动读指针使其指向下一个信息地址和接收信息计数器减1,直到读指针指向的地址大于写指针指向的地址;
S3-2:接收线程判断接收信息计数器中次数不大于0,代表没有接收到新的信息,接收线程处于休眠状态,直到写线程唤醒。
综上所述,由于采用了上述技术方案,与现有技术相比,本发明至少具有以下有益效果:
本发明提出一种Linux平台下用户层的IPC通信方法,实现方式类似于内核中的消息队列,采用线程信号量结合数据链表的方式,实现用户层多进程实时通信,避免了用户层到内核层、内核层到用户层之间的数据拷贝,而且又包含了内核中的消息队列的功能,尤其针对C/S架构中多个客户端对一个服务端进行通信,降低了CPU的使用率,提高了整个系统的通信效率。
附图说明:
图1为根据本发明示例性实施例的一种基于LINUX平台下用户层的IPC通信方法示意图。
具体实施方式
下面结合实施例及具体实施方式对本发明作进一步的详细描述。但不应将此理解为本发明上述主题的范围仅限于以下的实施例,凡基于本发明内容所实现的技术均属于本发明的范围。
在本发明的描述中,需要理解的是,术语“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
如图1所示,本发明提供一种基于LINUX平台下用户层的IPC通信方法,具体包括以下步骤:
S1:初始化LINUX系统中的线程通信信号并存放在结构体中。
S1-1:当LINUX系统中线程(包括发送线程和接收线程)开始工作时,首先利用pthread_mutex_init、pthread_cond_init)等Linux系统函数创建线程互斥、读线程信号量和写线程信号量,生成该线程IPC通信的句柄以创建数据信息链表。
S1-2:初始化数据信息链表的读写位置和接收信息计数器,根据信息大小和最大接收信息长度来开辟数据链表空间,并建立结构体用于保存数据信息,该结构体的地址就为当前线程通信的句柄。
本实施例中,可通过定义两个变量标识数据信息链表的读、写位置,一个变量表示接收信息计数器接收的信息数量和接收信息的最大长度,例如A标识数据信息链表的读位置,B标识数据信息链表的写位置,C表示接收信息计数器接收的信息数量和接收信息的最大长度。且构建的结构体就是一种线程通信信息,包含了信息源头、目的地、命令、参数、标志、反馈状态等。
S2:发送线程获取接收线程的句柄,将待发送的信息插入到接收线程内部的数据链表中,当全部插入完毕后,使发送线程处于休眠状态,直到读线程唤醒。
本实施例中,发送线程首先获取接收线程的句柄,根据接收线程句柄中的成员变量地址,把待发送的信息(每个信息都是一种结构体,该结构体包含了信息源头、目的地、命令、参数、标志、反馈状态等)插入到接收线程句柄内部的数据信息链表中队尾,写位置变量加一。
每插入一条待发送的消息,移动写指针使其指向下一个地址空间,接收信息计数器加1;当待发送的消息全部插入完毕后,调用pthread_cond_wait函数,使发送线程处于休眠状态,直到读线程(通过调用pthread_cond_signal函数唤醒读线程)唤醒。
S3:接收线程判断是否有新的信息,若有则唤醒读线程读取接收线程内部的数据链表的数据;若没有则进入休眠状态。
S3-1:接收线程判断接收信息计数器中次数是否大于0,如果大于0,代表接收到新的信息,依次弹出接收线程内部的数据链表中读指针指向的数据,每读取完毕后移动读指针使其指向下一个信息地址和接收信息计数器减1,直到读指针指向的地址大于写指针指向的地址。
S3-2:接收线程判断接收信息计数器中次数不大于0,代表接收线程没有接收到新的信息时,调用pthread_cond_signal唤醒写线程,然后调用pthread_cond_wait函数,使接收线程处于休眠状态,直到写线程唤醒。
本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。
Claims (5)
1.一种基于LINUX平台下用户层的IPC通信方法,其特征在于,具体包括以下步骤:
S1:初始化LINUX系统中的线程通信信号并存放在结构体中;
S1-1:当LINUX系统中线程开始工作时,利用Linux系统函数创建线程互斥、读线程信号量和写线程信号量,生成该线程IPC通信的句柄以创建数据信息链表;
S1-2:初始化数据信息链表的读写位置和接收信息计数器,并创建结构体用于保存数据信息,该结构体的地址为线程通信的句柄;
S2:发送线程获取接收线程的句柄,将待发送的信息插入到接收线程内部的数据信息链表中,当全部插入完毕后,使发送线程处于休眠状态,直到读线程唤醒;
S3:接收线程判断是否有新的信息,若有则唤醒读线程读取接收线程内部的数据信息链表的数据;若没有则进入休眠状态。
2.根据权利要求1所述的一种基于LINUX平台下用户层的IPC通信方法,其特征在于,所述S1-2中,定义变量A标识数据信息链表的读位置,B标识数据信息链表的写位置,C表示接收信息计数器接收的信息数量和接收信息的最大长度。
3.根据权利要求1所述的一种基于LINUX平台下用户层的IPC通信方法,其特征在于,所述结构体是一种线程通信信息,包含信息源头、目的地、命令、参数、标志和反馈状态。
4.根据权利要求1所述的一种基于LINUX平台下用户层的IPC通信方法,其特征在于,所述S2中,将待发送的信息插入到接收线程句柄内部的数据信息链表中队尾,写位置变量加一,同时接收信息计数器加一。
5.根据权利要求1所述的一种基于LINUX平台下用户层的IPC通信方法,其特征在于,所述S3包括:
S3-1:接收线程判断接收信息计数器中次数大于0,代表接收到新的信息,依次弹出接收线程内部的数据信息链表中读指针指向的数据,每读取完毕后移动读指针使其指向下一个信息地址和接收信息计数器减1,直到读指针指向的地址大于写指针指向的地址;
S3-2:接收线程判断接收信息计数器中次数不大于0,代表没有接收到新的信息,接收线程处于休眠状态,直到写线程唤醒。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011272377.4A CN112328412B (zh) | 2020-11-13 | 2020-11-13 | 一种基于linux平台下用户层的ipc通信方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011272377.4A CN112328412B (zh) | 2020-11-13 | 2020-11-13 | 一种基于linux平台下用户层的ipc通信方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112328412A CN112328412A (zh) | 2021-02-05 |
CN112328412B true CN112328412B (zh) | 2024-05-07 |
Family
ID=74318204
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011272377.4A Active CN112328412B (zh) | 2020-11-13 | 2020-11-13 | 一种基于linux平台下用户层的ipc通信方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112328412B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101330473A (zh) * | 2007-06-18 | 2008-12-24 | 电子科技大学 | 一种多协议支持的网络垃圾信息过滤方法和装置 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN105975341A (zh) * | 2016-04-12 | 2016-09-28 | 苏州万特锐仪器有限公司 | 面向多核处理器的内存管理系统 |
CN108875381A (zh) * | 2017-05-15 | 2018-11-23 | 南京大学 | 一种支持内核模块隔离的消息服务模块的设计方案 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7770172B2 (en) * | 2004-09-01 | 2010-08-03 | Microsoft Corporation | Conditional variables without spinlocks |
-
2020
- 2020-11-13 CN CN202011272377.4A patent/CN112328412B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101330473A (zh) * | 2007-06-18 | 2008-12-24 | 电子科技大学 | 一种多协议支持的网络垃圾信息过滤方法和装置 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN105975341A (zh) * | 2016-04-12 | 2016-09-28 | 苏州万特锐仪器有限公司 | 面向多核处理器的内存管理系统 |
CN108875381A (zh) * | 2017-05-15 | 2018-11-23 | 南京大学 | 一种支持内核模块隔离的消息服务模块的设计方案 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
Non-Patent Citations (1)
Title |
---|
Linux下基于epoll+线程池高并发服务器实现研究;梁明刚;陈西曲;;武汉工业学院学报(第03期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112328412A (zh) | 2021-02-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5428781A (en) | Distributed mechanism for the fast scheduling of shared objects and apparatus | |
US10331595B2 (en) | Collaborative hardware interaction by multiple entities using a shared queue | |
CN101504617B (zh) | 一种基于处理器共享内存的数据发送方法及装置 | |
US6848108B1 (en) | Method and apparatus for creating, sending, and using self-descriptive objects as messages over a message queuing network | |
JP3762846B2 (ja) | サーバのグループに関する作業負荷管理を行うデータ処理装置および方法 | |
US7546613B2 (en) | Methods and systems for efficient queue propagation using a single protocol-based remote procedure call to stream a batch of messages | |
WO2018075182A1 (en) | Gpu remote communication with triggered operations | |
JP2005182754A (ja) | プロセス間伝達機構 | |
US20190140982A1 (en) | Communication Methods and Systems, Electronic Devices, and Computer Clusters | |
CN108416657B (zh) | 一种基于咨询服务的订单生成方法及设备 | |
US11429462B2 (en) | Method and apparatus for peer-to-peer messaging in heterogeneous machine clusters | |
CN110968431A (zh) | 一种消息处理方法、装置及设备 | |
CN101470636B (zh) | 一种消息的读写方法和装置 | |
CN110046047A (zh) | 一种进程间通信方法、装置及计算机可读存储介质 | |
CN114827048B (zh) | 一种动态可配高性能队列调度方法、系统、处理器及协议 | |
CN112328412B (zh) | 一种基于linux平台下用户层的ipc通信方法 | |
CN116340024A (zh) | 仿真模型组件进程间的数据共享方法、计算机设备及介质 | |
CN109062857A (zh) | 一种能高速实现多处理器间通信的新型消息控制器及其通信方法 | |
US10678744B2 (en) | Method and system for lockless interprocessor communication | |
US7929526B2 (en) | Direct messaging in distributed memory systems | |
CN115543270B (zh) | 基于消息驱动的软件架构方法、系统及设备 | |
CN116561091A (zh) | 一种日志存储方法、装置、设备及可读存储介质 | |
CN108418879A (zh) | 一种高可靠性的海量异构数据传输方法及系统 | |
Hang et al. | Handling multiple mode switch scenarios in component-based multi-mode systems | |
WO2021179222A1 (zh) | 一种调度装置、调度方法、加速系统及无人机 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |