新聞中心
當我們想要在實際場景中使用一個新的應用程序時,我們需要了解該應用程序的實現(xiàn)方法。應用實現(xiàn)方法是指我們所使用的編程語言,框架和工具,以及程序的基本架構(gòu)和設計模式。在本文中,我們將對應用程序?qū)崿F(xiàn)方法進行簡要分析。

創(chuàng)新互聯(lián)公司服務項目包括婁底網(wǎng)站建設、婁底網(wǎng)站制作、婁底網(wǎng)頁制作以及婁底網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,婁底網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到婁底省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
編程語言
我們需要選擇一個編程語言。在過去的幾十年中,許多編程語言已經(jīng)被開發(fā)出來,每種語言有其獨特的優(yōu)勢和劣勢。有些語言適合于開發(fā)具有高并發(fā)性的應用程序,而有些語言適合于開發(fā)嵌入式設備。選擇編程語言的方法是根據(jù)應用程序的要求來決定,事實上,一些應用程序可能需要使用多種編程語言。
目前,最常用的編程語言是Java,C++,Python,JavaScript和Ruby。Java被廣泛用于企業(yè)級應用程序開發(fā),而C++用于嵌入式系統(tǒng),游戲和圖形應用程序開發(fā)。Python和Ruby用于web開發(fā),JavaScript用于前端開發(fā)。當然,這只是一個大略的指南,實際上每種語言都有許多用途和應用場景。
框架和工具
一旦我們決定了使用哪種編程語言,下一步就是選擇合適的框架和工具??蚣芎凸ぞ呤菐椭覀兗铀匍_發(fā)和提高效率的軟件包。它提供了開發(fā)者所需的功能,以實現(xiàn)通用任務(例如,數(shù)據(jù)庫,網(wǎng)絡通信,用戶權(quán)限管理等)。
對于不同的編程語言,有許多不同的框架和工具可供選擇,并且新的框架和工具正在不斷地產(chǎn)生。在選擇框架和工具時,我們需要考慮多方面的因素,例如框架的穩(wěn)定性,代碼質(zhì)量,社區(qū)支持等等。
基本架構(gòu)和設計模式
最終,我們需要為我們的應用程序選擇一個基本的架構(gòu)和設計模式?;炯軜?gòu)是指應用程序的大體結(jié)構(gòu),包括客戶端和服務器層以及數(shù)據(jù)存儲和管理。設計模式是指我們將如何組合,管理和擴展程序的代碼。
當我們在選擇基本架構(gòu)和設計模式時,我們需要考慮許多因素。例如,我們需要了解應用程序處理數(shù)據(jù)的方式,它需要執(zhí)行的操作,以及我們?nèi)绾螌?shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成更有意義的信息。
當我們開始設計和實現(xiàn)一個應用程序時,我們需要考慮許多因素。選擇合適的編程語言,框架和工具以及基本架構(gòu)和設計模式,都是成功實現(xiàn)應用程序的關(guān)鍵要素。正確的選擇將有助于我們在實踐中實現(xiàn)我們的應用程序,使其更有效,更可靠和更高效。
相關(guān)問題拓展閱讀:
- 同步與異步,阻塞與非阻塞的區(qū)別,以及select,poll和epoll
同步與異步,阻塞與非阻塞的區(qū)別,以及select,poll和epoll
異步的概念和同步相對。
(1)當一個同步調(diào)用發(fā)出后,調(diào)用者要一直等待返回消息(結(jié)果)通知后,才能進行后續(xù)的執(zhí)行;
(2)當一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到返回消息(結(jié)果)。實際處理這個調(diào)用的部件在完成后,通過
狀態(tài)、通知和回調(diào)
來通知調(diào)用者。
這里提到執(zhí)行部件和調(diào)用者通過三種途徑返回結(jié)果:狀態(tài)、通知和回調(diào)。使用哪一種通知機制,依賴于執(zhí)行部件的實現(xiàn),除非執(zhí)行部件提供多種選擇,否則不受調(diào)用者控制。
(A)阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起,一直處于等待消息通知,不能夠執(zhí)行其他業(yè)務
(B)非阻塞調(diào)用是指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當前線程,而會立刻返回
場景比喻:
舉個例子,比如我去銀行辦理業(yè)務,可能會有兩種方式:
在上面的場景中,如果:
a)如果選擇排隊(同步),且排隊的時候什么都不干(線程被掛起,什么都干不了),是同步阻塞模型;
b)如果選擇排隊(同步),但是排隊的同時做與辦銀行業(yè)務無關(guān)的事情,比如抽煙,(線程沒有被掛起,還可以干一些其他的事),是同步非阻塞模型;
c)如果選擇拿個小票,做在位置上等著叫號(通知),但是坐在位置上什么都不干(線程被掛起,什么都干不了),這是異步阻塞模型;
d)如果選擇那個小票,坐在位置上等著叫號(通知),但是坐著的同時還打談生意(線程沒有被掛起,還可以干其他事情),這是異步非阻塞模型。
對這四種模型做一個總結(jié):
1:同步阻塞模型,效率更低,即你專心排隊,什么都不干。
2:異步阻塞,效率也非常低,即你拿著號等著被叫(通知),但是坐那什么都不干
3:同步非阻塞,效率其實也不高,因為涉及到線程的來回切換。即你在排隊的同時打或者抽煙,但是你必須時不時得在隊伍中挪動。程序需要在排隊和打這兩種動作之間來回切換,系統(tǒng)開銷可想而知。
4:異步非阻塞,效率很高,你拿著小票在那坐著等叫號(通知)的同時,打談你的生意。
linux下幾個基本概念
1:用戶控件和內(nèi)核空間。
現(xiàn)代操作系統(tǒng)都是采用虛擬存儲器,在32位操作系統(tǒng)下,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。為了保證用戶進程補鞥呢直接操作內(nèi)核,保證內(nèi)核的安全,操作系統(tǒng)將虛擬空間劃分為兩部分,一部分為內(nèi)核空間,一部分為用戶空間。對linux操作系統(tǒng)而言,將更高的1G字節(jié)空間分給了內(nèi)核使用,稱為內(nèi)核空間,將較低的3G字節(jié)的空間劃分為用戶空間。
2:進程切換很耗資源
,為了控制進程的執(zhí)行,內(nèi)核必須有能力掛起正在cpu上運行的進程,并恢復以前掛起的某個進程的執(zhí)行,這種行為叫進程的切換。每次切換,要保存上一個的上下文環(huán)境等等,總之記住進程切換很耗資源。
3:文件描述符
:文件描述符在形式上是一個非負整數(shù)。實際上,他是一個索引,指向內(nèi)核為每個進程所維護的該進程打開文件的記錄表。當程序打開一個文件時,內(nèi)核就會向進程返回一個非負整數(shù)的文件描述符。但是文件描述符一般在unix,linux系統(tǒng)中才講。
緩存IO
,大多數(shù)系統(tǒng)的默認IO操作都是緩存IO,在linux的緩存IO機制中,操作系統(tǒng)會將IO的數(shù)據(jù)緩存在系統(tǒng)的頁緩存(page cache)中,也就是說,數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū),然后才會從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應用程序的地址空間。
緩存IO的缺點:
數(shù)據(jù)在傳輸過程中需要在應用程序和地址空間和內(nèi)核進行多次數(shù)據(jù)拷貝操作,這種數(shù)據(jù)拷貝操作鎖帶來的cpu以及內(nèi)存消耗是很大的。
LINUX的IO模型
網(wǎng)絡IO的本質(zhì)是socket的讀取。socket在linux系統(tǒng)被抽象為流,故對網(wǎng)絡IO的操作可以理解為對流的操作。
對于一次IO訪問,比如以read操作為例,
數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū),然后才會從內(nèi)核緩沖區(qū)拷貝到進程的用戶層,即應用程序的地址空間
。故當一個read操作發(fā)生時,其實是經(jīng)歷了兩個階段:
1:內(nèi)核緩沖區(qū)的數(shù)據(jù)就位
2:數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶程序地址空間
那么具體到socket io的一次read操來說,這兩步分別是:
1:等待網(wǎng)絡上的數(shù)據(jù)分組到達,然后復制到內(nèi)核緩沖區(qū)中
2:數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶程序的地址空間(緩沖區(qū))
所以說
網(wǎng)絡應用要處理的無非就兩個問題:網(wǎng)絡IO和數(shù)據(jù)計算
,一般來說網(wǎng)絡io帶來的延遲影響比較大。
網(wǎng)絡IO的模型大致有如下幾種:
熟悉不?
我們常說的select,poll和epoll就是屬于同步模型中多路復用IO的不同實現(xiàn)方法罷了。
下面分別對同步阻塞,同步不阻塞,同步io復用進行說明。
一:同步阻塞
它是最簡單也最常用的網(wǎng)絡IO模型。linux下默認的socket都是blocking的。
從圖中可以看到,用戶進程調(diào)用recvfrom這個系統(tǒng)調(diào)用后,就處于阻塞狀態(tài)。然后kernel就開始了IO的之一個階段:數(shù)據(jù)準備。等之一個階段準備完成之后,kernel開始第二階段,將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶程序緩沖區(qū)(需要花費一定時間)。然后kernel返回結(jié)果(確切的說是recvfrom這個系統(tǒng)調(diào)用函數(shù)返回結(jié)果),用戶進程才結(jié)束blocking,重新運行起來。
總結(jié)
:
同步阻塞模型下,用戶程序在kernel執(zhí)行io的兩個階段都被blocking住了
。但是優(yōu)點也是因為這個,無延遲能及時返回數(shù)據(jù),且程序模型簡單。
二:同步非阻塞
同步非阻塞就是隔一會瞄一下的輪詢方式。同步非阻塞模式其實是可以看做一小段一小段的同步阻塞模式。
三:IO多路復用
由于同步非阻塞方式需要不斷的輪詢,光輪詢就占據(jù)了很大一部分過程,且消耗cpu資源。而這個用戶進程可能不止對這個socket的read,可能還有對其他socket的read或者write操作,那人們就想到了一次輪詢的時候,不光只查詢詢一個socket fd,而是在一次輪詢下,查詢多個任務的socket fd的完成狀態(tài),只要有任何一個任務完成,就去處理它。而且,輪詢?nèi)瞬皇沁M程的用戶態(tài),而是有人幫忙就好了。那么這就是所謂的
IO多路復用
??偹苤膌inux下的select,poll和epoll就是這么干的。。。
selelct調(diào)用是內(nèi)核級別的,selelct輪詢相比較同步非阻塞模式下的輪詢的區(qū)別為:
前者可以等待多個socket,能實現(xiàn)同時對多個IO端口的監(jiān)聽
,當其中任何一個socket數(shù)據(jù)準備好了,就返回可讀。
select或poll調(diào)用之后,會阻塞進程
,與blocking IO 阻塞不用在于,此時的select不是等到所有socket數(shù)據(jù)達到再處理,而是某個socket數(shù)據(jù)就會返回給用戶進程來處理。
其實select這種相比較同步non-blocking的效果在單個任務的情況下可能還更差一些
,因為這里調(diào)用了select和recvfrom兩個system call,而non-blocking只調(diào)用了一個recvfrom,但是
用select的優(yōu)勢在于它可以同時處理多個socket fd
。
在io復用模型下,對于每一個socket,一般都設置成non-blocking,但是其實
整個用戶進程是一直被block的
,只不過用戶process不是被socket IO給block住,而是被select這個函數(shù)block住的。
與多進程多線程技術(shù)相比,IO多路復用的更大優(yōu)勢是系統(tǒng)開銷小。
一:select
select函數(shù)監(jiān)視多個socket fs,直到有描述符就緒或者超時,函數(shù)返回。當select函數(shù)返回后,可以通過遍歷fdset,來找到就緒的描述符。select的基本流程為:
二:poll
poll本質(zhì)上跟select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內(nèi)核空間,然后查詢每個fd的狀態(tài),如果某個fd的狀態(tài)為就緒,則將此fd加入到等待隊列中并繼續(xù)遍歷。如果遍歷完所有的fd后發(fā)現(xiàn)沒有就緒的,則掛起當前進程,直到設備就緒或者主動超時。被喚醒后它又要再次遍歷fd。
特點:
1:poll沒有更大連接數(shù)限制,因為它是用基于鏈表來存儲的,跟selelct直接監(jiān)聽fd不一樣。
2:同樣的大量的fd的數(shù)組被整體復制與用戶態(tài)和內(nèi)核地址空間之間。
3:poll還有一個特點是水平觸發(fā):如果報告了fd后沒有被處理,則下次poll時還會再次報告該fd。
4:跟select一樣,在poll返回后,還是需要通過遍歷fdset來獲取已經(jīng)就緒的socket。當fd很多時,效率會線性下降。
三:epoll
epoll支持水平觸發(fā)和邊緣觸發(fā),更大的特點在于邊緣觸發(fā),它只告訴進程哪些fd剛剛變?yōu)榫途w態(tài),并且只會通知一次。還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內(nèi)核就會采用類似callback的回調(diào)機制來激活該fd,epoll_wait便可以收到通知。
沒有更大并發(fā)連接的限制,能打開的FD的上限遠大于1024(1G的內(nèi)存上能監(jiān)聽約10萬個端口)。
效率提升,不是輪詢的方式,不會隨著FD數(shù)目的增加效率下降。只有活躍可用的FD才會調(diào)用callback函數(shù);即Epoll更大的優(yōu)點就在于它只管你“活躍”的連接,而跟連接總數(shù)無關(guān),因此在實際的網(wǎng)絡環(huán)境中,Epoll的效率就會遠遠高于select和poll。
內(nèi)存拷貝,利用mmap()文件映射內(nèi)存加速與內(nèi)核空間的消息傳遞;即epoll使用mmap減少復制開銷。
聊聊同步、異步、阻塞與非阻塞
聊聊Linux 五種IO模型
聊聊IO多路復用之select、poll、epoll詳解
關(guān)于linux socket異步的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
本文標題:應用實現(xiàn)方法簡析(linuxsocket異步)
URL標題:http://m.fisionsoft.com.cn/article/cogipio.html


咨詢
建站咨詢
