• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

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

    穩(wěn)定

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

    貼心

    項目群及時溝通

    專業(yè)

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

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質(zhì)開發(fā)
    • 返回頂部
    精品久久久久中文字幕一区| 日韩电影免费在线观看网站 | 热99RE久久精品这里都是精品免费| 日韩国产精品亚洲а∨天堂免| 国产精品久久久久一区二区| 精品国产一区二区三区| 中文字幕日韩精品麻豆系列| 91精品天美精东蜜桃传媒入口| 久久国内精品自在自线400部o| 国产精品白丝AV网站| 久久国产精品一区二区| 亚洲国产精品一区二区第四页| 日韩精品久久久久久久电影蜜臀| 国产精品午夜小视频观看| 自拍偷自拍亚洲精品偷一| 久久人午夜亚洲精品无码区| 国产精品免费网站| 99视频在线精品免费观看6| 国产伦精品一区二区三区女| 久久久久久久久久久精品尤物| 亚洲综合精品香蕉久久网97| 久久国产乱子伦精品在| 国产九九久久99精品影院| 久久99精品久久久久久清纯| 亚洲国产高清国产拍精品| 亚洲日韩精品国产3区| 国产亚洲精品岁国产微拍精品| 久久久久九国产精品| 日韩精品视频在线观看免费| 日韩高清在线不卡| 精品国产日韩亚洲一区在线| 日韩不卡视频在线| 日本精品久久久久久久久免费| 国产成人精品18| 久久99精品久久久大学生| 久久精品国产2020| 国产成人精品视频在放| 国产精品亚洲综合久久| 久久亚洲精品11p| 无码日韩精品一区二区免费| 免费精品人在线二线三线区别 |