基于ARM-Linux嵌入式系统的多进程并发服务器设计

2014-09-23 03:19许文明
电子设计工程 2014年13期
关键词:描述符调用进程

许文明

(南华大学 网络信息中心,湖南 衡阳 421001)

基于ARM-Linux嵌入式系统的多进程并发服务器设计

许文明

(南华大学 网络信息中心,湖南 衡阳 421001)

随着物联网、智能电网、智能移动设备的发展,我们将能在任何时候任何地方获取我们所需的信息,本文设计一款基于ARM-Linux嵌入式系统的多进程并发服务器。它拥有传统服务器的功能,可远程访问和操作,同时又具有体积小、噪声低、低功耗、低成本的优势,非常适合用于智能楼宇的家用服务器。

物联网;ARM-Linux嵌入式系统;多进程并发服务器

目前大家所用的大多是X86服务器,其功能完善、运行速度快、软件支持性好等优点,已被人们普遍认同。但其由于价格昂贵、功耗高、噪声大等原因,一般只应用于工厂、企事业单位,但随着互连网的发展,我们需要更多的小型服务器终端,因此,低成本、低功耗的嵌入式服务器将有极大的应用空间。

面向连接的并发服务器是目前Linux网络服务器的主流形式。它采用主、从服务器的工作方式,能较好地解决了网络中客户进程的并发请求问题。目前在嵌入式领域,基于ARM技术的微处理器应用约占据了32位RISC微处理器80%以上的市场份额,同时,ARM处理器和嵌入式Linux的结合也正变得越来越紧密,在工业控制、消费类电子产品、通信系统、无线系统等各类产品市场都可以看到ARM与Linux相结合的身影[1]。因此,本文介绍了一种基于ARM-Linux嵌入式系统的多进程并发服务器设计。

1 并发服务器原理及框架

1.1 基本的C/S服务模型

相互通信的网络程序通常可以分为客户端和服务器端两部分[2]。简单的C/S服务模式客户端和服务器采用的是一对一的关系,而实际上一个客户同时可以与多个服务器通信,一个服务器同时也能与多个客户通信。

Linux下使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信[3],它分为服务器端和客户端两部分,如图1所示。服务器端与客户端连接的步骤如下:

图1 TCP服务器与客户端的连接Fig.1 server and client connection by TCP

1)使用socket()函数创建套接字;

2)将创那的套接字绑定到指定的地址结构

3)Listen()函数设置套接字为监听模式,使服务器进入被动打开的状态

4)接受客户端的连接请求,建立连接

5)终止连接

客户端实现步骤:

1)使用socket()函数创建套接字

2)调用connect()函数建立一个TCP服务器的连接

3)发送数据请求,接收服务器的数据应答

4)终止连接

这样就建立了最简单的C/S连接模式,而所有基于TCP套接字的网络服务也都是建立在这个基础上的

1.2 多进程并发服务器模型

前面介绍了简单的TCP客户端/服务器概念和连接,其中服务器每次只能处理一个客户的请求,它的实现虽然很简单但效率却很低,在实际应用中,这样的服务器是不能满足实际需求的。

在实际应用中为了让一个服务器同时为多个客户服务,处理多个客户的请求,那么就需要用并发服务器。Linux下主要支持的并发服务器有进程、线程。创建线程要比进程快,但一个进程内的所有线程共享相同的内存空间、全局变量等信息,所以当一个线程崩溃时,它会影响同一进程中的其他线程[4]。

Linux系统中可以同时存在多个进程,但相对线程来说,进程是独立的。它拥有独立的地址空间、执行堆栈、文件描述符等,在未经允许的情况下,一个进程不能访问另一个进程的资源,因此一个进程崩溃不会造成其他进程的崩溃。由于考虑远程监控系统要求的安全性和稳定性,本系统设计为多进程并发服务器。图2为并发服务器的基本模型图。

图2 并发服务器模型Fig.2 Model of concurrent server

1.3 多进程服务器原理

在多进程并发服务器中是通过调用fork或vfork函数来创建新进程。当父进程产生新的子进程后,父、子进程共享父进程在调用fork之前的所有描述符。接下来父进程只负责接收客户请求,而子进程只负责处理客户请求。

图3说明父进程调用fork生成子进程后,父、子进程对客户请求和描述符的操作过程。

1)当服务器调用accept()函数时,连接请求从客户到达服务器时双方状态。

2)当客户的请求被接受后。接下来服务器就会调用fork函数生成子进程。

3)最后父进程关闭已连接描述符,由子进程关闭监听描述符,这样既可以节省系统资源,又可以防止父、子进程同时对共享描述符进程操作。至此子进程处理与客户的连接,父进程可以对监听描述符再次调用accept,继续处理下一个客户的请求[5]。

图3 新进程连接状态图Fig.3 New process connection state

2 功能代码分析

网络主程序设计其实主要也就是父进程所执行的程序,程序设计的流程图如4所示。

图4 服务器程序流程图Fig.4 Program flow chart of server

linux中的网络编程通过socket接口实现。socket既是一种特殊的I/O,它也是一种文件描述符。一个完整的socket包括协议、本地地址、本地端口、远程地址、远程端口;每一个socket有一个本地的唯一socket号,由操作系统自动分配。以下是建立TCP socket,其中 AF_INET为 IPv4,SOCK_STREAM为TCP协议,如建立失败则返回-1。

listen_fd=socket(AF_INET,SOCK_STREAM,0)

调用bzero初始化套接字地址结构,并对地址结构中的成员赋值,代码如下。

为了给调用socket()函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系,就要用到绑定函数bind()。通过绑定后端口号保证了地址信息的唯一性。如失败返回-1。

当调用socket()函数创建一个套接字时,默认情况下它是一个主动套接字。所以对于TCP服务器,在绑定操作后,必须要调用listen()函数,将这个未连接的套接字转换。

成被动套接字,使它处在监听模式下,指示内核应接受发向该套接字的连接请求。在调用listen()函数后,服务器的状态从close转换到listen状态。Listen第二个状态字代表的是最大连接数,本系统设置的最大连接数为10。

接受客户连接,客户协议地址和长度省略接收,失败accept_fd=-1,置errno。如果建立连接,并且fork()=0,那么程序就进入子进程进行执行。

清除一个文件描述符集,并将一个新文件描述符加入文件描述符集中,其作用就是更新文件描述符。

函数select()是给出每个描述符我们所关心的条件:是否读描述符、是否想写描述符、是否描述符的异常条件。&tv指等待时间。FD_ISSET()测试该集中的一个给定位是否有变化、更新。

调用read()可以接收buffer数据缓冲区,1 024指接收数据缓冲区大小,n为接收字节数。

调用子程序modbus.c,执行相应操作,调用make_modbus_ack()生成回发数据,并通过send()回发给客户端。

3 ARM-Linux多进程服务移植与实现

3.1 程序编译移植

Makefile的作用就是让编译器知道要编译一个文件需要依赖哪些文件,同时当那些依赖文件更新时,编译器会自动发现最终生成的文件已经过时,而重新编译相应模块。Makefile定义了一系列规则来指定各文件,如依赖性、先后顺序及是否需要更新等。

编译译基于ARM的modbus网络程序如下图,首先我们看到文件夹里没有可执行文件arm-modbus-server,输入:#make

执行 Makefile文件,进行编译连接依赖文件:main.c、modbus.c、std_c.h。

然后生成我们所需要的文件arm-modbus-server。

3.2 并发服务器测试

本测试是基于ARM9的linux2.9内核平台。首先使用chmod修改arm-modbus-server执行权限,然后运行./armmodbus-server即服务器程序已经启动。

启用两个客户端通过IP访问服务器,可见如图5所示,已显示并发服务器运行正常。

图5 并发服务器测试Fig.5 Concurrent server test

4 结论

本文详细介绍了并发服务器的原理结构,分析了基于linux下的并发服务器程序代码,并且移植到ARM平台上运行,实现了小型嵌入式服务器的制作。这种低成本、低噪声、低功耗、高稳定性、高安全性的嵌入式服务器,将在我们信息化发展中的智能楼宇、智能家电、智能移动设备中获得应用。

[1]华清远见嵌入式培训中心.嵌入式Linux系统开发[M].北京:人民邮电出版社,2009.

[2]陈节省.面向嵌入式超声检测系统的图形接口设计与应用[D].哈尔滨:哈尔滨工业大学,2008.

[3]陈开.工业以太网的节点开发及通信协议研究[D].武汉:华中科技大学,2009.

[4]宁勇.基于ARM&Linux的大坝安全远程数据传输系统设计[D].长沙:湖南大学,2010.

[5]徐雷.基于Linux的无人机地面站设计与实现[D].广州:华南理工大学,2010.

[6]甘刚,闫丽丽,盛志伟.Linux/UNIX网络编程[M].北京:中国水利水电出版社,2008.

Design of the multi process concurrent server based on ARM-Linux embedded system

XU Wen-ming
(Network Information Center,University of South China,Hengyang 421001,China)

With the Internet of Things,smart grid,smart mobile devices development,we will be able to get information we need in anywhere at any time,we design an embedded system based on ARM-Linux multi-process concurrent server.it has a traditional server features that can remotely access and operate,but also has a small volume,low noise,low power,low cost advantage,is very suitable for intelligent building home server.

Internet of Things;embedded system based on ARM-Linux;multi-process concurrent server

TP368

A

1674-6236(2014)13-001-03

2013-10-11 稿件编号:201310050

湖南省教育厅科研课题项目(09C862)

许文明(1966—),男,湖南衡阳人,工程师。研究方向:计算机应用及开发。

猜你喜欢
描述符调用进程
基于结构信息的异源遥感图像局部特征描述符研究
基于AKAZE的BOLD掩码描述符的匹配算法的研究
核电项目物项调用管理的应用研究
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
LabWindows/CVI下基于ActiveX技术的Excel调用
Linux单线程并发服务器探索
基于系统调用的恶意软件检测技术研究
特征联合和旋转不变空间分割联合的局部图像描述符
社会进程中的新闻学探寻