十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
當(dāng)我們想要在實(shí)際場(chǎng)景中使用一個(gè)新的應(yīng)用程序時(shí),我們需要了解該應(yīng)用程序的實(shí)現(xiàn)方法。應(yīng)用實(shí)現(xiàn)方法是指我們所使用的編程語(yǔ)言,框架和工具,以及程序的基本架構(gòu)和設(shè)計(jì)模式。在本文中,我們將對(duì)應(yīng)用程序?qū)崿F(xiàn)方法進(jìn)行簡(jiǎn)要分析。

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