91亚洲精华国内精华精华液_国产高清在线精品一区不卡_精品特级一级毛片免费观看_欧美日韩中文制服有码_亚洲精品无码你懂的网站369

1. 概述
web應(yīng)用中,io這塊是一個(gè)重點(diǎn),不同的策略對(duì)系統(tǒng)的性能影響很大.
對(duì)于io操作來(lái)說(shuō),用戶線程發(fā)起io請(qǐng)求,內(nèi)核負(fù)責(zé)完成此請(qǐng)求,并反饋結(jié)果,這兩個(gè)角色之間需要進(jìn)行協(xié)調(diào):
1. 系統(tǒng)掛起用戶線程,操作完成之后,系統(tǒng)返回結(jié)果,喚醒用戶線程
2. 系統(tǒng)返回狀態(tài)碼,用戶線程輪詢結(jié)果,直到操作完成.
3. 用戶線程發(fā)起請(qǐng)求時(shí)附帶回調(diào)信息,內(nèi)核接受請(qǐng)求后返回,用戶線程執(zhí)行別的邏輯;系統(tǒng)會(huì)在操作完成之后回調(diào),有的系統(tǒng)自動(dòng)創(chuàng)建新用戶線程完成io處理,有的系統(tǒng)會(huì)利用已有的用戶線程執(zhí)行處理邏輯
4. 用戶系統(tǒng)注冊(cè)一個(gè)大的信號(hào)處理線程,用戶線程發(fā)起請(qǐng)求后直接返回,系統(tǒng)在操作完成之后發(fā)送信號(hào),信號(hào)處理線程接手處理.
可以看出,有的方式會(huì)造成線程掛起等待,有的會(huì)造成線程空轉(zhuǎn);一個(gè)線程好不容易等到系統(tǒng)分配了時(shí)間片,卻又無(wú)奈的交出自己的時(shí)間片,浪費(fèi)系統(tǒng)資源,我們的目標(biāo)就是盡量少的線程,盡量少浪費(fèi)線程的時(shí)間片,盡量少的線程切換,要做到這點(diǎn),還是先來(lái)說(shuō)說(shuō)io中較常見的同步、異步、阻塞和非阻塞這幾個(gè)概念.
2. 同步
    我理解的io同步是指線程做io請(qǐng)求時(shí)需要等待內(nèi)核將數(shù)據(jù)準(zhǔn)備好,浪費(fèi)了自己的cpu時(shí)間片.比如read,如果數(shù)據(jù)沒準(zhǔn)備好則線程直接掛起,浪費(fèi)了一次線程調(diào)度;如果數(shù)據(jù)準(zhǔn)備好了,需要將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,可能分給自己1ms,結(jié)果等待拷貝數(shù)據(jù)花了了0.5ms,,實(shí)際只花費(fèi)了0.5ms在業(yè)務(wù)上.
也有人是從當(dāng)前線程是否需要等待處理結(jié)果來(lái)考量,當(dāng)前線程需要等待,那就是同步,這個(gè)和我的觀點(diǎn)實(shí)際沒差別,到了異步這兒就不太一樣,我們下面說(shuō).
3. 異步
    與同步模式相反,異步模式下用戶線程只需要注冊(cè)相關(guān)信息,操作系統(tǒng)在操作完成后,將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,然后根據(jù)注冊(cè)信息通知用戶進(jìn)程處理io結(jié)果.整個(gè)流程中無(wú)需用戶線程干預(yù),用戶線程可以充分利用分配給自己的時(shí)間.
有的io調(diào)用返回的是狀態(tài)碼,用戶線程再根據(jù)狀態(tài)碼做相應(yīng)的處理,但實(shí)際去做io操作時(shí)還是要主動(dòng)的發(fā)起系統(tǒng)調(diào)用去獲取數(shù)據(jù),這是同步模型;還有的io操作是通過(guò)信號(hào)驅(qū)動(dòng),內(nèi)核在操作完成后發(fā)送信號(hào)通知用戶進(jìn)程處理,用戶進(jìn)程捕獲到信號(hào)后再發(fā)起系統(tǒng)調(diào)用去讀取數(shù)據(jù),實(shí)際上還是同步模式.
回到前面的問(wèn)題,當(dāng)前線程不等待io的操作結(jié)果這是否可以認(rèn)為是異步?
我是這樣想的,io數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間這一步所花費(fèi)的時(shí)間,不花在這個(gè)用戶線程就花在別的用戶線程,,總是消耗了用戶線程的cpu時(shí)間片,除非由內(nèi)核來(lái)驅(qū)動(dòng)用戶線程.
4. 阻塞
    阻塞是指進(jìn)行io操作時(shí)是否引起線程掛起,掛起了就是阻塞模式.很多時(shí)候會(huì)把同步和阻塞混淆,主要是因?yàn)橥揭话愣际怯勺枞麑?shí)現(xiàn)的.仔細(xì)想想,非阻塞也可以是同步,創(chuàng)建socket時(shí)如果指定BLOCK為false,那所有的操作都變成非阻塞,此時(shí)可能還是同步模式.
阻塞模式既有有點(diǎn)又有缺點(diǎn),因?yàn)闀?huì)阻塞,在請(qǐng)求不活躍時(shí)會(huì)節(jié)約cpu;因?yàn)闀?huì)阻塞,也就造成了線程切換,也就浪費(fèi)了cpu.
5. 非阻塞
    沒啥好說(shuō)的,線程一路暢通無(wú)阻,看起來(lái)挺好,可如果忙著做狀態(tài)檢測(cè),那就極大的浪費(fèi)了cpu資源.
5 四種理論模型
    同步異步,阻塞非阻塞,交叉組合,共有四種模型
5.1 同步阻塞
    最經(jīng)典的使用方式,最簡(jiǎn)單的,最喜歡的....
io操作會(huì)引起線程阻塞,只有系統(tǒng)準(zhǔn)備好了時(shí)才會(huì)有返回,可以說(shuō)不會(huì)浪費(fèi)任何cpu資源.一般會(huì)有少量的線程接入請(qǐng)求,再來(lái)一個(gè)線程池處理接入的請(qǐng)求,簡(jiǎn)單有效.如果你的系統(tǒng)處理的連接不多,或者大部分不活躍,不用猶豫就它了.
在請(qǐng)求頻繁時(shí),同步阻塞會(huì)放大線程調(diào)度的成本,如果總得連接數(shù)超過(guò)線程池大小還會(huì)造成請(qǐng)求排隊(duì),此時(shí)還是盡早調(diào)整策略.
5.2 同步非阻塞
    建立socket時(shí),可以指定no block,此時(shí)所有的操作都會(huì)立刻返回,線程再根據(jù)返回值做相應(yīng)的處理,這是一種輪詢的方案,相比于同步阻塞,會(huì)多出若干次的系統(tǒng)調(diào)用,很不合算.
另外還有一種多路復(fù)用的io模式,線程先向內(nèi)核注冊(cè)若干個(gè)感興趣的事件,然后一直等待,在某個(gè)或若干個(gè)事件符合條件后,內(nèi)核將其打包返回,線程接到返回值,再去處理事件.
相比于直接在read/write上block住,同步阻塞多了一個(gè)獲取事件的調(diào)用,因此相比于同步阻塞會(huì)有額外的系統(tǒng)開銷;不過(guò),因?yàn)橐粋€(gè)線程可以同時(shí)監(jiān)聽多個(gè)連接,也就能一次處理若干個(gè)連接,在連接數(shù)較多時(shí)可以節(jié)約線程調(diào)度的成本,優(yōu)勢(shì)明顯.
5.3 異步阻塞
    這個(gè)沒啥說(shuō)的,略 
5.4 異步非阻塞
    用戶線程先發(fā)起io請(qǐng)求,內(nèi)核立刻返回,于是用戶線程就可以做其它的事.在數(shù)據(jù)準(zhǔn)備好之后,內(nèi)核會(huì)將數(shù)據(jù)拷貝到用戶空間,再給用戶線程發(fā)送操作完成的通知.這個(gè)模型下,可以每個(gè)事件一個(gè)線程,也可以每個(gè)連接一個(gè)線程,相比于其他模式,能夠最大化的節(jié)省線程數(shù);另外,由于用戶線程不需要去主動(dòng)檢查,每個(gè)用戶線程都能用滿自己的時(shí)間片,整個(gè)系統(tǒng)的性能值得期待.
理論說(shuō)得這么好可別輕易動(dòng)心,能用夠用省力氣才是王道,一般的用個(gè)同步阻塞就夠了.真要用異步io,最好測(cè)測(cè),以前的linux的異步io實(shí)現(xiàn)的不是太好,不知道現(xiàn)在啥狀況了.
6 java中的模型
jdk一開始僅支持bio模式,也就是同步阻塞模式,在1.4中提供了nio,支持多路復(fù)用,1.7中又引入了aio,支持異步io.

穩(wěn)定

產(chǎn)品高可用性高并發(fā)

貼心

項(xiàng)目群及時(shí)溝通

專業(yè)

產(chǎn)品經(jīng)理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽(yù)

堅(jiān)持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部