IPC通信方法和服务器与流程

文档序号:11475623阅读:427来源:国知局
IPC通信方法和服务器与流程

本发明涉及计算机通信技术领域,尤其是涉及一种ipc通信方法和服务器。



背景技术:

在多进程的服务器构架中,通常会采用接入层-功能层的分层设计方式,而这些不同层或者同层内不同的进程之间都需要互相通信,这就涉及到机内通信方式(ipc,inter-processcommunication,进程间通信)的设计。ipc通信方法有很多种,但一般都是点对点两个进程间的通信,而通常为了能充分利用服务器的并发能力,同一处理功能会分配多个独立的进程去完成,并通过实现某种机制来完成对处理任务到各个独立进程的分派,属于一对多/多对多的通信方式,而这类通信方式在实现上需要充分考虑读写的安全及合适的接收方对新消息到达的感知方式,比起点对点通信要复杂不少,存在忙时不能充分发挥服务器的处理能力,闲时服务器响应不及时的问题。

针对上述ipc通信方法中闲时响应不及时的问题,目前尚未提出有效解决方案。



技术实现要素:

有鉴于此,本发明的目的在于提供一种ipc通信方法和服务器,以提高闲时的响应速度。

第一方面,本发明实施例提供了一种ipc通信方法,应用于接收方,接收方包括:监控父进程、监控父进程创建的多个相互独立的消息处理子进程和共享内存;共享内存用于存储通知信号标记和发送方写入的消息;方法包括:消息处理子进程访问共享内存;消息处理子进程判断共享内存中未处理消息的数量;当共享内存中没有未处理消息时,设置通知信号标记的状态为有效,并进入休眠状态;其中,通知信号标记为有效的状态用以触发发送方在共享内存写入新消息时,向接收方发送新消息通知信号;当共享内存中仅有一条未处理消息时,设置通知信号标记的状态为有效,并读取和处理未处理的消息;当接收方接收到新消息通知信号时,唤醒多个消息处理子进程中的至少一个子进程。

结合第一方面,本发明实施例提供了第一方面的第一种可能的实施方式,还包括:当消息处理子进程判断共享内存中有多于两条未处理消息时,设置通知信号标记的状态为无效,并读取和处理未处理的消息;通知信号标记为无效的状态用以使发送方在共享内存写入新消息时,不向接收方发送新消息通知信号。

结合第一方面,本发明实施例提供了第一方面的第二种可能的实施方式,其中,唤醒多个消息处理子进程中的至少一个子进程包括:接收方通过epoll机制唤醒多个消息处理子进程中的一个以进行读取和处理新消息。

结合第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第三种可能的实施方式,还包括:当通知信号标记为无效时,消息处理子进程处理完未处理消息后,继续执行访问共享内存的步骤。

结合第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第四种可能的实施方式,还包括:当通知信号标记为无效时,处于休眠状态的消息处理子进程在休眠结束后,执行访问共享内存的步骤。

结合第一方面或第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第五种可能的实施方式,其中,设置通知信号标记的状态为有效或者无效通过设置通知信号标记的值实现。

结合第一方面或第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第六种可能的实施方式,其中,读取和处理未处理的消息包括:获得共享内存的读操作锁;读取共享内存中最早的消息并解除读操作锁;对读取的消息进行处理。

第二方面,本发明实施例还提供一种ipc通信方法,应用于发送方,包括:将消息写入接收方的共享内存;检查共享内存中的通知信号标记的状态;当通知信号标记的状态为有效时,向接收方发送新消息信号。

结合第二方面,本发明实施例提供了第二方面的第一种可能的实施方式,其中,将消息写入接收方的共享内存包括:获得共享内存上消息队列的写操作锁;判断消息队列是否已满;当消息队列未满时,在当前队列的读指针所指向区域写入消息,然后释放写操作锁;当消息队列已满时,等待预定时间后继续执行判断消息队列是否已满的步骤。

第二方面,本发明实施例还提供一种服务器,包括发送模块和接收模块;发送模块用于:将消息写入接收方的共享内存;检查共享内存中的通知信号标记的状态;当通知信号标记的状态为有效时,向接收方发送新消息信号;接收模块包括监控父进程、监控父进程创建的多个相互独立的消息处理子进程和共享内存;接收模块用于:消息处理子进程访问共享内存;消息处理子进程判断共享内存中未处理消息的数量;当共享内存中没有未处理消息时,设置通知信号标记的状态为有效,并进入休眠状态;其中,通知信号标记为有效的状态用以触发发送方在共享内存写入新消息时,向接收方发送新消息通知信号;当共享内存中仅有一条未处理消息时,设置通知信号标记的状态为有效,并读取和处理未处理的消息;当接收方接收到新消息通知信号时,唤醒多个消息处理子进程中的至少一个子进程。

本发明实施例带来了以下有益效果:

本实施例提供的ipc通信方法和服务器,通过在接收方设置共享内存和通知信号标记,可以在闲时将该通知信号标记设置为有效,发送方在共享内存写入新消息时需要向接收方发送新消息通知信号,因此可以唤醒子进程以及时进行消息处理,因此可以提高闲时接收方的响应速度,同时大部分子进程处于休眠状态,减少多余的处理,降低服务器的能耗。

本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种ipc通信方法的流程示意图;

图2为本发明实施例提供的另一种ipc通信方法的流程示意图;

图3为本发明实施例提供的另一种ipc通信方法的流程示意图;

图4为本发明实施例提供的通信结构的示意图;

图5为本发明实施例提供的服务器的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

目前现有技术中的ipc通信方法存在闲时响应不及时的问题,基于此,本发明实施例提供的一种ipc通信方法和服务器,可以提高闲时的响应速度。

为便于对本实施例进行理解,首先对本发明实施例所公开的一种ipc通信方法进行详细介绍。

在服务器中,不同进程之间需要进行相互通信,因此存在通信角色中的接收方和发送方。发送方可以是任意需要向当前接收方发送消息的进程或线程。发送方每次发送的都是完整的消息包,不存在被拆开的消息。接收方由一个监控父进程,多个互相独立的消息子处理进程和一块由接收方管理的共享内存组成。

其中,共享内存在通信开始前就需要完成初始化,共享内存里包括了一条存储消息用的循环队列,读写指针及相关的操作锁和接受方接收的新消息到达的通知信号标记;一个接受方独立管理一块共享内存,不同接受方所管理的共享内存块不重叠。

属于接收方的监控父进程在启动时先用fork创建各个消息处理子进程,然后负责监视所有消息处理子进程是否存活,存在子进程退出(异常退出或者处理消息积累到一定程度而主动退出)的情况,当进程数低于某个数量时再次创建新的子进程

消息处理子进程每个都可以独立处理消息,不存在依赖;所有子进程在被监控父进程创建时都会获得一个所有子进程共享的用于接收发送方信号的epoll句柄,以用于进程的信号唤醒;所有的子进程都共同操作由接收方管理的一块共享内存,并从中读取待处理消息。当有通知信号到达时,因为epoll本身的机制,所有等待信号的子进程只有一个会被系统唤醒。

实施例1

图1是本发明一种ipc通信方法的流程示意图。该方法应用于接收方,接收方包括:监控父进程、监控父进程创建的多个相互独立的消息处理子进程和共享内存;共享内存用于存储通知信号标记和发送方写入的消息;该实施方式示出的方法流程包括如下步骤:

步骤s11,消息处理子进程访问共享内存。

接收方包括多个消息处理子进程,上述子进程可以是结束休眠的子进程也可以是被监控父程序唤醒的子进程。具体地,消息处理子进程访问共享内存是通过读取共享内存中的未处理消息实现。

步骤s12,消息处理子进程判断共享内存中未处理消息的数量。

接收方的消息处理分闲时和忙时两种情况。其中闲时的情况是指共享内存的消息队列中有一段时间是空的,或未处理的消息量形不成积压的情况,这种情况下消息处理子进程有大部分时间处于休眠状态;忙时是指消息队列中一直有消息的情况,指某个子进程去除一条待处理消息后队列中仍然有待处理消息存在。因此可以通过判断共享内存中未处理消息的数量获知闲时、忙时状态。

当共享内存中没有未处理消息时,执行步骤s13;当共享内存中仅有一条未处理消息时,执行步骤s14。

步骤s13,设置通知信号标记的状态为有效,并进入休眠状态。

当共享内存中没有未处理消息时,即数量为零的情况,此时消息处理子进程无需要执行的任务,从而进入休眠状态。此时会导致大部分子进程都进入休眠状态,如果发送方发送了新消息就会得不到及时地响应。由于在共享内存中还存储有通知信号标记,该通知信号标记包括有效和无效两种状态,其中,通知信号标记为有效的状态用以触发发送方在共享内存写入新消息时,向接收方发送新消息通知信号,因此设置该通知信号标记的状态为有效。在接收方收到发送方发送的新消息通知信号后,唤醒子进程进行消息处理,因此可以提高闲时接收方的响应速度。

其中,设置通知信号标记的状态为有效或者无效通过设置通知信号标记的值实现。

步骤s14,设置通知信号标记的状态为有效,并读取和处理未处理的消息。

当共享内存中仅有一条未处理消息时,即未处理的消息还未形成积压的情况,此时也需要将通知信号标记的状态设置为有效,并且读取和处理未处理的消息。

具体地,读取和处理未处理的消息包括:获得共享内存的读操作锁;读取共享内存中最早的消息并解除读操作锁;对读取的消息进行处理。

步骤s15,唤醒多个消息处理子进程中的至少一个子进程。

根据前述内容,所有子进程在被监控父进程创建时都会获得一个全子进程共享的用于接收发送方信号的epoll句柄,因此在收到新消息时,由于epoll支持多监听下只告知一个监听方有信号到达,因此所有休眠的消息处理子程序中只有一个会被唤醒去处理消息。通过上述通知信号标记的设置,不但可以提高闲时接收方的响应速度,还可以仅根据需要唤醒子进程,降低了服务器的能耗。

当上述通知信号标记设置为有效时,子进程使用epoll_wait进入监听该信号的状态,并设置监听超时。此时进程处于等待信号唤醒的状态,如果此时有发送方发送新消息,并给接收方发出了信号,则接收方中所有处于等待信号唤醒状态的子消息处理进程将会有一个被唤醒(epoll自身的竞争处理机制),然后执行该新消息,如果子进程直到超时都没有被信号唤醒,则子进程退出等待状态,重新执行步骤s11。当没有消息时,所有子进程休眠一段指定时间,中途如果有进程休眠时间到了,但因为没有要处理的消息,子进程会重新进入休眠状态。

上述方法通过在接收方设置共享内存和通知信号标记,可以在闲时将该通知信号标记设置为有效,发送方在共享内存写入新消息时需要向接收方发送新消息通知信号,因此可以唤醒子进程以及时进行消息处理,因此可以提高闲时接收方的响应速度,同时大部分子进程处于休眠状态,减少多余的处理,降低服务器的能耗。

实施例2

图2是本发明一种ipc通信方法的流程示意图,在实施例1的基础上,还包括共享内存中有多于两条未处理消息的情况下的步骤,当消息处理子进程判断共享内存中有多于两条未处理消息时,具体步骤如下:

步骤s21,设置通知信号标记的状态为无效,并读取和处理未处理的消息。

上述通知信号标记为无效的状态用以使发送方在共享内存写入新消息时,不向接收方发送新消息通知信号。

当共享内存中有多于两条未处理消息时,即忙时的情况,某个子进程处理一条待处理消息后队列中仍然有待处理消息存在,消息处理子进程会把共享内存中的信号标记设置为无效状态,以告知发送方发送新消息后无需专门发送信号通知。原因在于:当通知信号标记为无效时,消息处理子进程处理完未处理消息后,继续执行访问共享内存的步骤;处于休眠状态的消息处理子进程在休眠结束后,执行访问共享内存的步骤。

具体地,消息处理子进程在处理完一个消息后不会进入休眠,而是直接处理下一个消息,而其他仍然处于休眠状态的进程在休眠结束后也会加入到消息处理中,直到消息没有堆积后,才回到闲时状态的执行方式。即直到消息队列已空,则进程把通知信号标记设置为有效,自身使用epoll_wait进入监听该信号的状态,并设置监听超时。

上述消息处理子进程处理消息时的详细步骤如下:子进程先把共享内存中的信号标记设置为无效状态,然后获得共享内存中消息队列中的读操作锁,读出最早的一条消息,解除读操作锁,再对读出来的消息进行处理,处理完成后检查队列中是否尚有未处理消息,有的情况下继续获得读操作锁并读取下一条消息处理,直到消息队列中没有待处理消息后,子进程将共享内存中的信号标记重新设置为有效状态,自己转入休眠。

本实施例提供的上述方法,当消息处理子进程判断共享内存中有多于两条未处理消息时,通过设置通知信号标记的状态为无效,不需要发送方发送新消息后专门发送信号通知,子进程处理完未处理消息后,继续执行访问共享内存的步骤,同时处于休眠状态的消息处理子进程在休眠结束后,也执行访问共享内存的步骤,在忙时接收方可以满载处理,充分使用多进程的优势,实现多条消息的并行处理,最大限度使用服务器的处理能力。

实施例3

图3是本发明一种ipc通信方法的流程示意图,该实施方式示出的方法流程包括如下步骤:

步骤s31,将消息写入接收方的共享内存。

发送方向接收方发送数据的操作是通过向接收方的共享内存写数据实现的,数据写完后还需要根据接收方在共享内存中设置的通知信号值确定是否要向接收方发送通知信号。

具体包括:获得共享内存上消息队列的写操作锁;判断消息队列是否已满;当消息队列未满时,在当前队列的读指针所指向区域写入消息,然后释放写操作锁;当消息队列已满时,等待预定时间后继续执行判断消息队列是否已满的步骤。

步骤s32,检查共享内存中的通知信号标记的状态。

发送方写完要发送的消息,释放消息队列写操作锁后,会检查共享内存中是否需要在发送新消息后发送信号的通知信号标记,如果该标记被设置为有效的信号值,则发送方向接收方发送指定的信号,否则不向接收方发送信号。该通知信号标记的变更由接收方消息处理子进程完成。当通知信号标记的状态为有效时,执行步骤s33;当通知信号标记的状态为无效时,结束。

步骤s33,向接收方发送新消息信号。

可以理解的是,当通知信号标记的状态为无效时,不需要向接收方发送新消息信号。

本实施例提供的上述方法,通过接收方的通知信号标记的状态确定是否发送新消息信号通知接收方新消息到来,在闲时可以提高接收方的响应速度,减少多余的处理,降低服务器的能耗;在忙时接收方可以满载处理,充分使用多进程的优势,实现多条消息的并行处理,最大限度使用服务器的处理能力。

参见图4所示的本实施例的通信结构的示意图,其中示出了多个发送方和多个接收方的多对多的通信方式,发送方将消息写入共享内存,接收方从共享内存中读取消息,在通知信号标记有效时接收方通过epoll机制唤醒消息处理子进程(图中的独立进程1、2、3)。

实施例4

本发明实施例4提供了一种服务器,该服务器包括可以管理资源并为用户提供服务的设备。参见图5所示的结构示意图,包括发送模块510和接收模块520;各模块的功能如下:

发送模块用于:将消息写入接收方的共享内存;检查共享内存中的通知信号标记的状态;当通知信号标记的状态为有效时,向接收方发送新消息信号。

接收模块包括监控父进程、监控父进程创建的多个相互独立的消息处理子进程和共享内存;接收模块用于:消息处理子进程访问共享内存;消息处理子进程判断共享内存中未处理消息的数量;当共享内存中没有未处理消息时,设置通知信号标记的状态为有效,并进入休眠状态;其中,通知信号标记为有效的状态用以触发发送方在共享内存写入新消息时,向接收方发送新消息通知信号;当共享内存中仅有一条未处理消息时,设置通知信号标记的状态为有效,并读取和处理未处理的消息;当接收方接收到新消息通知信号时,唤醒多个消息处理子进程中的至少一个子进程。

本发明实施例提供的服务器,与上述实施例提供的ipc通信方法具有相同的技术特征,所以也能解决相同的技术问题,达到相同的技术效果。

本发明实施例所提供的ipc通信方法和服务器的计算机程序产品,包括存储了程序代码的计算机可读存储介质,程序代码包括的指令可用于执行前面方法实施例中的方法,具体实现可参见方法实施例,在此不再赘述。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

上述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例的方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1