一种基于socket的容错计算机系统的网络同步方法

文档序号:7928329阅读:175来源:国知局
专利名称:一种基于socket的容错计算机系统的网络同步方法
技术领域
本发明属于计算机领域,涉及容错技术与同步技术,具体涉及一种基于 socket的容错计算机系统的网络同步方法。
背景技术
随着互联网以及信息平台的广泛应用,信息化已成为企业核心竞争力的重 要组成部分。在现代企业中,服务器宕机时间是损失利润的主要原因之一。对 那些需要保障信息安全和提供不间断信息服务的机构来说,例如证券、制造、 通信、银行、运输,业务系统的容错性和不间断性显f寻尤为重要。如何保障各 种关键应用持续运营,达到永续经营的良性循环,已成为当今企事业单位和IT 领域急需解决的关键问题。容错计算机及相关技术正是在这种客观需求下应运 而生,利用容错计算机能避免因服务器故障而引发的数以万计的经济损失。
容错计算机是在冗余(硬件冗余、时间兀余、信息冗余、软件冗余)基础上, 通过合理的体系结构,在系统软件的有效管理下而形成的高可靠、高可用计算 机。故障检测是容错计算机的关键技术之一。而在协调完成多模块容错系统的 表决、故障模块的隔离过程中,同步是其核心。在多模冗余系统中,各模块运 行相同的任务,对结果进行比较、表决,从而检错。无论将比较点,表决数据 置于何处,例如处理器核(ProcessorCore),高速缓存(Cache),主存(Memory)等, 同步都是一个关键的环节。
同步方式可以分为时钟同步与任务同步。时钟同步包括严格的硬件时钟同 步和部分软件实现的松散时钟同步,以及引伸的相关算法。时钟同步发现错误 及时,开销小,但需要一定的硬件支持,实现复杂。任务同步以一个独立运行
的、具有一定逻辑任务的一次运行作为同步的基础,用这种方式,系统在任务 中设立一个或多个比较、表决点。在相同比较表决点位置,运行正常的任务具 有一致的任务进程状态数据和应用数据,处于任务同步状态。此时可对任务的 中间结果和最后输出进行一致性判断,即对任务进程状态数据和应用数据进行 一致性的比较表决判断,从而检错。
对于网络数据,任务同步又有不同的实现方法。 一种方法在设备驱动与操
作系统内核之间添加一层伪设备驱动Pseudo Device Driver (PDD),在PDD中设
置同步点与检査点,对流经数据进行比较。另一种方式将同步点移入了操作系 统内核中,将同步点设置在网络核心层的netif一nc()(接收数据包)和 dev_queue—xmit(X发送数据包)等函数中。还有一些研究对IP层进行改动,添加 连接管理和缓冲管理模块,在高可用集群系统上实现TCP连接的同步。当然, 也可直接利用硬件锁步,以特定硬件及体系结构实现同步。
以上各种网络数据同步方法中,有一些太靠近底层设备,有一些需要对 TCP/IP协议本身作改动,有一些完全依赖于硬件设计,或多或少都存在实现上 的复杂性。

发明内容
本发明的目的在于克服上述现有技术的缺点,提供了一种简单有效的方式 实现容错系统中网络数据同步的基于socket的容错计算机系统的网络同步方 法。
为达到上述目的,本发明釆用的技术方案是在Linux网络体系结构的套 接字接口层插入监测器,进程通过socket方式进行网络通信调用socket相关接 口函数,socket相关接口函数包括套接字创建函数socket()、绑定端口函数 bind()、监听端口函数listenO、请求连接函数connect()、接受连接函数accept()、 关闭连接函数close()、发送数据包函数send()或write0、接收数据包函数recv()
或read(),接口函数通过系统调用进入操作系统内核,并执行对应内核函数完 成核心操作,包括sys—socket(), sys—bind(), sys—listen(), sys一accept(), sys—connect(), —sock—sendmsg0,—sock_recvmsg(), sys—close(),对以上内核函数设置监观!l, 一 旦内核函数被双模冗余进程调用则触发同步逻辑; 其具体步骤如下
1) 对创建socket结构相关内核函数插入同步逻辑
Socket通信要求通信双方进程创建通信套接字数据结构即struct socket结 构,并以socket类型inode节点的文件打开方式与进程关联,内核函数sys一socket() 用于完成此任务,插入同步逻辑后的sys—socket()函数使双模冗余进程仅建立单 一 socket结构,并共用该结构进行网络通信,当监测器监测到双模冗余进程调 用sys—socket()函数时,执行同步逻辑进行同步,先到达的进程PI完成socket 结构创建过程,将其地址临时保存,并进入等待队列睡眠等待;后到达的进程 P2根据先到达的进程PI保存的地址获取socket结构,并唤醒P1,完成同步逻 辑后,Pl, P2分别建立自己的文件对象、目录项对象与socket结构关联,也即 完成了双模进程共用socket结构的创建;
2) 对建立与关闭连接相关内核函数插入同步逻辑 进程在收发数据包进行网络通信前,需要完成建立通信连接的辅助操作,
包括调用bind()绑定通信端口 , listenO监听端口 , accept()接收连接请求,connect() 发送连接请求,其中Usten0, accept()和connect()仅用于TCP通信,在此类函 数的同步逻辑中,将双模进程区分为主、从进程,主进程执行核心操作,从进 程仅完成形式同步;
网络通信结束后进程调用close()函数关闭连接,在关闭函数同步逻辑中, 主进程执行sock一closeO释放socket;从进程仅完成同步等待,不执行核心操作;
3) 对数据包收发内核函数插入同步逻辑
通信进程调用send()或writeO函数发送数据,send()和write()函数都对应于
内核函数一sock一sendmsgO,对于发送过程,从进程到达同步点后,在内核堆区 申请临时空间存储待发送的数据包;主进程到达后,将自身待发送数据包与从 进程存储的数据包进行比较,若数据相同则执行发送,若不同则触发出错处理; 对于接收过程,主进程到达同步点后,调用接收函数接收数据包,并在内核堆 区申请空间将数据包复制并存储;从进程到达后从内核堆区将数据包拷贝到本 进程的地址空间。
本发明在内核中添加同步用数据结构和同步项,定义等待队列socket—wq, 到达同步点尚未完成同步的任务在此等待队列中睡眠等待,定义数据结构struct ft_socket_msghdr,用于存储同步点任务的需要比较的msghdr数据包,在socket 结构中添力口 ft—socket—bind—syn, ft一socket一listen一syn, ft—socket—connect—syn, ft_socket_read_syn, ft一socket一write一syn, ft一socket一close一syn域作为同步标志位; 增加ft一socket一msghdr型指针承ft一msg—recv, *ft__msg—send,作为内核临时存储 区空间的地址指针;增加ft一socket—ret用于存储函数操作返回值,在进程控制 块中增加ft—socket_executor用于标识主从进程,增加*ft_create_socket和 *ft_accept—socket作为同步点上公用socket结构的指针。
本发明的监须幡对进程类型进行判断,若执行内核函数的进程为冗余进程, 则执行插入同步逻辑的内核函数,接下来依次对sys_socket(), sys—bind(), sys一listenO, sys一accept(), sys一connect(), sock—sendmsg(), —sock一recvmsg() 和sys—close()函数进行改造,插入同步逻辑;
改造sys_socket(), sys一socket()用于创建socket结构并将此结构与进程联系, 其中创建部分由sock—create()完成,连接部分由sock—map—fd0完成。当双模冗 余任务进程调用sys—socketO创建socket时,对双模进程进行同步,使其共用一 个socket结构。根据ft—socket—executor判断进程类型,该值为1的进程为主进 程,该值为0的进程为从进程。如果主进程先到达同步点,贝U调用sock—create() 完成创建过程,将创建的socket结构地址存入ft_create_socket中,之后进入等 待队列socket—wq等待,后到达同步点的从进程读取ft_create_socket并唤醒等 待中的主进程完成同步;如果从进程先到达同步点,则进入等待队列socket—wq 睡眠等待,后到达的主进程完成创建工作后唤醒从进程完成同步。在 sock一createO函数中最终调用sock一alloc()分配socket结构和其对应的索引节点, 对索引节点的引用计数i一coimt设为2,以便双模进程共用一个socket结构和索 引节点。在创建socket结构的同时需要将ft_socket—bind_syn, ft—socket_listen_syn 等所有同步标志位初始化为0。之后,双模冗余进程分别调用SOCk_map—fd()建 立自己的文件对象、目录项对象与索引节点关联。其中,socket结构中的file 指针指向主进程的文件对象。
改造sys_bind0,根据ft_socket—executor区分主从进程执行不同的操作。对 于主进程,执行ops》bindO绑定端口,将返回值存入ft—socket—ret,将同步位 ft_socket_bind_syn置1 ,唤醒socket—wq等待队列中的从进程;对于从进程, 到达同步点时,若ft一socketJ)ind—syn为1,通过同步点,将ft—socket—bind一syn 清0,并从ft一socket一ret中读取返回值,若ft_socket—bind_syn为0,进入socket一wq 睡眠等待。
改造sys一listen(),根据ft—socket一executor区分主从进程执行不同的操作。 对于主进程,执行ops》listenO监听端口,将返回值存入ft—socket—ret,将同步 位ft_socket_listen_syn置1,唤醒socket一wq等待队列中的从进程;对于从进程, 到达同步点时,若ft—socket—listen—syn为1,通过同步点,将ft—socket一listen一syn 清0,并从ft一socketjet中读取返回值,若ft一socket一listen—syn为0,进入socket一wq 睡眠等待。
改造sys_accept(), sys—accept()由监听进程调用,接收连接请求并创建新的 通信socket。根据ft_socket_executor区分主从进程,主进程调用sock—alloc()分 配新的socket结构,通过ops-〉accept()将新生成的socket转变为通信socket, 用ft—accept_socket保存其地址,并唤醒等待队列socket—wq;从进程根据
ft—accept—socket是否为空判断到达顺序,从进程若先到达同步点,则进入等待 队列等待,若后到达同步点,则通过ft—accept—socket读取新创建的socket与其 建立联系。
改造sys—connect(),根据ft—socket—executor区分主从进程执行不同的操作。 对于主进程,执行ops-〉connect请求连接,将返回值存入ft_socket_ret,将同步 位ft—socket—connect—syn置1,唤醒socket—wq等待队列中的从进程;对于从进 程,到达同步点时,若ft_socket_connect_syn为1,通过同步点,将 ft—socket—connect—syn清0 , 并从ft—socket_ret 中读取返回值,若 ft—socket—connect—syn为0,进入socket_wq睡目民等待。
改造send()和writeO,这两个函数均可用于发送数据,在内核中最终都调 用—sock—sendmsg(),可改造—sock—sendmsg()同时捕获两种调用方式。在内核 堆区为ft—msg一send分配空间用于存储供比较的数据包。根据ft_socket—executor 区分主从进程,从进程首先准备好需要发送的数据包struct msghdrmsg,将msg 拷贝入ft一msg—send指向的内存空间中,对ft—socket一write一syn置1 ,唤醒等待 队列,自己进入等待队列睡眠;主进程到达同步点时,若ft_socket—write—syn 为0,则进入等待队列等待,若ft—socket一write一syn为1 ,则将自己的数据包与 ftjnsg—send指向的内存空间中的数据进行比较,并最终调用ops》sendmsg()发 送数据,将ftsocket一write一syn清0,唤醒等待队列。其中需要比较的数据包含 msghdr结构中的所有内容,包括msg一name, msg一namelen, msg—iov, msg_iovlen, msg一control, msg一controllen, msg一flags等。
改造recv()和read0,这两个函数均可用于接收数据,在内核中最终都调用 —sock一recvmsg0,可改造一sock一recvmsg()同时捕获两种调用方式。在内核堆 区为ft—msg—recv分配空间用于存储供复制的数据包。根据ft—socket—executor 区分主从进程,主进程首先调用ops-〉recvmsg0接收数据存入struct msghdr msg 中,并将msg中的内容逐项拷贝入ft—msg一recv指向的内存空间中,将同步标
志位ft_socket—read_syn置1,并进入等待队列等待;从进程到达后从ft-msg-recv 指向的内存空间中将数据包拷贝入自己的struct msghdr msg中,包括msg-name, msg-namelen, msg-iov, msgjovlen, msg-control, msg-controllenj msg-flags等内 容。最后将ft-sockeyead-syn清0,唤醒等待队列中的主进程。
改造sys-close(),根据ft_socket_executor区分主从进程执行不同的操作。 对于主进程,执行sock-close()释放socket,将同步位ft-socket-close-syn置1 , 唤醒S0Cket-Wq等待队列中的从进程;对于从进程,到达同步点时,若 ft-socket-close-syn为 1 , 通过同步点,将ft-socket-close-syn清0, 若 ft-socket-close-syn为0,进入socket-wq睡眠等待。
本发明通过修改linux操作系统内核,在套接字接口层上设置同步点,对 双模冗余进程的网络通信进行同步。经过在套接字层设置监测器,插入同步逻 辑改造后的操作系统,主动对socket相关内核函数进行监控,截获调用相关函 数进行网络通信的双模冗余进程,并对其进行同步。整个过程对上层应用完全 透明。与其他实现方式相比,此方法实现简单,无需改动硬件设计,对设备驱 动透明,无需修改下层网络协议。


图1为本发明的工作流程图; 图2为本发明的同步原理图3为本发明在接收数据同步点上主进程的工作流程图4为本发明在接收数据同步点上从进程的工作流程图; 图5为本发明在发送数据同步点上主进程的工作流程图6为本发明在发送数据同步点上从进程的工作流程图。
具体实施例方式
下面结合附图对本发明作进一步详细说明。
如图1所示。图中以服务器端运行双模冗余为例,客户端如需运行双模冗
余,流程类似。如图所示,冗余进程同步执行createO, bind(), listen(), accept(), read0, write(), close()等操作。图中服务器端,左侧的进程为主进程,即主从标 志位ft_socket_executor为1的进程;右端为从进程,艮卩ft一socket一executor为0 的进程。图中实线框内的操作执行实际的核心操作,虚线框内的操作仅完成同 步。执行create()操作,主进程创建socket索引节点结构,从进程在同步点与 socket结构建立连接,双进程公用一个socket结构。执行bind()操作,主进程将 socket结构与指定端口绑定,从进程在同步点同步等待,不执行实际操作。执 行listen()操作,主进程完成将其所建立的socket转变为监听socket,从进程在 同步点同步等待,不执行实际操作。执行acceptO操作,主进程创建新的通信 socket,从进程在同步点与该socket建立关联,同样双进程共享socket。执行read() 操作,主进程在读取下层传递来的数据包的同时,将数据复制到内核临时存储 区中,从进程在同步点从临时存储区中读取数据包。执行writeO操作,从进程 在同步点将所需写出的数据存入内核临时存储区,主进程将自己的数据与从进 程存入的数据迸行比较,并最终将一份数据传向下层。执行cbse()操作,主进 程释放socket结构,从进程在同步点同步等待。从以上过程可以看出,主从进
程始终通过共享的socket结构完成套接字方式的通信。
双模冗余进程的同步原理如图2所示,任务P1, P2是一对冗余进程,分别
独立执行,在执行至ijsocket()系统调用收发网络数据时进行同步。图中,第一次
同步对数据发送同步,P2准备好了发送数据首先到达同步点,而P1尚未到达,
P2进入等待状态,在经过时间tl后,Pl也顺禾倒达同步点,内核启动同步过程,
对发送数据进行比较并向下层发送。第二次同步为对接收过程同步,Pl首先到
达同步点进入等待,在经过时间t2后P2到达同步点,内核进行同步,将下层数
据复制为两份分别发送给P1, P2。系统为同步特别构建了等待队列,先到达同
步点的任务进入等待队列等待,当后到达任务进入同步点后将先到任务从等待
队列唤醒。
参见图3,主进程进入数据接收同步点,首先调用sock》ops)recvmsg()接 收数据包,同时分配临时存储区ft—msg一recv的空间,并将接收的数据包逐项拷 贝入临时存储区ft_msg—recv所指空间中。此后将同步标志位ft—socket_read_syn
置l,对等待队列sockeLwq执行wake^pO操作,唤醒可能在等待的从进程, 而自己进入等待队列socket一wq等待。主进程在等待队列中循环对标志位 ft—socket_read_syn进行判断,当ft_socket_read—syn被(从进程)清0后,主进程 脱离等待队列,释放临时存储区,结束数据接收同步过程。
参见图4,从进程到达数据接收同步点,首先进入等待队列S0Cket_Wq等 待,并对标志位ft—sockeyea^syn循环检测,当ft_socket_read_syn被(主进程) 置l后,从进程脱离等待队列,之后从临时存储区中将数据包逐项拷贝入自己 的数据空间中,最后将ft—socket_read—syn清0,并对等待队列socket—wq调用 wake一up操作,唤醒可能在等待的主进程,结束数据接收同步过程。
参见图5,主进程到达数据发送同步点,首先进入等待队列socket—wq等 待,并循环检测标志位ft_socket_write—syn,当ft_socket_write_syn被(从进程) 置1后,主进程被唤醒。然后将自己欲发送的数据包与内核临时存储区中的数 据逐项进行比较,比较通过后调用ops》sendmsgO发送数据,若未通过转入错 误处理。最后将ft—socket一write一syn清0,对等待队列socket_wq执行wake_up 操作,唤醒可能在等待的从进程,结束数据发送同步过程。
参见图6,从进程到达数据发送同步点,首先分配内核临时存储区,将欲 发送数据包逐项考入临时存储区中,并将ft一sockeLwrit^syn置l。然后对等待 队列socket_wq执行wake—up()操作,唤醒可能在等待的主进程,而自己进入等 待队列等待,并循环检测标志位ft_socket_write—syn。当ft_socket_write—syn被(主 进程)清0后,从进程脱离等待队列,释放临时存储区,结束数据发送同步过程。
权利要求
1、一种基于socket的容错计算机系统的网络同步方法,其特征在于在Linux网络体系结构的套接字接口层插入监测器,进程通过socket方式进行网络通信调用socket相关接口函数,socket相关接口函数包括套接字创建函数socket()、绑定端口函数bind()、监听端口函数listen()、请求连接函数connect()、接受连接函数accept()、关闭连接函数close()、发送数据包函数send()或write()、接收数据包函数recv()或read(),接口函数通过系统调用进入操作系统内核,并执行对应内核函数完成核心操作,包括sys_socket(),sys_bind(),sys_listen(),sys_accept(),sys_connect(),_sock_sendmsg(),_sock_recvmsg(),sys_close(),对以上内核函数设置监测,一旦内核函数被双模冗余进程调用则触发同步逻辑;其具体步骤如下1)对创建socket结构相关内核函数插入同步逻辑Socket通信要求通信双方进程创建通信套接字数据结构即struct socket结构,并以socket类型inode节点的文件打开方式与进程关联,内核函数sys_socket()用于完成此任务,插入同步逻辑后的sys_socket()函数使双模冗余进程仅建立单一socket结构,并共用该结构进行网络通信,当监测器监测到双模冗余进程调用sys_socket()函数时,执行同步逻辑进行同步,先到达的进程P1完成socket结构创建过程,将其地址临时保存,并进入等待队列睡眠等待;后到达的进程P2根据先到达的进程P1保存的地址获取socket结构,并唤醒P1,完成同步逻辑后,P1,P2分别建立自己的文件对象、目录项对象与socket结构关联,也即完成了双模进程共用socket结构的创建;2)对建立与关闭连接相关内核函数插入同步逻辑进程在收发数据包进行网络通信前,需要完成建立通信连接的辅助操作,包括调用bind()绑定通信端口,listen()监听端口,accept()接收连接请求,connect()发送连接请求,其中listen(),accept()和connect()仅用于TCP通信,在此类函数的同步逻辑中,将双模进程区分为主、从进程,主进程执行核心操作,从进程仅完成形式同步;网络通信结束后进程调用close()函数关闭连接,在关闭函数同步逻辑中,主进程执行sock_close()释放socket;从进程仅完成同步等待,不执行核心操作;3)对数据包收发内核函数插入同步逻辑通信进程调用send()或write()函数发送数据,send()和write()函数都对应于内核函数_sock_sendmsg(),对于发送过程,从进程到达同步点后,在内核堆区申请临时空间存储待发送的数据包,主进程到达后,将自身待发送数据包与从进程存储的数据包进行比较,若数据相同则执行发送,若不同则触发出错处理;对于接收过程,主进程到达同步点后,调用接收函数接收数据包,并在内核堆区申请空间将数据包复制并存储,从进程到达后从内核堆区将数据包拷贝到本进程的地址空间。
2、 根据权利要求1所述的基于socket的容错计算机系统的网络同步方法, 其特征在于:在内核中添加同步用数据结构和同步项,定义等待队列socket—wq, 到达同步点尚未完成同步的任务在此等待队列中睡眠等待,定义数据结构struct ft—socket_msghdr,用于存储同步点任务的需要比较的msghdr数据包,在socket 结构中添力口 ft_socket—bind_syn, ft一socket一listen一syn, ft一socket一connect一syn, ft_socket—read一syn, ft一socket一write—syn, ft—socket—close一syn域作为同步标志位; 增加ft—socket—msghdr型指针承ft一msg一recv, *ft_msg—send,作为内核临时存储 区空间的地址指针;增加ftsocket一ret用于存储函数操作返回值,在进程控制 块中增加ft_socket_executor用于标识主从进程,增加*ft—create_socket和 *ft_accept_socket作为同步点上公用socket结构的指针。
3、 根据权利要求1或2所述的基于socket的容错计算机系统的网络同步方法,其特征在于所说的监测器对进程类型进行判断,若执行内核函数的进程为冗余进程,则执行插入同步逻辑的内核函数,接下来依次对sys_socketO, sys—bind(), sys—listen(), sys—accept(), sys—connect(), —sock—sendmsg(), —sock一recvmsg() 和sys—close()函数进行改造,插入同步逻辑;改造sys_socket(), sys—socket()用于创建socket结构并将此结构与进程联系, 其中创建部分由sock一create()完成,连接部分由sock一map一fd()完成,当双模冗 余任务进程调用sys—socket()创建socket时,对双模进程进行同步,使其共用一 个socket结构,根据ftsocket一executor判断进程类型,该值为1的进程为主进 程,该值为0的进程为从进程,如果主进程先到达同步点,贝ij调用sock—create() 完成创建过程,将创建的socket结构地址存入ft一create—socket中,之后进入等 待队列socket—wq等待,后到达同步点的从进程读取ft—create—socket并唤醒等 待中的主进程完成同步;如果从进程先到达同步点,则进入等待队列socket—wq 睡眠等待,后到达的主进程完成创建工作后唤醒从进程完成同步,在 sock一create()函数中最终调用sock—alloc()分配socket结构和其对应的索引节点, 对索引节点的引用计数i_count设为2,以便双模进程共用一个socket结构和索 引节点,在创建socket结构的同时需要将ft_socket—bind一syn, ft—socketjisten一syn 所有同步标志位初始化为0,之后,双模冗余进程分别调用sock—map—fd()建立 自己的文件对象、目录项对象与索弓l节点关联,其中,socket结构中的file指 针指向主进程的文件对象。改造sys一bind(),根据ft_socket_executor区分主从进程执行不同的操作,对 于主进程,执行ops-〉bindO绑定端口,将返回值存入ft—socket—ret,将同步位 ft_socket—bind—syn置1 ,唤醒socket一wq等待队列中的从进程;对于从进程, 到达同步点时,若ft—socketjDin^syn为1,通过同步点,将ft—socket—bind一syn 清0,并从ft_socket_ret中读取返回值,若ft—socket一bind一syn为0,进入socket_wq睡眠等待;改造sys一listen(),根据ft_socket_executor区分主从进程执行不同的操作, 对于主进程,执行ops》listenO监听端口,将返回值存入ft—socket_ret,将同步 位ft_socket_listen_syn置1 ,唤醒socke^wq等待队列中的从进程;对于从进程, 到达同步点时,若ft一socket—listeiiLsyn为1,通过同步点,将ft_socket_listen_syn 清0 ,并从ft_socket_ret中读取返回值,若ft—socket—listen—syn为0 ,进入socket—wq 睡眠等待;改造sys一accept(), sys—accept()由监听进程调用,接收连接请求并创建新的 通信socket,根据ft—socket_executor区分主从进程,主进程调用sod^alloc()分 配新的socket结构,通过ops)accept()将新生成的socket转变为通信socket, 用ft—accept—socket保存其地址,并唤醒等待队列socket一wq中的从进程;从进 程根据ft一accept一socket是否为空判断到达顺序,从进程若先到达同步点,则进 入等待队列等待,若后到达同步点,则通过ft_accept—socket读取新创建的socket 与其建立联系;改造sys一connect(),根据ft—socket_executor区分主从进程执行不同的操作, 对于主进程,执行ops》connect请求连接,将返回值存入ft一socket—ret,将同步 位ftsocket—connect—syn置1,唤醒socket_wq等待队列中的从进程;对于从进 程,到达同步点时,若ft_socket—connect—syn为1,通过同步点,将 ft_socket_connect—syn清 0 , 并从 ft—socket—ret 中读取返回值,若 ft—socket—connect—syn为0,进入socket一wq睡眠等待;改造send()和writeO,这两个函数均可用于发送数据,在内核中最终都调 用一soc、sendmsg(),改造一sock^sendmsg()同时捕获两种调用方式,在内核堆 区为ft一msg一send分配空间用于存储供比较的数据包,根据ft_socket_executor 区分主从进程,从进程首先准备好需要发送的数据包struct msghdrmsg,将msg 拷贝入ft一msg一send指向的内存空间中,对ft_socket_write_syn置1,唤醒等待队列,自己进入等待队列睡眠;主进程到达同步点时,若ft_S0Cket—write_syn 为0,则进入等待队列等待,若ft一socket一write—syn为l,则将自己的数据包与 ft_msg_send指向的内存空间中的数据进行比较,并最终调用ops》sendmsg()发 送数据,将ft_SoCket_write_Syn清0,唤醒等待队列;其中需要比较的数据包含 msghdr结构中的所有内容,包括msg_name, msg—namelen, msg_iov, msg—iovlen, msg—control, msg一controllen, msg_flags;改造recv()和read(),这两个函数均用于接收数据,在内核中最终都调用 —sock一recvmsg(),改造—sock—recvmsg()同时捕获两种调用方式,在内核堆区 为ft一msg一recv分配空间用于存储供复制的数据包;根据ft—socket—executor区 分主从进程,主进程首先调用ops)recvmsg()接收数据存入struct msghdr msg 中,并将msg中的内容逐项拷贝入ft一msgjecv指向的内存空间中,将同步标 志位ft_socket—read—syn置1 ,并进入等待队列等待;从进程到达后从ft_msg_recv 指向的内存空间中将数据包拷贝入自己的struct msghdr msg中,包括msg—name, msg_namelen, msg一iov, msg_iovlen, msg—control, msg_controllen, msg_flags内容, 最后将ft—socket—read—syn清0,唤醒等待队列中的主进程;改造sys_close0,根据ft—socket—executor区分主从进程执行不同的操作, 对于主迸程,执行sock一close()释放socket,将同步位ft一socket一close一syn置1, 唤醒socket—wq等待队列中的从进程;对于从进程,到达同步点时,若 ft_socket_close_syn为 1, 通过同步点,将ft—socket—close_syn清0, 若 ft—socket_close—syn为0,进入socket—wq睡眠等待。
全文摘要
本发明公开了一种基于socket的容错计算机系统的网络同步方法。该方法通过修改Linux操作系统,在Linux网络体系结构的套接字接口层上建立监测器,对socket通信相关内核函数进行监控。当双模冗余进程通过socket方式进行网络通信时,在套接字接口层将其通信操作截获并触发同步逻辑。同步逻辑通过改造socket系列内核函数实现,双模进程在执行改造后的内核函数时进入同步点并完成同步过程。该方法无需特殊硬件定制,实现简单。改造后的操作系统适用于普通硬件架构,通用性强。同步流程由操作系统主动完成,对上层应用完全透明。具有好的可扩展性,可扩展至多模冗余系统。
文档编号H04L1/22GK101383690SQ20081023189
公开日2009年3月11日 申请日期2008年10月27日 优先权日2008年10月27日
发明者伍卫国, 孙江斌, 钊 王, 佳 田, 冰 胡, 董小社, 赵晓昳, 雷济凯 申请人:西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1