发明名称 一种基于socket的容错计算机系统的网络同步方法
摘要 本发明公开了一种基于socket的容错计算机系统的网络同步方法。该方法通过修改Linux操作系统,在Linux网络体系结构的套接字接口层上建立监测器,对socket通信相关内核函数进行监控。当双模冗余进程通过socket方式进行网络通信时,在套接字接口层将其通信操作截获并触发同步逻辑。同步逻辑通过改造socket系列内核函数实现,双模进程在执行改造后的内核函数时进入同步点并完成同步过程。该方法无需特殊硬件定制,实现简单。改造后的操作系统适用于普通硬件架构,通用性强。同步流程由操作系统主动完成,对上层应用完全透明。具有好的可扩展性,可扩展至多模冗余系统。
申请公布号 CN101383690B 申请公布日期 2011.06.01
申请号 CN200810231895.4 申请日期 2008.10.27
申请人 西安交通大学 发明人 董小社;胡冰;孙江斌;王钊;赵晓昳;伍卫国;田佳;雷济凯
分类号 H04L1/22(2006.01)I;H04L7/00(2006.01)I 主分类号 H04L1/22(2006.01)I
代理机构 西安通大专利代理有限责任公司 61200 代理人 张震国
主权项 一种基于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(),对以上内核函数设置监测,一旦内核函数被双模冗余进程调用则触发同步逻辑;在内核中添加同步用数据结构和同步项,定义等待队列socket_wq,到达同步点尚未完成同步的任务在此等待队列中睡眠等待,定义数据结构structft_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结构的指针;其具体步骤如下: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(),对于发送过程,从进程到达同步点后,在内核堆区申请临时空间存储待发送的数据包,主进程到达后,将自身待发送数据包与从进程存储的数据包进行比较,若数据相同则执行发送,若不同则触发出错处理;对于接收过程,主进程到达同步点后,调用接收函数接收数据包,并在内核堆区申请空间将数据包复制并存储,从进程到达后从内核堆区将数据包拷贝到本进程的地址空间。
地址 710049 陕西省西安市咸宁路28号