許文明
(南華大學 網(wǎng)絡(luò)信息中心,湖南 衡陽 421001)
基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計
許文明
(南華大學 網(wǎng)絡(luò)信息中心,湖南 衡陽 421001)
隨著物聯(lián)網(wǎng)、智能電網(wǎng)、智能移動設(shè)備的發(fā)展,我們將能在任何時候任何地方獲取我們所需的信息,本文設(shè)計一款基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器。它擁有傳統(tǒng)服務(wù)器的功能,可遠程訪問和操作,同時又具有體積小、噪聲低、低功耗、低成本的優(yōu)勢,非常適合用于智能樓宇的家用服務(wù)器。
物聯(lián)網(wǎng);ARM-Linux嵌入式系統(tǒng);多進程并發(fā)服務(wù)器
目前大家所用的大多是X86服務(wù)器,其功能完善、運行速度快、軟件支持性好等優(yōu)點,已被人們普遍認同。但其由于價格昂貴、功耗高、噪聲大等原因,一般只應(yīng)用于工廠、企事業(yè)單位,但隨著互連網(wǎng)的發(fā)展,我們需要更多的小型服務(wù)器終端,因此,低成本、低功耗的嵌入式服務(wù)器將有極大的應(yīng)用空間。
面向連接的并發(fā)服務(wù)器是目前Linux網(wǎng)絡(luò)服務(wù)器的主流形式。它采用主、從服務(wù)器的工作方式,能較好地解決了網(wǎng)絡(luò)中客戶進程的并發(fā)請求問題。目前在嵌入式領(lǐng)域,基于ARM技術(shù)的微處理器應(yīng)用約占據(jù)了32位RISC微處理器80%以上的市場份額,同時,ARM處理器和嵌入式Linux的結(jié)合也正變得越來越緊密,在工業(yè)控制、消費類電子產(chǎn)品、通信系統(tǒng)、無線系統(tǒng)等各類產(chǎn)品市場都可以看到ARM與Linux相結(jié)合的身影[1]。因此,本文介紹了一種基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計。
相互通信的網(wǎng)絡(luò)程序通常可以分為客戶端和服務(wù)器端兩部分[2]。簡單的C/S服務(wù)模式客戶端和服務(wù)器采用的是一對一的關(guān)系,而實際上一個客戶同時可以與多個服務(wù)器通信,一個服務(wù)器同時也能與多個客戶通信。
Linux下使用TCP套接字編程可以實現(xiàn)基于TCP/IP協(xié)議的面向連接的通信[3],它分為服務(wù)器端和客戶端兩部分,如圖1所示。服務(wù)器端與客戶端連接的步驟如下:
圖1 TCP服務(wù)器與客戶端的連接Fig.1 server and client connection by TCP
1)使用socket()函數(shù)創(chuàng)建套接字;
2)將創(chuàng)那的套接字綁定到指定的地址結(jié)構(gòu)
3)Listen()函數(shù)設(shè)置套接字為監(jiān)聽模式,使服務(wù)器進入被動打開的狀態(tài)
4)接受客戶端的連接請求,建立連接
5)終止連接
客戶端實現(xiàn)步驟:
1)使用socket()函數(shù)創(chuàng)建套接字
2)調(diào)用connect()函數(shù)建立一個TCP服務(wù)器的連接
3)發(fā)送數(shù)據(jù)請求,接收服務(wù)器的數(shù)據(jù)應(yīng)答
4)終止連接
這樣就建立了最簡單的C/S連接模式,而所有基于TCP套接字的網(wǎng)絡(luò)服務(wù)也都是建立在這個基礎(chǔ)上的
前面介紹了簡單的TCP客戶端/服務(wù)器概念和連接,其中服務(wù)器每次只能處理一個客戶的請求,它的實現(xiàn)雖然很簡單但效率卻很低,在實際應(yīng)用中,這樣的服務(wù)器是不能滿足實際需求的。
在實際應(yīng)用中為了讓一個服務(wù)器同時為多個客戶服務(wù),處理多個客戶的請求,那么就需要用并發(fā)服務(wù)器。Linux下主要支持的并發(fā)服務(wù)器有進程、線程。創(chuàng)建線程要比進程快,但一個進程內(nèi)的所有線程共享相同的內(nèi)存空間、全局變量等信息,所以當一個線程崩潰時,它會影響同一進程中的其他線程[4]。
Linux系統(tǒng)中可以同時存在多個進程,但相對線程來說,進程是獨立的。它擁有獨立的地址空間、執(zhí)行堆棧、文件描述符等,在未經(jīng)允許的情況下,一個進程不能訪問另一個進程的資源,因此一個進程崩潰不會造成其他進程的崩潰。由于考慮遠程監(jiān)控系統(tǒng)要求的安全性和穩(wěn)定性,本系統(tǒng)設(shè)計為多進程并發(fā)服務(wù)器。圖2為并發(fā)服務(wù)器的基本模型圖。
圖2 并發(fā)服務(wù)器模型Fig.2 Model of concurrent server
在多進程并發(fā)服務(wù)器中是通過調(diào)用fork或vfork函數(shù)來創(chuàng)建新進程。當父進程產(chǎn)生新的子進程后,父、子進程共享父進程在調(diào)用fork之前的所有描述符。接下來父進程只負責接收客戶請求,而子進程只負責處理客戶請求。
圖3說明父進程調(diào)用fork生成子進程后,父、子進程對客戶請求和描述符的操作過程。
1)當服務(wù)器調(diào)用accept()函數(shù)時,連接請求從客戶到達服務(wù)器時雙方狀態(tài)。
2)當客戶的請求被接受后。接下來服務(wù)器就會調(diào)用fork函數(shù)生成子進程。
3)最后父進程關(guān)閉已連接描述符,由子進程關(guān)閉監(jiān)聽描述符,這樣既可以節(jié)省系統(tǒng)資源,又可以防止父、子進程同時對共享描述符進程操作。至此子進程處理與客戶的連接,父進程可以對監(jiān)聽描述符再次調(diào)用accept,繼續(xù)處理下一個客戶的請求[5]。
圖3 新進程連接狀態(tài)圖Fig.3 New process connection state
網(wǎng)絡(luò)主程序設(shè)計其實主要也就是父進程所執(zhí)行的程序,程序設(shè)計的流程圖如4所示。
圖4 服務(wù)器程序流程圖Fig.4 Program flow chart of server
linux中的網(wǎng)絡(luò)編程通過socket接口實現(xiàn)。socket既是一種特殊的I/O,它也是一種文件描述符。一個完整的socket包括協(xié)議、本地地址、本地端口、遠程地址、遠程端口;每一個socket有一個本地的唯一socket號,由操作系統(tǒng)自動分配。以下是建立TCP socket,其中 AF_INET為 IPv4,SOCK_STREAM為TCP協(xié)議,如建立失敗則返回-1。
listen_fd=socket(AF_INET,SOCK_STREAM,0)
調(diào)用bzero初始化套接字地址結(jié)構(gòu),并對地址結(jié)構(gòu)中的成員賦值,代碼如下。
為了給調(diào)用socket()函數(shù)產(chǎn)生的套接字分配一個本地協(xié)議地址,建立地址與套接字的對應(yīng)關(guān)系,就要用到綁定函數(shù)bind()。通過綁定后端口號保證了地址信息的唯一性。如失敗返回-1。
當調(diào)用socket()函數(shù)創(chuàng)建一個套接字時,默認情況下它是一個主動套接字。所以對于TCP服務(wù)器,在綁定操作后,必須要調(diào)用listen()函數(shù),將這個未連接的套接字轉(zhuǎn)換。
成被動套接字,使它處在監(jiān)聽模式下,指示內(nèi)核應(yīng)接受發(fā)向該套接字的連接請求。在調(diào)用listen()函數(shù)后,服務(wù)器的狀態(tài)從close轉(zhuǎn)換到listen狀態(tài)。Listen第二個狀態(tài)字代表的是最大連接數(shù),本系統(tǒng)設(shè)置的最大連接數(shù)為10。
接受客戶連接,客戶協(xié)議地址和長度省略接收,失敗accept_fd=-1,置errno。如果建立連接,并且fork()=0,那么程序就進入子進程進行執(zhí)行。
清除一個文件描述符集,并將一個新文件描述符加入文件描述符集中,其作用就是更新文件描述符。
函數(shù)select()是給出每個描述符我們所關(guān)心的條件:是否讀描述符、是否想寫描述符、是否描述符的異常條件。&tv指等待時間。FD_ISSET()測試該集中的一個給定位是否有變化、更新。
調(diào)用read()可以接收buffer數(shù)據(jù)緩沖區(qū),1 024指接收數(shù)據(jù)緩沖區(qū)大小,n為接收字節(jié)數(shù)。
調(diào)用子程序modbus.c,執(zhí)行相應(yīng)操作,調(diào)用make_modbus_ack()生成回發(fā)數(shù)據(jù),并通過send()回發(fā)給客戶端。
Makefile的作用就是讓編譯器知道要編譯一個文件需要依賴哪些文件,同時當那些依賴文件更新時,編譯器會自動發(fā)現(xiàn)最終生成的文件已經(jīng)過時,而重新編譯相應(yīng)模塊。Makefile定義了一系列規(guī)則來指定各文件,如依賴性、先后順序及是否需要更新等。
編譯譯基于ARM的modbus網(wǎng)絡(luò)程序如下圖,首先我們看到文件夾里沒有可執(zhí)行文件arm-modbus-server,輸入:#make
執(zhí)行 Makefile文件,進行編譯連接依賴文件:main.c、modbus.c、std_c.h。
然后生成我們所需要的文件arm-modbus-server。
本測試是基于ARM9的linux2.9內(nèi)核平臺。首先使用chmod修改arm-modbus-server執(zhí)行權(quán)限,然后運行./armmodbus-server即服務(wù)器程序已經(jīng)啟動。
啟用兩個客戶端通過IP訪問服務(wù)器,可見如圖5所示,已顯示并發(fā)服務(wù)器運行正常。
圖5 并發(fā)服務(wù)器測試Fig.5 Concurrent server test
本文詳細介紹了并發(fā)服務(wù)器的原理結(jié)構(gòu),分析了基于linux下的并發(fā)服務(wù)器程序代碼,并且移植到ARM平臺上運行,實現(xiàn)了小型嵌入式服務(wù)器的制作。這種低成本、低噪聲、低功耗、高穩(wěn)定性、高安全性的嵌入式服務(wù)器,將在我們信息化發(fā)展中的智能樓宇、智能家電、智能移動設(shè)備中獲得應(yīng)用。
[1]華清遠見嵌入式培訓中心.嵌入式Linux系統(tǒng)開發(fā)[M].北京:人民郵電出版社,2009.
[2]陳節(jié)省.面向嵌入式超聲檢測系統(tǒng)的圖形接口設(shè)計與應(yīng)用[D].哈爾濱:哈爾濱工業(yè)大學,2008.
[3]陳開.工業(yè)以太網(wǎng)的節(jié)點開發(fā)及通信協(xié)議研究[D].武漢:華中科技大學,2009.
[4]寧勇.基于ARM&Linux的大壩安全遠程數(shù)據(jù)傳輸系統(tǒng)設(shè)計[D].長沙:湖南大學,2010.
[5]徐雷.基于Linux的無人機地面站設(shè)計與實現(xiàn)[D].廣州:華南理工大學,2010.
[6]甘剛,閆麗麗,盛志偉.Linux/UNIX網(wǎng)絡(luò)編程[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—),男,湖南衡陽人,工程師。研究方向:計算機應(yīng)用及開發(fā)。