本发明涉及网络通信技术领域,尤其涉及一种类似VxWorks单进程嵌入式操作系统中多客户端访问单点控制优化实现方法。
背景技术:
VxWorks是一种在数据网络中应用比较广泛的单进程嵌入式操作系统,通过socket提供的通信接口可以解决类似操作系统中客户端和服务器之间的网络通信问题,然而,这类操作系统不支持并发处理多进程任务。因此,将基于socket通信的多客户端-单服务器模型应用在单进程嵌入式操作系统中,服务器使用何种控制机制才能更好的响应多个客户端的读写以及异常情况是至关重要的。
目前这类操作系统中常用的方案是:通过select机制对多客户端的访问控制进行管理。其基本实现原理如下:通过select对多个客户端进行监听,并为它们统一设置超时时间,如果其中某些客户端突然断开连接,服务器并不能检测到这些客户端已经下线,只有在所有客户端断开连接,select定时器超时后,才会将它们一起踢除下线,同时释放它们使用的网络资源,这种方式对客户端的管理存在很大的局限性。
有些设计在此方案上进行优化,为每个客户端设置一个老化标记,通过select中的timeout参数设置超时对其进行老化管理,但还是不能满足客户对老化精确度的需求。
技术实现要素:
本发明所要解决的技术问题是提供一种多客户端访问单点控制优化实现方法,通过在服务器端引入独立的定时器管理线程,对于处于空闲状态的客户端,服务器及时将其踢除下线,从而提高服务器和网络资源的利用效率。
本发明解决上述技术问题的技术方案如下:
一种多客户端访问单点控制优化实现方法,包括以下步骤:
(1)服务器和客户端分别创建socket套接字描述符,服务器将创建的socket套接字描述符加入select监听集合;
(2)服务器创建一个独立的定时器管理线程,并在所述定时器管理线程中设定客户端定时器更新的时间粒度,所述定时器管理线程共享select监听集合中的所有套接字描述符;
(3)通过select机制监听服务器的socket套接字描述符,如果有客户端发起连接,则与其建立连接并将与该客户端对应的连接套接字加入select监听集合,同时设定客户端定时器的初始值;
(4)定时器管理线程根据设置的时间粒度依次对所有客户端定时器做定时更新,如果select监听到某客户端的连接套接字描述符就绪,则将该客户端定时器恢复到初始值,同时定时器管理线程中相应客户端的定时器则从初始值开始更新;对于未就绪的客户端描述符,则定时器管理线程根据时间更新粒度自动进行相应的定时器更新;对于定时器已经为0的客户端,则在定时器管理线程中将其踢除下线,并将其从监听集合中踢除,释放其使用的系统资源。
本发明的有益效果是:本发明在服务器端引入独立的客户端定时器管理线程,通过设置客户端定时器更新的时间粒度,使得客户端定时器更新时间更加精确,极大地减少了由于定时器超时,客户端被踢除下线的时间误差,更好地解决了僵死客户端长期占用网络资源的问题,同时也提高了客户端定时器的精确性。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述步骤(2)中的客户端定时器更新的时间粒度为毫秒或微秒级,定时器管理线程中的客户端定时器更新的时间粒度适用于所有已连接客户端,各客户端定时器的初始值相同。
采用上述进一步方案的有益效果是这里的毫秒或者微秒级可以使误差更小。
进一步,所述定时器的初始值以及管理线程中的时间更新粒度可以由用户根据需要进行设置,所有客户端归属于一个管理线程进行管理。
采用上述进一步方案的有益效果是客户端定时器超时,服务器能够在时间粒度所设置的较短时间内将其踢除下线并释放其使用的网络资源,这不仅解决了由于网络故障服务器检测不到客户端下线而产生僵死连接的问题,同时极大地减少了传统方案中的超时误差,并且提高了客户端定时器的精确性,从而有效地提高了网络资源的利用效率。
进一步,所述各客户端定时器的初始值为客户端定时器更新的时间粒度的整数倍。
采用上述进一步方案的有益效果是误差更小。
附图说明
图1为通过select统一设置超时时间的传统方法原理图;
图2为传统方法的一种优化方法原理图;
图3为本发明新方案客户端定时器更新过程原理图;
图4为本发明多客户端单点控制网络架构图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,利用select来监听客户端的连接和读写以及异常情况,并借助其中的timeout参数为所有客户端统一设置超时时间,假设超时时间为120s,下面通过图1来说明此方案的实现原理:
(1)10s时,所有客户端同时在线;
(2)20s时,B断开连接,由于此时仍有客户端A、C、D处于连接状态,因此服务器不会将B踢除下线;
(3)30s时,C断开连接,由于此时仍有客户端A、D处于连接状态,因此服务器不会将B、C踢除下线;
(4)直到第330s时,A、D同时断开连接,等待select定时器超时,在第450s定时器超时,此时服务器将全部客户端踢除下线,释放它们使用的网络资源。
上述技术虽然可以实现对多个客户端的读写以及异常情况进行监听,但是其中存在很大缺陷。首先,如果某些客户端在连接过程中长时间处于空闲状态,它们将长期占用网络资源,造成资源的极大浪费;其次,如果由于网络故障,某些客户端忽然断开连接,在仍有客户端处于连接状态的情况下,服务器是检测不到这些客户端已经下线的,从而造成很多连接处于僵死状态,这极大地降低了通信质量和通信效率。
目前的一种优化方案虽然对上述方案有所改进,但是在定时器超时误差方面,仍然不能满足电信网络的要求。如图2所示,设每个客户端的定时器为120s,终端更新周期为1s,即select定时器设置为1s。
如果上一次监听select是未超时返回,未就绪终端定时器进行减1操作,之后当前线程睡眠1s,第二次监听select超时返回,所有终端定时器减1。如果在120s定时器超时过程中,某些客户端的定时器一直是这样进行循环更新的,则定时器最终超时的时间将达到两倍的定时时间,即240s。这对于目前电信网络的需求状况是远远不够的。
本发明的目的在于为类似VxWorks这类单进程嵌入式操作系统提供一种多客户端访问单点控制优化实现方法,由于操作系统是单进程的,因此在服务器端引入独立的定时器管理线程,对于长期处于空闲状态的客户端,服务器及时将其踢除下线,减少定时误差,从而提高服务器和网络资源的利用效率。
本发明提出的方案在传统select机制的基础上,引入了独立的定时器线程来进行客户端定时器的管理和更新,并且可以灵活设置时间粒度(管理线程中客户端定时器的更新周期)。使得客户端定时器的更新时间更加精确,降低了定时器的超时误差。客户端的定时器超时时间以及管理线程中的时间粒度用户可通过软件(设置变量)进行配置。
本发明中,利用select机制对集合中的描述符进行监听,一旦有描述符就绪select就返回。如果select未超时返回,说明有客户端描述符就绪,然后更新该客户端定时器时间为初始值,对于未就绪的客户端描述符,独立的定时器管理线程会自动进行相应定时器的更新,对于定时器已经为0的客户端,则服务器会将其踢除下线,同时将其从监听集合中踢除,释放其使用的系统资源,其具体实现方法为:
(1)服务器和客户端分别创建socket套接字描述符,服务器将创建的socket套接字描述符加入select监听集合;
(2)服务器创建一个独立的定时器管理线程,并在所述定时器管理线程中设定客户端定时器更新的时间粒度,所述定时器管理线程共享select监听集合中的所有套接字描述符;
(3)通过select机制监听服务器的socket套接字描述符,如果有客户端发起连接,则与其建立连接并将与该客户端对应的连接套接字加入select监听集合,同时设定客户端定时器的初始值;
(4)定时器管理线程根据设置的时间粒度依次对所有客户端定时器做定时更新,如果select监听到某客户端的连接套接字描述符就绪,则将该客户端定时器恢复到初始值,同时定时器管理线程中相应客户端的定时器则从初始值开始更新;对于未就绪的客户端描述符,则定时器管理线程根据时间更新粒度自动进行相应的定时器更新;对于定时器已经为0的客户端,则在定时器管理线程中将其踢除下线,并将其从监听集合中踢除,释放其使用的系统资源。
客户端定时器更新的时间粒度为毫秒或微秒级,定时器管理线程中的客户端定时器更新的时间粒度适用于所有已连接客户端,各客户端定时器的初始值相同,这里的毫秒或者微秒级可以使误差更小。定时器的初始值以及管理线程中的时间更新粒度可以由用户根据需要进行设置,所有客户端归属于一个管理线程进行管理,客户端定时器超时,服务器能够在时间粒度所设置的较短时间内将其踢除下线并释放其使用的网络资源,这不仅解决了由于网络故障服务器检测不到客户端下线而产生僵死连接的问题,同时极大地减少了传统方案中的超时误差,并且提高了客户端定时器的精确性,从而有效地提高了网络资源的利用效率;各客户端定时器的初始值为客户端定时器更新的时间粒度的整数倍,使误差更小。
下面以1s的时间粒度和120s的客户端超时时间为例,结合图3来说明发明方案的具体实现原理。假设服务器现在有A、B两台客户端同时处于连接状态。
(1)第1s时,客户端A和B的定时器均为初始值120s;
(2)第2s时,客户端A和B没有描述符处于就绪状态,因此定时器管理线程将A和B的定时器更新为119s;
(3)经历了63s之后,A和B仍然没有描述符就绪,此时定时器管理线程更新它们的定时器值为56s;
(4)在第65s和第66s之间,只有客户端B的描述符就绪,select将其定时器更新为120s,因此66s时A和B的定时器分别更新为55s和119s;
(5)在第66s和第67s之间,只有客户端A的描述符就绪,select将其定时器更新为120s,因此67s时A和B的定时器分别更新为119s和118s。
(6)如此这样循环下去,当某个客户端定时器减为0的时候,在下一秒就会将该客户端踢除下线。
从上述过程中可以看到,客户端定时器超时的时间误差最大为1s,如果将时间粒度设置为毫秒甚至微秒,则这种误差会非常小。即如果某个客户端定时器超时,服务器能够在时间粒度所设置的较短时间内将其踢除下线并释放其使用的网络资源,这不仅解决了由于网络故障服务器检测不到客户端下线而产生僵死连接的问题,同时极大地减少了传统方案中的超时误差,并且提高了客户端定时器的精确性,从而有效地提高了网络资源的利用效率。
实施例1
网络架构如图4所示,具体实现方法为:客户端A、B、C、D同时访问服务器server,与客户端建立连接之后,在server中建立独立的客户端定时器管理线程,同时通过select对已经建立的连接套接字进行监听。server中为四个客户端分别开启定时器。通过select监听到客户端A和D在建立连接后一直处于活跃状态,而客户端B和C连接服务器之后一直未和server进行通信,即B和C一直处于空闲状态。
利用本发明的新方案中的定时器管理方法,当B和C的定时器超时之后,定时器管理线程就会将其踢除下线,释放它们使用的网络资源,这个时间误差可以被控制在毫秒甚至微秒级。
如果客户端A活跃了一段时间后,突然断开连接,则server会在客户端定时器超时后及时将其踢除下线,结束该客户连接的僵死状态,定时器超时时间同样可以被控制在毫秒甚至微秒级。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。