<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

          摘要:隨著、智能電網(wǎng)、智能移動(dòng)設(shè)備的發(fā)展,我們將能在任何時(shí)候任何地方獲取我們所需的信息,本文設(shè)計(jì)一款基于。它擁有傳統(tǒng)服務(wù)器的功能,可遠(yuǎn)程訪問和操作,同時(shí)又具有體積小、噪聲低、低功耗、低成本的優(yōu)勢(shì),非常適合用于智能樓宇的家用服務(wù)器。

          本文引用地址:http://www.ex-cimer.com/article/201609/304671.htm

          目前大家所用的大多是X86服務(wù)器,其功能完善、運(yùn)行速度快、軟件支持性好等優(yōu)點(diǎn),已被人們普遍認(rèn)同。但其由于價(jià)格昂貴、功耗高、噪聲大等原因,一般只應(yīng)用于工廠、企事業(yè)單位,但隨著互連網(wǎng)的發(fā)展,我們需要更多的小型服務(wù)器終端,因此,低成本、低功耗的嵌入式服務(wù)器將有極大的應(yīng)用空間。

          面向連接的并發(fā)服務(wù)器是目前Linux網(wǎng)絡(luò)服務(wù)器的主流形式。它采用主、從服務(wù)器的工作方式,能較好地解決了網(wǎng)絡(luò)中客戶進(jìn)程的并發(fā)請(qǐng)求問題。目前在嵌入式領(lǐng)域,基于ARM技術(shù)的微處理器應(yīng)用約占據(jù)了32位RISC微處理器80%以上的市場(chǎng)份額,同時(shí),ARM處理器和嵌入式Linux的結(jié)合也正變得越來(lái)越緊密,在工業(yè)控制、消費(fèi)類電子產(chǎn)品、通信系統(tǒng)、無(wú)線系統(tǒng)等各類產(chǎn)品市場(chǎng)都可以看到ARM與Linux相結(jié)合的身影。因此,本文介紹了一種基于設(shè)計(jì)。

          1 并發(fā)服務(wù)器原理及框架

          1. 1 基本的C/S服務(wù)模型

          相互通信的網(wǎng)絡(luò)程序通??梢苑譃榭蛻舳撕头?wù)器端兩部分。簡(jiǎn)單的C/S服務(wù)模式客戶端和服務(wù)器采用的是一對(duì)一的關(guān)系,而實(shí)際上一個(gè)客戶同時(shí)可以與多個(gè)服務(wù)器通信,一個(gè)服務(wù)器同時(shí)也能與多個(gè)客戶通信。

          Linux下使用TCP套接字編程可以實(shí)現(xiàn)基于TCP/IP協(xié)議的面向連接的通信,它分為服務(wù)器端和客戶端兩部分,如圖1所示。

          基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          服務(wù)器端與客戶端連接的步驟如下:

          1)使用socket0函數(shù)創(chuàng)建套接字;

          2)將創(chuàng)那的套接字綁定到指定的地址結(jié)構(gòu)

          3)Listen0函數(shù)設(shè)置套接字為監(jiān)聽模式,使服務(wù)器進(jìn)入被動(dòng)打開的狀態(tài)

          4)接受客戶端的連接請(qǐng)求,建立連接

          5)終止連接

          客戶端實(shí)現(xiàn)步驟:

          1)使用socket0函數(shù)創(chuàng)建套接字

          2)調(diào)用connect0函數(shù)建立一個(gè)TCP服務(wù)器的連接

          3)發(fā)送數(shù)據(jù)請(qǐng)求,接收服務(wù)器的數(shù)據(jù)應(yīng)答

          4)終止連接

          這樣就建立了最簡(jiǎn)單的C/S連接模式,而所有基于TCP套接字的網(wǎng)絡(luò)服務(wù)也都是建立在這個(gè)基礎(chǔ)上的。

          1.2 模型

          前面介紹了簡(jiǎn)單的TCP客戶端/服務(wù)器概念和連接,其中服務(wù)器每次只能處理一個(gè)客戶的請(qǐng)求,它的實(shí)現(xiàn)雖然很簡(jiǎn)單但效率卻很低,在實(shí)際應(yīng)用中,這樣的服務(wù)器是不能滿足實(shí)際需求的。

          在實(shí)際應(yīng)用中為了讓一個(gè)服務(wù)器同時(shí)為多個(gè)客戶服務(wù),處理多個(gè)客戶的請(qǐng)求,那么就需要用并發(fā)服務(wù)器。Linux下主要支持的并發(fā)服務(wù)器有進(jìn)程、線程。創(chuàng)建線程要比進(jìn)程快,但一個(gè)進(jìn)程內(nèi)的所有線程共享相同的內(nèi)存空間、全局變量等信息,所以當(dāng)一個(gè)線程崩潰時(shí),它會(huì)影響同一進(jìn)程中的其他線程。

          Linux系統(tǒng)中可以同時(shí)存在多個(gè)進(jìn)程,但相對(duì)線程來(lái)說(shuō),進(jìn)程是獨(dú)立的。它擁有獨(dú)立的地址空間、執(zhí)行堆棧、文件描述符等,在未經(jīng)允許的情況下,一個(gè)進(jìn)程不能訪問另一個(gè)進(jìn)程的資源,因此一個(gè)進(jìn)程崩潰不會(huì)造成其他進(jìn)程的崩潰。由于考慮遠(yuǎn)程監(jiān)控系統(tǒng)要求的安全性和穩(wěn)定性,本系統(tǒng)設(shè)計(jì)為多進(jìn)程并發(fā)服務(wù)器。圖2為并發(fā)服務(wù)器的基本模型圖。

          基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          1.3 多進(jìn)程服務(wù)器原理

          在多進(jìn)程并發(fā)服務(wù)器中是通過調(diào)用fork或vfork函數(shù)來(lái)創(chuàng)建新進(jìn)程。當(dāng)父進(jìn)程產(chǎn)生新的子進(jìn)程后,父、子進(jìn)程共享父進(jìn)程在調(diào)用fork之前的所有描述符。接下來(lái)父進(jìn)程只負(fù)責(zé)接收客戶請(qǐng)求,而子進(jìn)程只負(fù)責(zé)處理客戶請(qǐng)求。

          圖3說(shuō)明父進(jìn)程調(diào)用fork生成子進(jìn)程后,父、子進(jìn)程對(duì)客戶請(qǐng)求和描述符的操作過程。

          基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          1)當(dāng)服務(wù)器調(diào)用accept0函數(shù)時(shí),連接請(qǐng)求從客戶到達(dá)服務(wù)器時(shí)雙方狀態(tài)。

          2)當(dāng)客戶的請(qǐng)求被接受后。接下來(lái)服務(wù)器就會(huì)調(diào)用fork函數(shù)生成子進(jìn)程。

          3)最后父進(jìn)程關(guān)閉已連接描述符,由子進(jìn)程關(guān)閉監(jiān)聽描述符,這樣既可以節(jié)省系統(tǒng)資源,又可以防止父、子進(jìn)程同時(shí)對(duì)共享描述符進(jìn)程操作。至此子進(jìn)程處理與客戶的連接,父進(jìn)程可以對(duì)監(jiān)聽描述符再次調(diào)用accept,繼續(xù)處理下一個(gè)客戶的請(qǐng)求。

          2 功能代碼分析

          網(wǎng)絡(luò)主程序設(shè)計(jì)其實(shí)主要也就是父進(jìn)程所執(zhí)行的程序,程序設(shè)計(jì)的流程圖如4所示。

          基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)

          linux中的網(wǎng)絡(luò)編程通過socket接口實(shí)現(xiàn)。socket既是一種特殊的I/O,它也是一種文件描述符。一個(gè)完整的socket包括協(xié)議、本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口;每一個(gè)socket有一個(gè)本地的唯一socket號(hào),由操作系統(tǒng)自動(dò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),并對(duì)地址結(jié)構(gòu)中的成員賦值,代碼如下。

          bzero(client_addr,sizeof(struct sockaddr_in));

          client_addr.sin_family=AF_INET;

          client_addr.sin_port=htons(MY_PORT);

          client_addr.sin_addr.s_addr=htonl(INADDR_ANY);

          為了給調(diào)用socket0函數(shù)產(chǎn)生的套接字分配一個(gè)本地協(xié)議地址,建立地址與套接字的對(duì)應(yīng)關(guān)系,就要用到綁定函數(shù)bind0。通過綁定后端口號(hào)保證了地址信息的唯一性。如失敗返回-1。


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();