這篇文章給大家介紹如何淺析編程語言中的五種編程模型,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),公安網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:公安等地區(qū)。公安做網(wǎng)站價(jià)格咨詢:13518219792
編程模型,我們可以簡(jiǎn)單地理解為,它就是模板,遇到相似問題就可以方便依模板解決,這樣就簡(jiǎn)化了編程問題。不同的編程環(huán)境和不同的應(yīng)用對(duì)象有不同的編程模型。編程模型也是學(xué)習(xí)編程內(nèi)容中的基礎(chǔ)知識(shí),小編帶著大家來淺析五種編程模型。
一、同步異步,阻塞非阻塞區(qū)別聯(lián)系
實(shí)際上同步與異步是針對(duì)應(yīng)用程序與內(nèi)核的交互而言的。同步過程中進(jìn)程觸發(fā)IO操作并等待(也就是我們說的阻塞)或者輪詢的去查看IO操作(也就是我們說的非阻塞)是否完成。異步過程中進(jìn)程觸發(fā)IO操作以后,直接返回,做自己的事情,IO交給內(nèi)核來處理,完成后內(nèi)核通知進(jìn)程IO完成。同步和異步針對(duì)應(yīng)用程序來,關(guān)注的是程序中間的協(xié)作關(guān)系;阻塞與非阻塞更關(guān)注的是單個(gè)進(jìn)程的執(zhí)行狀態(tài)。同步有阻塞和非阻塞之分,異步?jīng)]有,它一定是非阻塞的。阻塞、非阻塞、多路IO復(fù)用,都是同步IO,異步必定是非阻塞的,所以不存在異步阻塞和異步非阻塞的說法。真正的異步IO需要CPU的深度參與。換句話說,只有用戶線程在操作IO的時(shí)候根本不去考慮IO的執(zhí)行全部都交給CPU去完成,而自己只等待一個(gè)完成信號(hào)的時(shí)候,才是真正的異步IO。所以,拉一個(gè)子線程去輪詢、去死循環(huán),或者使用select、poll、epool,都不是異步。
同步:執(zhí)行一個(gè)操作之后,進(jìn)程觸發(fā)IO操作并等待(也就是我們說的阻塞)或者輪詢的去查看IO操作(也就是我們說的非阻塞)是否完成,等待結(jié)果,然后才繼續(xù)執(zhí)行后續(xù)的操作。
異步:執(zhí)行一個(gè)操作后,可以去執(zhí)行其他的操作,然后等待通知再回來執(zhí)行剛才沒執(zhí)行完的操作。
阻塞:進(jìn)程給CPU傳達(dá)一個(gè)任務(wù)之后,一直等待CPU處理完成,然后才執(zhí)行后面的操作。
非阻塞:進(jìn)程給CPU傳達(dá)任我后,繼續(xù)處理后續(xù)的操作,隔斷時(shí)間再來詢問之前的操作是否完成。這樣的過程其實(shí)也叫輪詢。
二、IO模型(五種編程模型)
這里統(tǒng)一使用Linux下的系統(tǒng)調(diào)用recv作為例子,它用于從套接字上接收一個(gè)消息,因?yàn)槭且粋€(gè)系統(tǒng)調(diào)用,所以調(diào)用時(shí)會(huì)從用戶進(jìn)程空間切換到內(nèi)核空間運(yùn)行一段時(shí)間再切換回來。默認(rèn)情況下recv會(huì)等到網(wǎng)絡(luò)數(shù)據(jù)到達(dá)并且復(fù)制到用戶進(jìn)程空間或者發(fā)生錯(cuò)誤時(shí)返回,而第4個(gè)參數(shù)flags可以讓它馬上返回。
1、阻塞IO模型
使用recv的默認(rèn)參數(shù)一直等數(shù)據(jù)直到拷貝到用戶空間,這段時(shí)間內(nèi)進(jìn)程始終阻塞。A同學(xué)用杯子裝水,打開水龍頭裝滿水然后離開。這一過程就可以看成是使用了阻塞IO模型,因?yàn)槿绻堫^沒有水,他也要等到有水并裝滿杯子才能離開去做別的事情。很顯然,這種IO模型是同步的。
2、非阻塞IO模型
改變flags,讓recv不管有沒有獲取到數(shù)據(jù)都返回,如果沒有數(shù)據(jù)那么一段時(shí)間后再調(diào)用recv看看,如此循環(huán)。B同學(xué)也用杯子裝水,打開水龍頭后發(fā)現(xiàn)沒有水,它離開了,過一會(huì)他又拿著杯子來看看……在中間離開的這些時(shí)間里,B同學(xué)離開了裝水現(xiàn)場(chǎng)(回到用戶進(jìn)程空間),可以做他自己的事情。這就是非阻塞IO模型。但是它只有是檢查無數(shù)據(jù)的時(shí)候是非阻塞的,在數(shù)據(jù)到達(dá)的時(shí)候依然要等待復(fù)制數(shù)據(jù)到用戶空間(等著水將水杯裝滿),因此它還是同步IO。
3、IO復(fù)用模型
這里在調(diào)用recv前先調(diào)用select或者poll,這2個(gè)系統(tǒng)調(diào)用都可以在內(nèi)核準(zhǔn)備好數(shù)據(jù)(網(wǎng)絡(luò)數(shù)據(jù)到達(dá)內(nèi)核)時(shí)告知用戶進(jìn)程,這個(gè)時(shí)候再調(diào)用recv一定是有數(shù)據(jù)的。因此這一過程中它是阻塞于select或poll,而沒有阻塞于recv,有人將非阻塞IO定義成在讀寫操作時(shí)沒有阻塞于系統(tǒng)調(diào)用的IO操作(不包括數(shù)據(jù)從內(nèi)核復(fù)制到用戶空間時(shí)的阻塞,因?yàn)檫@相對(duì)于網(wǎng)絡(luò)IO來說確實(shí)很短暫),如果按這樣理解,這種IO模型也能稱之為非阻塞IO模型,但是按POSIX來看,它也是同步IO,那么也和樓上一樣稱之為同步非阻塞IO吧。
這種IO模型比較特別,分個(gè)段。因?yàn)樗芡瑫r(shí)監(jiān)聽多個(gè)文件描述符(fd)。這個(gè)時(shí)候C同學(xué)來裝水,發(fā)現(xiàn)有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。于是等啊等(select調(diào)用中),過了一會(huì)阿姨告訴他有水了,但不知道是哪個(gè)水龍頭有水,自己看吧。于是C同學(xué)一個(gè)個(gè)打開,往杯子里裝水(recv)。這里再順便說說鼎鼎大名的epoll(高性能的代名詞啊),epoll也屬于IO復(fù)用模型,主要區(qū)別在于舍管阿姨會(huì)告訴C同學(xué)哪幾個(gè)水龍頭有水了,不需要一個(gè)個(gè)打開看(當(dāng)然還有其它區(qū)別)。
4、信號(hào)驅(qū)動(dòng)IO模型
通過調(diào)用sigaction注冊(cè)信號(hào)函數(shù),等內(nèi)核數(shù)據(jù)準(zhǔn)備好的時(shí)候系統(tǒng)中斷當(dāng)前程序,執(zhí)行信號(hào)函數(shù)(在這里面調(diào)用recv)。D同學(xué)讓舍管阿姨等有水的時(shí)候通知他(注冊(cè)信號(hào)函數(shù)),沒多久D同學(xué)得知有水了,跑去裝水。是不是很像異步IO?很遺憾,它還是同步IO(省不了裝水的時(shí)間啊)。
5、異步IO模型
調(diào)用aio_read,讓內(nèi)核等數(shù)據(jù)準(zhǔn)備好,并且復(fù)制到用戶進(jìn)程空間后執(zhí)行事先指定好的函數(shù)。E同學(xué)讓舍管阿姨將杯子裝滿水后通知他。整個(gè)過程E同學(xué)都可以做別的事情(沒有recv),這才是真正的異步IO。
一般來講:阻塞IO模型、非阻塞IO模型、IO復(fù)用模型(select/poll/epoll)、信號(hào)驅(qū)動(dòng)IO模型都屬于同步IO,因?yàn)殡A段2是阻塞的(盡管時(shí)間很短)。只有異步IO模型是符合POSIX異步IO操作含義的,不管在階段1還是階段2都可以干別的事。
關(guān)于如何淺析編程語言中的五種編程模型就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站題目:如何淺析編程語言中的五種編程模型
URL網(wǎng)址:http://jinyejixie.com/article34/peodpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、用戶體驗(yàn)、網(wǎng)頁設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)