APP下载

Linux下多进程编程在海洋环境信息系统中的应用*

2015-03-15赵美珍

舰船电子工程 2015年12期
关键词:间通信共享内存网络通信

赵美珍

(中国舰船研究设计中心 武汉 430064)



Linux下多进程编程在海洋环境信息系统中的应用*

赵美珍

(中国舰船研究设计中心 武汉 430064)

介绍了Linux操作系统下进程的数据结构,多进程编程的应用方法,包括进程状态的管理及进程间相互通信机制。分析了多进程在该系统中应用的必要性,设计了多进程编程在系统人机交互界面与网络通信中具体实现方案,解决了系统中网络通信阻塞与人机交互界面显示间的制约矛盾,通过进程间通信实现了经网络获取的基础导航数据实时动态显示的功能。实验测试表明达到了良好的界面显示与网络通信并存的效果。

海洋环境信息系统; Linux; 多进程; 网络通信

Class Number TP316.8

1 引言

近年来,操作系统Windows一统天下的局面正在逐渐被Linux打破,Linux操作系统正以其独特的魅力得到越来越多使用者的青睐。在Linux操作系统下开发应用程序不但会获得较高的运行效率,而且可通过较小的投入获得较大的收益。

目前,某海洋环境信息系统就是在该平台下实现的。海洋环境信息应用系统集成海洋中温度、盐度、密度、声场、海流、潮汐、水深、底质等诸多信息,为船舶航行、操纵等活动提供必要的支持和保障。由于海洋信息的复杂多样性以及信息传输要求的高效性,对信息的处理能力将是选用操作系统的一项重要参考。使用Linux这样一个功能强大的多用户多任务网络操作系统环境,开发应用程序对海洋信息的处理成为了可能。

2 Linux进程数据结构及基本进程函数库

2.1 Linux进程数据结构分析

进程是程序执行的基本单位,它是特定程序的个体实例化。按照Linux的定义,进程就是处于执行期的程序。进程并不是仅指一段可执行的代码,通常还包括一些资源,如打开的文件,进程的地址空间处理器状态、寄存器的内容等[1~2]。

Linux内核利用一个数据结构代表一个进程。在该结构中保存进程的属性和其他信息。在此对比较重要的域进行分析。

1) volatile long state:用于保存进程的状态,在进程的生命期内,可以从该域获得自己的状态。

2) struct thread_info *thread_info:当前进程的一些运行环境信息。

3) int prio,static_prio:prio表示优先级,static_prio表示静态优先级。

4) struct list_head run_list:表示运行队列,在该队列中包含所有可运行的进程。

5) int exit_code,exit_signal:分别用于存放进程的退出值和终止信号,是将子进程的退出值传给父进程的方式。

6) pid_t pid:进程的唯一标识符。

7) struct task_struct*real_parent:用于标识该进程的父进程的描述符。若该进程的父进程已经死亡,那么该域将指向init()的进程描述符。

8) struct list_head children:指向该进程的子进程的列表。

9) uid_t uid,euid,suid,fsuid:uid用于保存创建该进程的用户的ID。

在Linux中,内核将这些结构体用两种方式组织起来:(1)用一个哈希表的形式,(2)用一个双向循环链表将所有task_struct组织起来。

2.2 Linux基本进程函数库

1) 启动新进程

int system(const char*string)。

2) 替换进程映像

exec函数系列由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。一个exec函数可以把当前进程替换为一个新进程。

3) 复制进程映像

图1 复制进程映像过程

fork()函数,实现复制进程映像。在父进程中的fork()调用返回的是新进程的子进程的PID。新进程将继续执行,就像原进程一样,不同之处在于,子进程中的fork调用返回的是0。父子进程可以通过这一点来判断究竟谁是父进程,谁是子进程。具体实现流程如图1所示。

4) 等待一个进程

可以通过在父进程中调用wait函数让父进程等待子进程的结束。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态[3~5]。

3 常用的进程间通信技术

Linux系统中常用的进程通信机制包括管道、信号量、共享内存和消息队列[2,7]。下面分别进行介绍。

3.1 管道

管道是许多应用程序的基本构建模块。管道是半双工的,数据只能向一个方向流动,如需要双向通信时,需建立两个管道。管道对于管道两端的进程而言,单独构成一个文件系统。它们的数据是一个字节流,类似于TCP连接。在某一进程往管道中写入数据前,要求另外某一进程在该管道上等待数据的到达,如果读出者不存在,则先有写入者是没有意义的。

3.2 信号量

为了防止多个程序同时访问一个共享资源,通过生成并使用令牌来授权,即在任一时刻只能有一个执行线程访问代码的临界区域。常使用信号量完成这种对资源访问的管理。

3.3 共享内存

共享内存允许两个不相关的进程访问同一逻辑内存。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。共享内存是有IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的地址。如果一个进程更新了其中的数据,其他的进程会立即更新[6]。

3.4 消息队列

消息队列可以认为是一个消息链表。有足够写权限的进程可往队列中写入消息,有足够读权限的进程可从队列中读出消息。每个消息是一个记录,它由发送者赋予一个优先级。一个进程可往某一队列中写入消息后终止,让另一个进程在后某个时刻读出这些消息。这跟管道是相反的[8]。

在上述四种进程间通信技术中,每种技术都有自己的特点和使用范围,可以根据需求进行选择应用。

4 多进程在海洋环境信息系统中的需求与设计

4.1 多进程应用在本系统应用中的必要性

海洋环境信息系统主要由终端显示处理器和网络通信子系统构成。系统终端显示器完成人机交互功能,实现对多种海洋信息查询和航海作业操作。

为提高海洋环境信息系统处理性能,从以下几方面因素考虑,采用多进程并发处理是比较合适的。

1) 时间因素。网络通信通常要求系统能并发处理多种任务,而串行处理必然降低系统资源利用率和处理效率。

2) 应用处理对象因素。海洋信息种类繁多,需进行大量信息数据库操作,如批量数据装载、海量数据的查询统计等,其主要瓶颈为I/O,启用多进程无助于性能改善。相应的,如果应用存在大量计算处理,则采用多个进程并行处理可提高性能。

3) 网络实现机制因素。基于TCP/IP协议族的socket网络编程默认状态是阻塞的。阻塞机制是为防止进程在等待中通过循环反复查询某一条件造成系统资源的浪费[9]。虽然可以使用fcntl()函数使其成为非阻塞的socket,但由于海洋环境信息系统终端显示处理器要处理及管理众多信息,与外部进行网络通信只是其部分功能,为对系统资源的合理分配利用,可以选择阻塞socket。而阻塞的socket又带来一定的不足,它使人机交互界面无法显示。而使用多进程将可以很好地解决该问题。

4) 开发环境因素。本实例Linux操作系统。

该系统是一个多用户、多任务、交互式的网络操作系统,其开发环境支持子进程的创建,而且实现较为容易。

4.2 多进程编程在本系统中设计方案

基于以上分析,系统各进程功能独立,需求时能相互通信是最理想状态。

图2 系统多进程的父子关系图

1) 系统多进程方案

在系统设计中,采用了树形结构进行复制进程映像操作。将人机交互界面作为程序主进程,网络通信部分作为它的子进程。又对网络传输的不同信息进行多次复制进程映像操作,从而形成多种网络信息处理进程。其结构简意图如图2所示。

2) 系统多进程通信机制

系统人机交互界面与网络通信间的关系主要是将经网络获取的导航信息及部分海洋环境信息实时显示在人机交互界面的动态显示区。由多进程方案设计可以知道两者是处于不同的进程,此时是需要进程间通信的。经仔细分析以上几种进程间通信机制,选择共享内存方式实现窗口显示与网络通信的信息交互比较合适的。

图3 海洋环境信息系统人机交互界面图

3) 进程状态的管理及资源的回收

通过上述相关方案设计,可以解决网络通信阻塞与人机交互界面显示间的制约矛盾,并能很好地对各种海洋环境信息进行处理。但因网络信息的动态性,将产生大量僵尸进程。因此,进程的管理及资源的回收是系统多进程应用设计所必须考虑的问题。

对进程状态的管理设计如下操作。在系统应用主程序中设置信号处理函数。当子进程结束时系统捕获该信号并进行相应处理。具体设计如下:在应用主程序中使用signal(SIGCHLD,ClearChild);语句。当系统收到SIGCHLD信号后调用ClearChild函数。而在ClearChild函数内部又调用waitpid函数(wait函数族中的一个)来收集子进程信息,从而避免僵尸进程的产生。

5 多进程在海洋环境信息系统中的实现

系统采用如上所述的多进程方案,通过网络技术将现场传感器获取的基本导航信息和海域环境信息传送给终端显示处理器。在通信子进程中进行解析处理,利用共享内存的进程间通信机制将基本导航信息及部分海洋环境信息实时显示。

表1 测试数据列表

为确认多进程方案在海洋环境信息系统中解决问题的处理能力,进行了以VxWorks 5.4为客户端的网络测试,其测试结果如表1所示。可以看到发送时间间隔的减小,数据包的增大,会带来一定量的丢包率。但从系统硬件设备及网络应用协议因素等方面考虑,系统是满足性能要求的。

6 结语

本文通过多进程编程在海洋环境信息系统中的应用,解决了海洋环境信息系统人机交互界面与网络通信并行工作问题,实现了人机交互界面上实时显示网络获取的基础导航数据。通过对系统的测试,发现其运行效率、稳定性和可靠性都比较高,达到令人满意的效果。实验证明,该方案是行之有效的。

[1] 吴国伟,李张,任广臣.Linux内核分析及高级编程[M].北京:电子工业出版社,2008:11-20.

[2] 毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001:21-30.

[3] 陈健,宋健建.Linux程序设计[M].第3版.北京:人民邮电出版社,2007:36-40.

[4] 朱珂.Linux编程白皮书[M].北京:机械工业出版社,2000:9-11.

[5] 刘军.UNIX环境下的多进程编程[J].电脑知识与技术,2008,2:265-267.

[6] 王文启,韩秀玲,孙波.基于MiniGUI的多进程图形用户界面的研究[J].微计算机信息,2007,23:78-80.

[7] 程树良.UNIX下的多进程及进程间的通信[J].交通与计算机,2000,2:40-2.

[8] 胡英楣,沈文海,宋之光.多进程并发在国内气象通信系统的应用[J].应用气象学报,2007,12:878-885.

[9] 陈远森,邓可.UNIX网络实用编程技术[M].北京:水利水电出版社,2000:31-40.

[10] 高峰.基于Linux的船用海洋环境数据库系统设计与实现[D].哈尔滨:哈尔滨工程大学硕士学位论文,2008:8-17,19-38,48-57.

[11] 许兆新,方明,徐婧.基于国际标准的电子海图显示系统设计[J].计算机与数字工程,2005,33(9):93-96.

The Application of Multi-Processes Programming under Linux in the Information System of the Ocean Environment

ZHAO Meizhen

(China Ship Development and Design Center, Wuhan 430064)

This paper introduced the structure of a process under Linux operation system and the method of multi-processes programming. It included the management of the statement of a process and the inter-process communication. It analyzed the necessaries of multi-processes programming to the Information System of the Ocean Environment(ISOE) and designed the implementation of Multi-Processes programming between man-machine mutual interface and net communication. It solved the conflicts between net communication blocking and man-machine mutual interface showing. Meanwhile it accomplished the basic navigation data got by net communication showing in real-time by inter-process communication. Testes showed the application could make ISOE work well by good man-machine mutual interface and net communication.

information system of the ocean environment, Linux, multi-processes, net communication

2015年6月17日,

2015年7月31日

赵美珍,女,硕士,工程师,研究方向:船舶导航系统设计。

TP316.8

10.3969/j.issn.1672-9730.2015.12.029

猜你喜欢

间通信共享内存网络通信
细胞间通信预测方法研究进展
通过QT实现进程间的通信
基于网络通信的智能照明系统设计
综合航电分区间通信元模型设计研究
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
基于PCI总线的多处理器协同机制研究
QNX下PEX8311多路实时数据采集的驱动设计
一种高效RTAI 共享内存管理层的研究与实现*