導航:首頁 > 編程系統 > linux進程池實現

linux進程池實現

發布時間:2023-09-09 19:43:17

linux socket編程 麻煩達人給一下程序的注釋

客戶端:
int main()
{ int sockfd;//sokce fd 可以man socket 看socket();這個函數的原型
int len;
struct sockaddr_in address;//connect的函數參數,主要是伺服器的ip和埠
int result;
char ch = `A`;//發送的消息
sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; //創建socket
address.sin_addr.s_addr = inet_addr(「127.0.0.1」);//設置伺服器的ip地址
address.sin_port = 9734;//設置埠
len = sizeof(address); //傳給connect函數的長度

result = connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1) {//連接到伺服器,成功返回0,注意這里是阻塞方式
peror(「oops:client1」);
exit(1); }
write(sockfd,&ch,1); //往伺服器發送消息
read(sockfd,&ch,1);//從伺服器讀回消息,存放到ch
printf(「char from server = c\n」,ch);//讀回的消息,列印
close(sockfd);
exit(0); }

伺服器端:

#include<sys/types.h> #include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>

int main()
{ int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET,SOCK_STEAM,0);
server_address.sun_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(「127.0.0.1」);
server_address.sin_port = 9734;
server_len = sizeof(server_address);

上面部分從簡
bind(server_sockfd,(struct sockaddr *)&server_address,server_len); //綁定埠和ip,

listen(server_sockfd,5);//伺服器開始監聽埠
while(1){
char ch;
printf(『server waiting\n」);
client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr*)
&client_address,&client_len);//開始等待客戶端連接,如果沒有,則阻塞

read(client_sockfd,&ch,1); //建立一個連接後,從客戶端讀取消息
ch++;//A=>B
write(client_sockfd,&ch,1);//寫回客戶端
close(client_sockfd);}

這是一個簡單測試網路連接的程序,其實如果做伺服器的話,一般採用的是select +noblocking 或 多線程,線程池,或多進程,進程池。。。
做了個簡單的分析,如果不明白的地方,可以發我郵件[email protected]

Ⅱ 如何使用paralle程序實現腳本的並行化

在Linux下運行作業時, 經常會遇到以下情形: 有大量作業需要運行, 完成每個作業所需要的時間也不是很長. 如果我們以串列方式來運行這些作業, 可能要耗費較長的時間; 若採用並行方式運行則可以大大節約運行時間. 再者, 目前的計算機絕大部分都是多核架構, 要想充分發揮它們的計算能力也需要並行化. 總結網上看到的資料, 利用Bash腳本, 可以採用下面幾種方法實現批量作業的並行化. 注意, 下面論述中將不會區分進程和線程, 也不會區分並行和並發.

1. 採用GNU的paralle程序

parallel是GNU專門用於並行化的一個程序, 對於簡單的批量作業並行化非常合適.使用parallel不需要編寫腳本, 只需在原命令的基礎上簡單地加上parallel就可以了. 所以, 如果能用paralle並行化你的作業, 請優先使用. 有關paralle的詳細說明, 請參考其官方文檔.

2. 最簡單的並行化方法:&+wait

利用Bash的後台運行&和wait函數, 可實現最簡單的批量作業並行化.

如下面的代碼, 串列執行大約需要10秒

{}和()的區別在shell是否會衍生子進程

(4) 此方法在目前的Cygwin(版本1.7.27)下無法使用, 因其不支持雙向命名管道. 有人提到一個解決方案,使用兩個文件描述符來替代單個文件描述符, 但此方法我沒有測試成功.

Ⅲ 《Linux高性能伺服器編程》pdf下載在線閱讀全文,求百度網盤雲資源

《Linux高性能伺服器編程》(游雙)電子書網盤下載免費在線閱讀

鏈接: https://pan..com/s/1_wuRSEGiIuzq_bLv0TdaqQ

提取碼: jxb9

書名:Linux高性能伺服器編程

作者:游雙

豆瓣評分:7.9

出版社:機械工業出版社

出版年份:2013-5-1

頁數:360

內容簡介:

本書是Linux伺服器編程領域的經典著作,由資深Linux軟體開發工程師撰寫,從網路協議、伺服器編程核心要素、原理機制、工具框架等多角度全面闡釋了編寫高性能Linux伺服器應用的方法、技巧和思想。不僅理論全面、深入,抓住了重點和難點,還包含兩個綜合性案例,極具實戰意義。

全書共17章,分為3個部分:第一部分對Linux伺服器編程的核心基礎——TCP/IP協議進行了深入的解讀和闡述,包括TCP/IP協議族、TCP/IP協議,以及一個經典的TCP/IP通信案例;第二部分對高性能伺服器編程的核心要素進行了全面深入的剖析,包含Linux網路編程API、高級I/O函數、Linux伺服器程序規范、高性能伺服器程序框架、I/O復用、信號、定時器、高性能I/O框架庫Libevent、多進程編程、多線程編程、進程池和線程池等內容,原理、技術與方法並重;第三部分從側重實戰的角度講解了高性能伺服器的優化與監測,包含伺服器的調制、調試和測試,以及各種實用系統監測工具的使用等內容。

作者簡介:

游雙,資深Linux軟體開發工程師,對Linux網路編程,尤其是伺服器端的編程,有非常深入的研究,實戰經驗也十分豐富。曾就職於摩托羅拉,擔任高級Linux軟體工程師。此外,他還精通C++、Android、QT等相關的技術。活躍於Chinaunix等專業技術社區,發表了大量關於Linux網路編程的文章,深受社區歡迎。


Ⅳ 基於事件驅動的高性能開源網路庫libevent介紹及安裝

libevent是一個輕量級的基於事件驅動的高性能的開源網路庫,並且支持多個平台,對多個平台的I/O復用技術進行了封裝,當我們編譯庫的代碼時,編譯的腳本將會根據OS支持的處理事件機制,來編譯相應的代碼,從而在libevent介面上保持一致。

在當前的伺服器上,面對的主要問題就是要能處理大量的連接。而通過libevent這個網路庫,我們就可以調用它的API來很好的解決上面的問題。首先,可以來回顧一下,對這個問題的傳統解決方法。

問題: 如何處理多個客戶端連接

解決方案1: I/O復用技術

這幾種方式都是同步I/O,即當讀寫事件就緒,他們自己需要負責進行讀寫,這個讀寫過程是阻塞的,而非同步I/O則不需要自己負責讀寫,只需要通知負責讀寫的程序就可以了。

解決方案2: 多線程技術或多進程技術

多線程技術和多進程技術也可以處理高並發的數據連接,因為在伺服器中可以產生大量的進程和線程和處理我們需要監視的連接。但是,這兩種方式也是有很大的局限性的,比如多進程模型就不適合大量的短連接,因為進程的產生和關閉需要消耗較大的系統性能,同樣,還要進程進程間的通信,在CPU性能不足的情況下不太適合。而多線程技術則不太適合處理長連接,因為當我們建立一個進程時,linux中會消耗8G的棧空間,如果我們的每個連接都杵著不斷開,那麼大量連接長連接後,導致的結果就是內存的大量消耗。

解決方案3: 常用的上述二者復合使用
上述的兩種方法各具有優缺點,因此,我們可以將上述的方法結合起來,這也是目前使用較多的處理高並發的方法。多進程+I/O復用或者多線程+I/O復用。而在具體的實現上,又可以分為很多的方式。比如多線程+I/O復用技術,我們使用使用一個主線程負責監聽一個埠和接受的描述符是否有讀寫事件產生,如果有,則將事件分發給其他的工作進程去完成,這也是進程池的理念。

在說完上述的高並發的處理方法之後,我們可以來介紹一個libevent的主要特色了。

同樣,lievent也是採用的上述系統提供的select,poll和epoll方法來進行I/O復用,但是針對於多個系統平台上的不同的I/O復用實現方式,libevent進行了重新的封裝,並提供了統一的API介面。libevent在實現上使用了事件驅動這種機制,其本質上是一種Reactor模式。

在Libevent中也是一樣,向Libevent框架注冊相應的事件和回調函數;當這些事件發生時,Libevent會調用這些回調函數處理相應的事件。

lbevent的事件支持三種,分別是網路IO、定時器和信號。定時器的數據結構使用最小堆(Min Heap),以提高效率。網路IO和信號的數據結構採用了雙向鏈表(TAILQ)。

更多linux內核視頻教程文本資料免費獲取後台私信【內核】。

libevent的安裝很簡單,我是直接從github上clone下一個源碼,然後進行編譯安裝的。

具體的命令是(假設你已經安裝了git):

現在的libevent版本已經到達libevent2了,其增加了多線程的支持,API函數也發生了一些微小的變化。

如果你想知道更多的API使用情況,請點擊這里。

下面,就基於libevent2編寫一個聊天室伺服器。

設計思想: 首先創建一個套接字,進而創建一個事件對此埠進行監聽,將所請求的用戶組成一個隊列,並監聽所有的用戶事件,當某個用戶說話了,產生了讀事件,就將該用戶的發言發送給隊列中的其他用戶。

程序分析

需要包含的libevent函數頭:

創建一個client結構體,接受連接後存放數據:

先來看下mian函數的處理:

首先,函數初始化了一個用戶隊列tailq,接著創建了一個socket套接字,並將套接字設定為非阻塞模式,接著對一個全局的evbase事件集合,注冊了事件,事件源是listen_fd,回調函數是on_accept,事件發生的情況是EV_READ,而且標志EV_PESIST表明該事件一直存在,而後開啟事件掃描循環event_base_dispatch(evbase)。

再看一下回調函數on_accpet實現:

這個回調函數的作用很顯然,就是接受了一個客戶端的請求,並申請好了一個client信息,將需要的內容填寫好,在填寫中需要注意的是,又向上述的事件集evbase中注冊了一個bufferevent事件client->buf_ev,並注冊了回調函數buffered_on_read,buffered_on_error,這三個函數分別是當接受後的連接發生了讀或者錯誤事件後的執行函數。接著,將用戶的client結構放入了用戶的隊列tailq中去。

用戶的buffer可讀後的執行函數:

執行函數的作用很明顯,將libevent管理中的buffer數據讀取出,存入本地的data數組內,然後對隊列中的client進行檢索,如果不是發數據的client,則將數據寫入該client的buffer中,發送給該用戶。這里注意的是需要反復讀取buffer中的數據,防止一個讀取並沒有讀取干凈,直到讀取不到數據為止。

buffer出錯處理函數和上述函數差不多,功能就是出錯後,結束掉保存的client結構,詳細就不說了。

編譯的時候記得修改Makefile中Libevent文件夾的位置

設計思想: 所謂回顯伺服器就是將客戶端發過來的數據再發回去,這里主要也就是說明libevent的純IO復用實現。實現方法和上面的差不多,甚至可以說更加簡單。

程序和上面的聊天伺服器差不多,只是在buffer可讀的事件函數中,不是將用戶的數據發送給其他用戶,而是直接發送給用戶本身。

設計思想: 上面的方法單純使用libevent的簡單函數來實現服務,但是這里,我們假設我們需要處理的客戶端很少,於是我們可以使用對於每個連接我們分配一個線程這樣的方式來實現對用戶的服務。這種方式簡單有效,一對一服務,就算業務邏輯出現阻塞也不怕。

程序分析

首先定義了一些數據結構,worker數據結構定義的是一個工作者,它包含有一個工作線程,和結束標志,需要獲取的工作隊列,和建立鏈表需要的指針。job數據結構定義的是操作一個job的方法和對象,這回到程序中,實際上就是指的是事件發生後,封裝好的client結構體和處理這個結構體的方法。workqueue數據結構指的是當前的工作隊列中的工作者,以及工作隊列中的待完成的工作,以及互斥鎖和條件變數(因為多個工作進程需要訪問這些資源)。

具體的流程就是,用一個主線程監聽一個套接字,並將套接字接受到的連接accept,並創建一個client數據結構保存該連接的信息,在這個client結構中注冊一個bufferevent事件,注冊到client->evbase上(這時候這是向client中的evbase注冊了一個事件還沒有進行循環這個事件集)。

接著,當監聽到某個client有bufferevent事件發生,主線程就把該client結構體和需要進行的工作方法包裝成一個job結構,然後把這個job扔到workqueue上去,並通知各個工作者。而後,各個工作者開著的線程就被激活了,瘋狂地去workqueue上去搶工作做,某個worker拿到工作後,就可以解包job,根據job的工作說明書(job_function)操作工作對象(client)了。這里,job的工作說明有是循環client中的client->evbase,於是這樣線程就會一直去監視這個連接的狀態,如果有數據就這會調用回調函數進行處理。同時,這個線程也就是阻塞在這里,這對這一個連接負責。

建立workqueue需要的結構體和函數有:

主線程的on_accept函數為:

job中的工作指南為:

設計思想: 假設我們的用戶很多,高並發,長連接,那麼我們還是來用I/O復用和線程池實現吧,用一個控制線程通過I/O復用負責監聽和分發事件,用一組線程池來進行處理事件,這樣就可以靈活地將控制邏輯和業務邏輯分開了,見下述講解。

程序分析
具體的流程和上面的差不多,用一個主線程監聽一個套接字,並將套接字接受到的連接accept,並創建一個client數據結構保存該連接的信息,在這個client結構中注冊一個bufferevent事件,但是這里,將事件注冊到accept_evbase中,仍然用主線程進行監聽。

而面對監聽後出現的事件,將client和操作client的方法打包成一個job,放到上述的workqueue中去,讓工作進程來完成。這樣的操作和上述的差別在於上述方法將bufferevent注冊到client中的evbase中,用工作線程監聽,而本方法用主線程監聽,工作線程負責處理監聽產生的事件。

這要的差別在於兩個函數 on_accept函數:

在buffered_on_read中,提交job。

在job工作指南server_job_function中就可以做你工作該做的事兒了,根據發來的信息進行資料庫處理,http返回等等。

Ⅳ linux伺服器上運行PHP,除了PHP-FPM還有其他的方式嗎

運行模式
關於PHP目前比較常見的五大運行模式:
1)CGI(通用網關介面/ Common Gateway Interface)
2)FastCGI(常駐型CGI / Long-Live CGI)
3)CLI(命令行運行 / Command Line Interface)
4)Web模塊模式(Apache等Web伺服器運行的模式)
5)ISAPI(Internet Server Application Program Interface)

備註:在PHP5.3以後,PHP不再有ISAPI模式,安裝後也不再有php5isapi.dll這個文件。要在IIS6上使用高版本PHP,必須安裝FastCGI 擴展,然後使IIS6支持FastCGI。

1.1、CGI模式
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和Web伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。CGI已經是比較老的模式了,這幾年都很少用了。
每有一個用戶請求,都會先要創建CGI的子進程,然後處理請求,處理完後結束這個子進程,這就是Fork-And-Execute模式。 當用戶請求數量非常多時,會大量擠占系統的資源如內存,CPU時間等,造成效能低下。所以用CGI方式的伺服器有多少連接請求就會有多少CGI子進程,子進程反復載入是CGI性能低下的主要原因。
如果不想把 PHP 嵌入到伺服器端軟體(如 Apache)作為一個模塊安裝的話,可以選擇以 CGI 的模式安裝。或者把 PHP 用於不同的 CGI 封裝以便為代碼創建安全的 chroot 和 setuid 環境。這樣每個客戶機請求一個PHP文件,Web伺服器就調用php.exe(win下是php.exe,linux是php)去解釋這個文件,然後再把解釋的結果以網頁的形式返回給客戶機。 這種安裝方式通常會把 PHP 的可執行文件安裝到 web 伺服器的 cgi-bin 目錄。CERT 建議書 CA-96.11 建議不要把任何的解釋器放到 cgi-bin 目錄。 這種方式的好處是把Web Server和具體的程序處理獨立開來,結構清晰,可控性強,同時缺點就是如果在高訪問需求的情況下,CGI的進程Fork就會成為很大的伺服器負擔,想 象一下數百個並發請求導致伺服器Fork出數百個進程就明白了。這也是為什麼CGI一直背負性能低下,高資源消耗的惡名的原因。

1.2、FastCGI模式
FastCGI是CGI的升級版本,FastCGI像是一個常駐 (long-live)型的 CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去 Fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的介面。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。
FastCGI介面方式採用C/S結構,可以將HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或者多個腳本解析守護進程。當HTTP伺服器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態腳本伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

【原理】
1)Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole);
2)FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (可見多個php-cgi.exe或php-cig)並等待來自Web Server的連接;
3)當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi;
4)FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。在正常的CGI模式中,php-cgi.exe在此便退出了。
在CGI模式中,你可以想像 CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連接(Persistent database connection)可以工作。

備註:PHP的FastCGI進程管理器是PHP-FPM(PHP-FastCGI Process Manager)
【優點】
1)從穩定性上看,FastCGI是以獨立的進程池來運行CGI,單獨一個進程死掉,系統可以很輕易的丟棄,然後重新分配新的進程來運行邏輯;
2)從安全性上看,FastCGI支持分布式運算。FastCGI和宿主的Server完全獨立,FastCGI怎麼down也不會把Server搞垮;
3)從性能上看,FastCGI把動態邏輯的處理從Server中分離出來,大負荷的IO處理還是留給宿主Server,這樣宿主Server可以一心一意作IO,對於一個普通的動態網頁來說, 邏輯處理可能只有一小部分,大量的是圖片等靜態。

【缺點】
說完了好處,也來說說缺點。從我的實際使用來看,用FastCGI模式更適合生產環境的伺服器。但對於開發用機器來說就不太合適。因為當使用 Zend Studio調試程序時,由於 FastCGI會認為 PHP進程超時,從而在頁面返回 500錯誤。這一點讓人非常惱火,所以我在開發機器上還是換回了 ISAPI模式。對某些伺服器的新版本支持不好,對分布式負載均衡沒要求的模塊化安裝是否是更好的選擇。目前的FastCGI和Server溝通還不夠智能,一個FastCGI進程如果執行時間過長會被當成是死進程殺掉重起,這樣在處理長時間任務的時候很麻煩,這樣做也使得FastCGI無法允許聯機調試。因為是多進程,所以比CGI多線程消耗更多的伺服器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。

1.3 CLI模式
PHP-CLI是PHP Command Line Interface的簡稱,如同它名字的意思,就是PHP在命令行運行的介面,區別於在Web伺服器上運行的PHP環境(PHP-CGI,ISAPI等)。 也就是說,PHP不單可以寫前台網頁,它還可以用來寫後台的程序。 PHP的CLI Shell腳本適用於所有的PHP優勢,使創建要麼支持腳本或系統甚至與GUI應用程序的服務端,在Windows和Linux下都是支持PHP-CLI模式的。
【優點】
1)使用多進程,子進程結束以後,內核會負責回收資源;
2)使用多進程,子進程異常退出不會導致整個進程Thread退出,父進程還有機會重建流程;
3)一個常駐主進程,只負責任務分發,邏輯更清楚。
我們在Linux下經常使用"php –m"查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入"php –h"去深入研究該運行模式。

1.4 模塊模式
模塊模式是以mod_php5模塊的形式集成,此時mod_php5模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求,然後將處理後的結果返回給Apache。如果我們在Apache啟動前在其配置文件中配置好了PHP模塊
(mod_php5), PHP模塊通過注冊apache2的ap_hook_post_config掛鉤,在Apache啟動的時候啟動此模塊以接受PHP文件的請求。
除了這種啟動時的載入方式,Apache的模塊可以在運行的時候動態裝載,這意味著對伺服器可以進行功能擴展而不需要重新對源代碼進行編譯,甚至根本不需要停止伺服器。我們所需要做的僅僅是給伺服器發送信號HUP或者AP_SIG_GRACEFUL通知伺服器重新載入模塊。但是在動態載入之前,我們需要將模塊編譯成為動態鏈接庫。此時的動態載入就是載入動態鏈接庫。 Apache中對動態鏈接庫的處理是通過模塊mod_so來完成的,因此mod_so模塊不能被動態載入,它只能被靜態編譯進Apache的核心。這意味著它是隨著Apache一起啟動的。
Apache是如何載入模塊的呢?我們以前面提到的mod_php5模塊為例。首先我們需要在Apache的配置文件httpd.conf中添加一行:
LoadMole php5_mole moles/mod_php5.so

這里我們使用了LoadMole命令,該命令的第一個參數是模塊的名稱,名稱可以在模塊實現的源碼中找到。第二個選項是該模塊所處的路徑。如果需要在伺服器運行時載入模塊,可以通過發送信號HUP或者AP_SIG_GRACEFUL給伺服器,一旦接受到該信號,Apache將重新裝載模塊,而不需要重新啟動伺服器。
該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(它是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)。

1.5 ISAPI模式
ISAPI(Internet Server Application Program Interface)是微軟提供的一套面向Internet服務的API介面,一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。

Ⅵ epoll可以解決多個socket的連接,為什麼高並發伺服器還要用進程池或者線程池呢

閱讀全文

與linux進程池實現相關的資料

熱點內容
抖音交友app廣告怎麼投 瀏覽:870
esxiha配置文件 瀏覽:573
pubg交易平台有哪些APP 瀏覽:144
excel插入文件夾地址 瀏覽:948
學編程累如何調節 瀏覽:382
圖片傳入iphone 瀏覽:730
rs485雙機通信程序 瀏覽:967
怎麼托日本的朋友買蘋果手機 瀏覽:145
築業電力軟體怎麼倒出文件 瀏覽:572
全民飛機大戰軍銜怎麼升級 瀏覽:431
公司自動化編程屬於什麼 瀏覽:925
位位用車app在哪裡下載 瀏覽:427
格式工廠iphone鈴聲 瀏覽:171
linux設置字元編碼 瀏覽:15
帝王世紀升級哪個兵種 瀏覽:409
c編程開發軟體是什麼 瀏覽:334
二的大寫怎麼寫app 瀏覽:612
樂視數據刪除了怎麼找回來 瀏覽:651
ug編程初始化怎麼辦 瀏覽:295
nginxajax配置文件 瀏覽:467

友情鏈接