死亡空間2數(shù)據(jù)包(三星980 PRO 2TB 固態(tài)硬盤評(píng)測(cè):凌絕頂 一覽眾山小)
死亡空間2數(shù)據(jù)包文章列表:
- 1、三星980 PRO 2TB 固態(tài)硬盤評(píng)測(cè):凌絕頂 一覽眾山小
- 2、300塊錢在拼多多買的平板電腦,還送12家影視會(huì)員!
- 3、細(xì)思極恐!你的聊天內(nèi)容可能被竊聽?一次都沒打開的App,卻已向外傳輸數(shù)據(jù)…
- 4、超詳細(xì)的Proactor模式&Reactor模式解析
- 5、鎧俠 極至光速系列內(nèi)存卡評(píng)測(cè):經(jīng)典紅白復(fù)刻,唯有品質(zhì)依舊
三星980 PRO 2TB 固態(tài)硬盤評(píng)測(cè):凌絕頂 一覽眾山小
2021年,得益于PC平臺(tái)PCIe 4.0的全面開放、硬件的技術(shù)迭代、高計(jì)算類軟件的盛行、信息化基礎(chǔ)設(shè)施創(chuàng)新等因素影響,使得高性能、大容量的SSD成為驅(qū)動(dòng)大數(shù)字化互聯(lián)網(wǎng)的重要媒介。各大SSD廠商紛紛出臺(tái)相應(yīng)的高性能PCIe 4.0 SSD,加快PCIe 4.0的部署步伐,搶占先機(jī),用一句話來(lái)表示SSD行業(yè)的現(xiàn)狀,新時(shí)代,百花齊放最適合不過。
三星980PRO PCIe 4.0 NVMe SSD 2TB
如果追溯PCIe 4.0 SSD的開始,其實(shí)我們?cè)?9年就已經(jīng)見識(shí)到了,但是由于當(dāng)時(shí)的技術(shù)受到限制,導(dǎo)致那時(shí)的PCIe 4.0 SSD性能并不理想。回到當(dāng)下,隨著日前天花板級(jí)別的三星980PRO PCIe 4.0 NVMe SSD正式發(fā)布,也意味著,存儲(chǔ)新時(shí)代也正式開啟。
在此之前,我們已經(jīng)見識(shí)到了三星980PRO PCIe 4.0 NVMe SSD的優(yōu)勢(shì)所在,而就在近日,三星再次完善產(chǎn)品線,2TB版本也隨之到來(lái),而筆者今天給大家?guī)?lái)的,正是三星980PRO PCIe 4.0 NVMe SSD 2TB版本的評(píng)測(cè),按照慣例,在評(píng)測(cè)之前先來(lái)了解一下這款SSD都有哪些特點(diǎn)。
1、容量方面,最高為2TB,打破了性能與容量不并存這一現(xiàn)象。
2、搭載PCIe 4.0的Elpis新主控,第六代V-NAND閃存顆粒,性能、可靠性全面升級(jí)。
3、二代智能TurboWrite技術(shù),保障連續(xù)大文件高速寫入不掉速。
4、三位一體的智能散熱機(jī)制、將溫度控制在合理的范圍,以保障硬盤壽命以及讀寫性能。
相信大家已將對(duì)這款剛剛發(fā)布的三星980PRO PCIe 4.0 NVMe SSD 2TB產(chǎn)生了濃厚的興趣,接下來(lái)先來(lái)了解一下,這款SSD的一些基礎(chǔ)參數(shù)。
01三星980PRO PCIe 4.0 NVMe SSD 產(chǎn)品概述
三星980PRO PCIe 4.0 NVMe SSD 2TB
三星980PRO PCIe 4.0 NVMe SSD在容量方面具有多重選擇,其中包括,250GB、500GB、1TB、以及最新發(fā)布的2TB版本。2TB版本具有高容量,高性能的特性,定位于旗艦中的旗艦,更加適用于高端的電競(jìng)游戲以及專業(yè)的人士選擇。
在尺寸方面,三星980PRO PCIe 4.0 NVMe SSD采用標(biāo)準(zhǔn)的緊湊型M.2 2280外形,能夠輕松適配筆記本電腦、臺(tái)式機(jī)等相關(guān)設(shè)備,具有不錯(cuò)的兼容性。
在耐用性方面,三星980PRO PCIe 4.0 NVMe SSD 2TB版本提供了1200TB的總寫入字節(jié)數(shù)上限,按照我們每天寫入50GB數(shù)據(jù)來(lái)計(jì)算,理論上可以使用67年之久,再加上三星的5年的售后保障,在耐用性方面,無(wú)須擔(dān)心。
為了讓用戶更好的體驗(yàn)和管理三星980PRO PCIe4.0 SSD旗艦產(chǎn)品,三星研發(fā)了三星Magician管理軟件。這是一款更加利于用戶管理硬盤的軟件,我們可以從中查看固態(tài)硬盤的型號(hào),溫度、固件、接口等關(guān)鍵信息。
相信大家已經(jīng)對(duì)三星980PRO PCIe4.0 SSD已經(jīng)有了一定的了解,接下來(lái)看一看三星980PRO PCIe4.0 SSD的內(nèi)部情況。
02 三星980PRO PCIe4.0 SSD內(nèi)部情況:主控 顆粒
三星980PRO PCIe4.0 SSD從主控到閃存再到緩存全部都由三星自主研發(fā)生產(chǎn),這種端到端集成的做法讓產(chǎn)品得到深度優(yōu)化,可以使產(chǎn)品性能更優(yōu)、質(zhì)量更好、故障率更低。本次拆解的三星980PRO PCIe4.0 SSD是2TB版本。
主控方面,采用了三星針對(duì)PCIE4.0協(xié)議設(shè)計(jì)的全新主控,Elpis主控。Elpis主控采用三星自研的全新8nm制程工藝,全面支持PCIE4.0協(xié)議,同時(shí)能夠滿足下一代開發(fā)、計(jì)算等需求,新的Elpis主控支持128隊(duì)列并行工作,支持128個(gè)I/O隊(duì)列同步進(jìn)行數(shù)據(jù)處理。
相較于上一代的Phoenix主控,隊(duì)列數(shù)(32隊(duì)列)提升了約400%,根據(jù)三星提供的數(shù)據(jù),單個(gè)隊(duì)列下,包含了超過64000命令集,這也就意味著三星Elpis主控內(nèi)部的128個(gè)隊(duì)列,可以同步處理最高超過800萬(wàn)個(gè)命令。
在顆粒方面,搭載的是三星自研第六代V-NAND閃存顆粒,根據(jù)官方介紹,第六代V-NAND顆粒在制程工藝上,充分利用三星獨(dú)創(chuàng)的“通道孔蝕刻”技術(shù),通過建立一個(gè)由100多個(gè)層組成的導(dǎo)電晶片堆棧,然后從上到下垂直穿孔,形成均勻的三維電荷阱閃存(CTF)單元,從而實(shí)現(xiàn)了,堆棧結(jié)構(gòu)增加了大約40%的存儲(chǔ)單元。
眾所周知的是,隨著每個(gè)單元區(qū)域中的晶片堆疊高度的增加,NAND閃存芯片更容易出現(xiàn)錯(cuò)誤和讀取延遲。為了克服這些限制,三星采用了速度優(yōu)化的電路設(shè)計(jì),使其能夠?qū)崿F(xiàn)比第五代V-NAND更快的數(shù)據(jù)傳輸速度,寫入操作的時(shí)間少于450微秒(μs),讀取操作的時(shí)間少于45μs。與上一代產(chǎn)品相比,性能提高了10%以上,而功耗降低了15%以上。
單位閃存容量的提升,使得筆者手上這款2TB容量的三星980PRO PCIe 4.0 NVMe SSD 2TB僅需要兩顆閃存顆粒,便能為用戶提供高達(dá)2TB大小的存儲(chǔ)容量。
03 基準(zhǔn)測(cè)試:探索消費(fèi)級(jí)SSD的巔峰性能
測(cè)試平臺(tái)介紹
為了能夠發(fā)揮出三星980PRO PCIe4.0 SSD的實(shí)力所在,在處理器方面我們使用的是AMD最新發(fā)布的Ryzen 9 5950X,動(dòng)態(tài)加速頻率4.9GHz。16核心32線程。主板使用的是微星X570暗黑板,內(nèi)存設(shè)置頻率為3600MHz。
CrystalDiskMark測(cè)試
CrystalDiskMark是一款來(lái)自日本的老牌硬盤性能測(cè)試軟件,它能夠在保證了連續(xù)讀寫、512KB和4KB數(shù)據(jù)包隨機(jī)讀寫性能,以及隊(duì)列深度(Queue Depth)為32的情況下的4K隨機(jī)性能等常規(guī)測(cè)試外,還在隊(duì)列設(shè)置,性能描述,以及測(cè)試數(shù)據(jù)塊選擇上都進(jìn)行了優(yōu)化,更符合當(dāng)下硬盤的測(cè)試需求。
在CrystalDiskMark測(cè)試測(cè)試中我們可以看到,三星980PRO PCIe4.0 SSD 2TB的順序讀取速度達(dá)到了7121.2MB/s,順序?qū)懭胨俣冗_(dá)到了5176.4MB/s。
Txbench測(cè)試
Txbench是一款能夠從不同隊(duì)列,不同數(shù)據(jù)塊進(jìn)行存儲(chǔ)性能測(cè)試的老牌軟件。
在Txbench的測(cè)試中,三星980PRO PCIe4.0 SSD 2TB的最大順序讀取速度為6861.505MB/s,順序?qū)懭胨俣葹?973.357MB/s。
綜合CrystalDiskMark、Txbench等三個(gè)軟件的連續(xù)性能測(cè)試,三星980PRO PCIe4.0 SSD 2TB的成績(jī)十分出色,與官方宣傳的數(shù)據(jù)幾乎一致。
04 4K隨機(jī)測(cè)試
接下來(lái)進(jìn)入4K隨機(jī)測(cè)試環(huán)節(jié),我們將使用AS SSD進(jìn)行測(cè)試,AS SSD Benchmark是一個(gè)專門為SSD測(cè)試而設(shè)計(jì)的標(biāo)準(zhǔn)檢測(cè)程序,它涵蓋了持續(xù)性讀寫、單線程4KB隨機(jī)讀寫、64線程4KB隨機(jī)讀寫以及磁盤尋道時(shí)間等關(guān)鍵數(shù)據(jù)的測(cè)試,最后還會(huì)根據(jù)公式將成績(jī)標(biāo)準(zhǔn)化,能比較科學(xué)的反映固態(tài)硬盤的真實(shí)性能。
在AS SSD測(cè)試中,我們可以看到三星980PRO PCIe4.0 SSD 2TB最大隨機(jī)讀取的IOPS值達(dá)到了637K iops,最大隨機(jī)寫入值則達(dá)到了798K iops,對(duì)比PCIE 3.0時(shí)代,提升十分顯著。由于平臺(tái)的緣故,在隨機(jī)速度方面,并沒有測(cè)出三星980PRO PCIe4.0 SSD 2TB真實(shí)性能。
05 穩(wěn)定性測(cè)試
當(dāng)然,固態(tài)硬盤的穩(wěn)定性是一個(gè)重要環(huán)節(jié),目前市面上有很多的固態(tài)硬盤會(huì)內(nèi)置SLC加速機(jī)制,會(huì)導(dǎo)致在大數(shù)據(jù)傳輸過程中,前后性能會(huì)有明顯的差異,無(wú)法真實(shí)反應(yīng)產(chǎn)品的性能,所以本次測(cè)試使用HDTune軟件,來(lái)驗(yàn)證三星980PRO PCIe4.0 SSD 2TB的真實(shí)效能。
鑒于當(dāng)前HDTune軟件文件基礎(chǔ)項(xiàng)目自身的設(shè)計(jì),無(wú)法進(jìn)行超過200000M長(zhǎng)度的寫入測(cè)試,于是我們便設(shè)置200GB的文件長(zhǎng)度進(jìn)行實(shí)際讀寫的穩(wěn)定性測(cè)試。
從HDTune軟件測(cè)試中我們可以看到,三星980PRO PCIe4.0 SSD 2TB經(jīng)過文件長(zhǎng)度為200GB的寫入后,沒有任何掉速的表現(xiàn),穩(wěn)成一條直線。這也能夠看出,三星980PRO PCIe4.0 SSD 2TB的動(dòng)態(tài)緩存已經(jīng)超過了200GB,這對(duì)于我們?nèi)粘5臄?shù)據(jù)大文件交互已經(jīng)足夠了。
為了進(jìn)一步驗(yàn)證三星980PRO PCIe4.0 SSD 2TB的緩存容量,筆者進(jìn)行了基準(zhǔn)測(cè)試中的寫入測(cè)試,文件長(zhǎng)度為300GB,一次來(lái)測(cè)試三星980PRO PCIe4.0 SSD 2TB的緩存容量。
從測(cè)試中我們能夠看出,三星980PRO PCIe4.0 SSD 2TB在連續(xù)寫入240GB長(zhǎng)度的文件后,出現(xiàn)了掉速,這也就意味著,三星980PRO PCIe4.0 SSD 2TB的緩存大小為240GB左右。
提到緩存,就不得不說(shuō)三星獨(dú)創(chuàng)的TurboWrite技術(shù),借助TurboWrite,在固態(tài)硬盤中創(chuàng)建一個(gè)固定空間的高性能SLC寫入緩沖區(qū),在一定寫入容量下維持SLC級(jí)別的高性能,進(jìn)而實(shí)現(xiàn)了維持高性能的寫入。此次全新升級(jí)的智能TurboWrite2.0,可自動(dòng)識(shí)別用戶的工作負(fù)載,并指定合適的SLC緩沖區(qū),也就是說(shuō)TurboWrite2.0能夠智能的識(shí)別用戶當(dāng)前的存儲(chǔ)工作負(fù)載,根據(jù)負(fù)載的不同,動(dòng)態(tài)調(diào)整高性能SLC寫入緩沖區(qū)配比;在緩存容量方面,相較于初代的TurboWrite機(jī)制,提供了高達(dá)5倍的緩沖區(qū)容量。
06 三位一體增強(qiáng)型散熱機(jī)制
硬件產(chǎn)品隨著性能的提升,隨之而來(lái)的就是熱量,計(jì)算量加快,熱量增多是很容易理解的。此次三星980PRO PCIe4.0 SSD 2TB搭載的是三星獨(dú)有的三位一體增強(qiáng)型散熱機(jī)制,散熱機(jī)制的核心分別是銅箔散熱標(biāo)簽、Elpis控制器上的鎳涂層,以及先進(jìn)的動(dòng)態(tài)散熱保護(hù)(DTG)技術(shù),從硬件到軟件的全面覆蓋,讓SSD擁有了更好的散熱表現(xiàn)。
根據(jù)三星官方提供的數(shù)據(jù),Elpis控制器上的鎳涂層在常規(guī)工作環(huán)境下,比對(duì)沒有涂層的產(chǎn)品,二者平均溫度差異在7℃;銅箔散熱標(biāo)簽部分,帶有銅箔散熱標(biāo)簽?zāi)軌蜓泳廌TG散熱保護(hù)觸發(fā)時(shí)間接近30%左右;至于最為核心的動(dòng)態(tài)散熱保護(hù)(DTG)技術(shù),則是三星自研一項(xiàng)能夠監(jiān)控固態(tài)硬盤產(chǎn)品溫度,并為了提供過熱保護(hù)的預(yù)警機(jī)制,它應(yīng)用在三星品牌存儲(chǔ)多款旗艦級(jí)產(chǎn)品之中,它的核心功能一言以蔽之,便是,人為的設(shè)定一個(gè)閾值,當(dāng)固態(tài)硬盤工作溫度達(dá)到閾值的時(shí)候,動(dòng)態(tài)散熱保護(hù)(DTG)技術(shù)便會(huì)被觸發(fā),減少和降低主控工作頻率,直到溫度降至安全區(qū)。
這也使得,三星980PRO PCIe4.0 SSD 2TB將擁有出色的散熱能力,進(jìn)一步保障SSD性能的穩(wěn)定發(fā)揮。
07 寫在最后
三星980PRO PCIe4.0 SSD 2TB可以說(shuō)是三星目前最出色的一款高性能SSD,搭載了三星自主研發(fā)第六代V-NAND 3bit MLC顆粒,最新一代Elpis主控,集成了三星數(shù)年來(lái)在NAND閃存行業(yè)的技術(shù)積累和產(chǎn)品創(chuàng)新,實(shí)現(xiàn)了性能的突破。
那么,這款產(chǎn)品究竟會(huì)給我們帶來(lái)哪些體驗(yàn)?從應(yīng)用角度來(lái)說(shuō),三星980PRO PCIe4.0 SSD 2TB最高讀取速度突破7000MB/s,最大寫入速度突破5100MB/s,這對(duì)于我們?nèi)粘5臄?shù)據(jù)交互有著明顯提升,例如文件拷貝,數(shù)據(jù)傳輸?shù)取T陔S機(jī)速度方面,據(jù)官方了解,能夠達(dá)到1000K IOPS,同比于PCIe 3.0 SSD,有了飛躍式的提升,這將會(huì)給我們帶來(lái)更加流暢的體驗(yàn),例如軟件的啟動(dòng)、加載等。
站在行業(yè)角度,三星980PRO PCIe4.0 SSD 2TB的誕生,完美地解決了高性能SSD容量不足的短板,是PCIe 4.0SSD硬盤歷程的必經(jīng)之路,也為高性能SSD發(fā)展進(jìn)程中寫下濃墨重彩的一筆。
如果你對(duì)高性能且大容量的SSD有一定的興趣,不妨嘗試這款三星980PRO PCIe4.0 SSD 2TB,體驗(yàn)PC絲滑般的體驗(yàn)。感興趣的同學(xué)快來(lái)吧~https://item.jd.com/100018171904.html
(7619122)
300塊錢在拼多多買的平板電腦,還送12家影視會(huì)員!
更多奇葩好玩的科技互聯(lián)網(wǎng)揭秘,歡迎點(diǎn)擊右上角關(guān)注我~
最近托尼被 PDD 上一款平板電腦吸引了,號(hào)稱 “ 超薄新款還送影視會(huì)員加 500 話費(fèi) ”,有這樣的好事?
對(duì)托尼我來(lái)說(shuō),多一秒猶豫就是對(duì)自己錢包的不尊重,就那個(gè)頂配, 362 元的土豪金,來(lái)一個(gè)!
在等待了長(zhǎng)達(dá)五六天后,終于到了! 包裝還是蠻結(jié)實(shí)的嘛~
打開之后這大禮包也是蠻豐盛的,給大家看一下。
耳機(jī),數(shù)據(jù)線、 3D 眼鏡、移動(dòng) wifi 、智能運(yùn)動(dòng)手表、鍵盤等應(yīng)有盡有,好久沒遇到這么良心的賣家了,感覺為你想到了你能用到的一切。
不過這智能運(yùn)動(dòng)手表好像還沒用沒電了。。。
先不管那么多了,先開機(jī)吧!
屏幕尺寸大概是 7 英寸多,安卓系統(tǒng),感覺界面有點(diǎn)老,像安卓 4.0 時(shí)代的界面,不過托尼也不敢確定,也許是獨(dú)家定制的呢~
還是先用安兔兔測(cè)試一下吧,跑分接近 7 萬(wàn)分!
安卓 8.0 系統(tǒng),屏幕分辨率 2560*1600 ,聯(lián)發(fā)科新款 MT6797 處理器,也就是 Helio X20 ,運(yùn)行內(nèi)存 8GB 、存儲(chǔ)空間 256G ,這妥妥的主流配置啊!
感覺托尼我這次賺大了,就這 256G 內(nèi)存就夠我看好多電影了!
想想還是有點(diǎn)不對(duì),托尼我怎么說(shuō)也是個(gè)老編輯,這 UI 界面怎么也不像安卓 8.0 啊,于是我嘗試自己去官網(wǎng)下載一個(gè)安兔兔測(cè)試。
沒想到。。。 提示 “ 已安裝了存在簽名沖突的同名數(shù)據(jù)包 ” ,
無(wú)法安裝從官網(wǎng)下載的安兔兔。。。
我x。。。我就說(shuō)沒這么好的事情,原來(lái)這自帶的安兔兔是為托尼量身定制。。。
不甘心的我又去下載了其它測(cè)試軟件, AIDA64 和 CPU Z ,這下原形畢露了吧!
可以從這兩款測(cè)試軟件中發(fā)現(xiàn),這款平板電腦的處理器不是它所說(shuō)的 MT6797 ,而是一款 2013 年發(fā)布的低端處理器 MT6582 ,運(yùn)行內(nèi)存只有 1GB 。
屏幕分辨率只有 1280*800 ,就是一個(gè)普通的 16:10 比例的 720P 屏幕。但是系統(tǒng)依然顯示為安卓 8.0 ,存儲(chǔ)空間為 256G 。
這都是普通用戶難以發(fā)現(xiàn)的地方,專業(yè)測(cè)試軟件都不一定能測(cè)出來(lái)。
所以托尼把用數(shù)據(jù)線把平板連接電腦,再把托尼珍藏的一些電影往里面復(fù)制,結(jié)果發(fā)現(xiàn)當(dāng)文件在 11G 左右的時(shí)候就已經(jīng)無(wú)法復(fù)制進(jìn)去,
再加上本身托尼已經(jīng)下載的幾個(gè)軟件還有本身系統(tǒng)占用的內(nèi)存,托尼大致推測(cè),這部平板的實(shí)際存儲(chǔ)空間應(yīng)該在 16G 左右,而不是 256G 。
虧我還買了頂配,就是這樣對(duì)待我這種尊貴客戶的?
說(shuō)是支持雙卡雙待,托尼插了兩個(gè)卡上去,一點(diǎn)沒有信號(hào)。( 不排除我卡沒插好,雖然我插了很多次了。)
對(duì)了,后殼是我翹掉的,給大家看下內(nèi)部,不過需要注意的是,這個(gè)后殼是膠水粘上去的,所以翹掉以后就粘不回去了。。。
做工不是很好
這都沒事,我忍了,不是還送了價(jià)值 1755 元的 12 大視頻 APP 的會(huì)員嘛?
哎,我大西瓜視頻不是沒有廣告沒有會(huì)員嗎。。。不管了,有愛奇藝和優(yōu)酷就行~
領(lǐng)取方式是這樣的,在附送的禮包里有一張充值卡,
你先下載這個(gè)充值卡上的某通 APP 軟件,然后把這個(gè) 500 元充值進(jìn)去,
這個(gè)APP里面還有影視專區(qū),不過一個(gè)月影視會(huì)員要用 20 元話費(fèi)兌換,
不過想想有 500 塊,兌換一下也無(wú)妨,哥有的是話費(fèi)!
說(shuō)好的 12 個(gè)APP呢,這只有七個(gè)啊。。。
word 天,真的能看會(huì)員電影???
而且這個(gè)軟件還是真的能打電話的,就是一個(gè)我們以前經(jīng)常用的網(wǎng)絡(luò)電話 APP ,收費(fèi) 2 毛錢一分鐘, 500 塊錢能用 2500 分鐘,雖然網(wǎng)絡(luò)電話通話質(zhì)量不高,容易聽不清,但考慮到同類 APP 充值同樣通話時(shí)長(zhǎng)市場(chǎng)價(jià)也是需要 100 多塊錢的,這個(gè)托尼我賺了,還挺實(shí)用!
那看起來(lái)配置這么渣,這平板還能不能用?
托尼試了一下,看電視效果還 OK 。
打王者榮耀,居然也沒問題!
這個(gè)真得感謝騰訊有點(diǎn)良心了,這游戲優(yōu)化的可真好啊,讓人淚流滿面~
362 元的平板,能看電視、能打小游戲, 16G 內(nèi)存、免費(fèi)的網(wǎng)絡(luò)電話還不錯(cuò),可以看七大視頻 APP 會(huì)員電影( 這應(yīng)該是里面最好的東西了 ),對(duì)于一些朋友來(lái)說(shuō)可能真的有用,雖然平板運(yùn)行有點(diǎn)卡,但勉強(qiáng)能接受,畢竟大多用戶買來(lái)應(yīng)該還是看視頻的,有會(huì)員美滋滋啊!
而賣家最大的問題就是故意欺瞞標(biāo)高配置,如果你標(biāo)明產(chǎn)品配置,正兒八經(jīng)的賣,想必也會(huì)有人買,當(dāng)然賣的數(shù)量可能沒兩萬(wàn)多件這么多~
但賣家就沒想做長(zhǎng)久生意,打一槍換個(gè)地方,這個(gè)店鋪就這么一件商品,一件賺個(gè) 50 元,兩三萬(wàn)個(gè),就是幾十萬(wàn)啊。。。
也許哪天拼多多變了,搖身一變做一個(gè) “ 多多精選 ”,但現(xiàn)在很明顯,它還在與假貨劣質(zhì)商品打的不可開交。
為什么會(huì)有那么多好評(píng), 30 元好評(píng)返現(xiàn)說(shuō)明了一切。。。
“ 突然有點(diǎn)心動(dòng)?”
細(xì)思極恐!你的聊天內(nèi)容可能被竊聽?一次都沒打開的App,卻已向外傳輸數(shù)據(jù)…
來(lái)源:央視財(cái)經(jīng)
現(xiàn)在,我們手機(jī)中都安裝了各種應(yīng)用,也就是各種App,的確方便了我們的工作、生活,但是也獲取了我們大量的個(gè)人信息。一些App的推送能“精準(zhǔn)”到你在想什么,它就給你推送什么。App的這種“正合我意”是怎么實(shí)現(xiàn)的?個(gè)人信息安全有沒有風(fēng)險(xiǎn)呢?
App獲取個(gè)人信息 用戶感覺“被竊聽”
△央視財(cái)經(jīng)《第一時(shí)間》欄目視頻
北京的苑慶攀最近有個(gè)疑惑,和朋友只在線下閑聊過的東西,第二天就出現(xiàn)在自己手機(jī)應(yīng)用的推送里。
手機(jī)用戶 苑慶攀:朋友說(shuō)椰棗,過了一天我就刷到了關(guān)于椰棗的推薦視頻。我覺得很驚訝,我除了說(shuō),沒有任何搜索記錄,咋就給我推薦了?
過于精準(zhǔn)的推送內(nèi)容,讓苑慶攀感覺“后背發(fā)涼”。而這并不是苑慶攀一個(gè)人的感受。
手機(jī)用戶 李先生:有的App使用的話就要把通訊錄等信息都授權(quán),我都不知道為什么要授權(quán)這些信息。
手機(jī)用戶 紀(jì)女士:輸入自己的手機(jī)號(hào)發(fā)送驗(yàn)證碼之類的,第二天或者過幾天就會(huì)有不知名的一些電話打進(jìn)來(lái),推銷一些東西。
就在上周,工信部公布了2020年第二批侵害用戶權(quán)益行為的App名單。在被點(diǎn)名的15個(gè)App中,有13個(gè)都涉及個(gè)人信息的過度收集,包括“私自收集個(gè)人信息”“超范圍收集個(gè)人信息”“私自共享給第三方”等等,個(gè)人信息安全依然受到威脅。
中國(guó)信息通信研究院泰爾終端實(shí)驗(yàn)室信息安全部主任 寧華:在后臺(tái)運(yùn)行時(shí),未經(jīng)用戶同意,按照一定的時(shí)間間隔定期調(diào)用系統(tǒng)API接口,頻繁獲取位置、應(yīng)用列表等用戶個(gè)人信息。這些新現(xiàn)象新問題已成為今年App個(gè)人信息保護(hù)治理的新重點(diǎn)。
而一些非法網(wǎng)絡(luò)推廣團(tuán)伙也盯上了個(gè)人的信息。今年以來(lái),公安部在15個(gè)省份開展打擊貸款類網(wǎng)絡(luò)詐騙犯罪,發(fā)現(xiàn)非法團(tuán)伙就是將矛頭指向有明確貸款意向的人員,根據(jù)他們?cè)诨ヂ?lián)網(wǎng)、手機(jī)App等的瀏覽、搜索記錄,分析其貸款意向,從而精準(zhǔn)推送大量虛假貸款廣告,并實(shí)施詐騙。
360集團(tuán)安全研究員 俞奎:他拿到你的通訊錄,又拿到短信,他可能知道你近段時(shí)間有借貸需求,這個(gè)時(shí)候他就可能會(huì)把這些數(shù)據(jù)進(jìn)行二次販賣,比如賣給一些專門做詐騙的人員。
手段隱蔽 多款A(yù)pp違規(guī)收集個(gè)人信息
面對(duì)越來(lái)越精準(zhǔn)的推送,用戶有著擔(dān)心“被竊聽”的焦慮,個(gè)人信息也確實(shí)存在過度獲取的可能。為此,國(guó)家有關(guān)部門專門組建了App專項(xiàng)治理工作組,對(duì)強(qiáng)制授權(quán)、過度索權(quán)、超范圍收集個(gè)人信息等現(xiàn)象進(jìn)行專業(yè)的監(jiān)管。精準(zhǔn)推送怎么實(shí)現(xiàn)?過度獲取怎么界定?
App專項(xiàng)治理工作組專家 何延哲:第一個(gè)數(shù)據(jù)包出現(xiàn)了,我們?cè)俚鹊龋诙€(gè)數(shù)據(jù)包也出來(lái)了,我點(diǎn)開數(shù)據(jù)包,這里面就有一個(gè)是設(shè)備的IMEI號(hào)(移動(dòng)設(shè)備標(biāo)識(shí)號(hào))的標(biāo)識(shí)符。
在App專項(xiàng)治理工作組,針對(duì)個(gè)人信息保護(hù)的測(cè)試正在緊張地進(jìn)行。檢測(cè)工具顯示,這款社交類App剛安裝進(jìn)手機(jī),一次都還沒有打開,卻已經(jīng)開始悄悄地向外傳輸數(shù)據(jù)。
App專項(xiàng)治理工作組專家 何延哲:App在隱私政策里沒有提這件事,而且完全是隱瞞了它的自啟動(dòng)的方式,自己又把信息傳到了自己的服務(wù)器上,是有實(shí)證的。明確是違法、違規(guī)收集的一種行為。
專家告訴記者,App獲取的第一個(gè)信息,往往就是手機(jī)的IMEI號(hào),也就是移動(dòng)設(shè)備標(biāo)識(shí)號(hào)。這個(gè)唯一的識(shí)別碼,相當(dāng)于手機(jī)的身份證。不管是經(jīng)過用戶同意“拿走”,還是不經(jīng)允許“偷走”,App一旦獲得了移動(dòng)設(shè)備標(biāo)識(shí)號(hào),就為個(gè)性化推送奠定了基礎(chǔ)。更可怕的是,專項(xiàng)治理工作組對(duì)大量App測(cè)試后發(fā)現(xiàn),App獲取的信息,不僅能自己用,甚至有部分App,會(huì)把信息傳給第三方。
App專項(xiàng)治理工作組專家 何延哲:這是一款第三方SDK(軟件開發(fā)工具包),它通過自啟動(dòng)之后的機(jī)制,把用戶手機(jī)上的IMEI號(hào)這樣的信息傳走了。
專家介紹,在個(gè)別App內(nèi)嵌入的第三方軟件開發(fā)工具包超過50個(gè)。這些有著消息推送等功能的第三方工具包,行為更隱蔽,也是目前監(jiān)管的難點(diǎn)。
360集團(tuán)首席安全官 杜躍進(jìn):法律在一般情況下有一些認(rèn)定,比如通訊錄數(shù)據(jù)、短信的數(shù)據(jù)、點(diǎn)對(duì)點(diǎn)通信數(shù)據(jù),是絕對(duì)不能被采集的,但是其他有一些地方其實(shí)就不那么清楚。
浙江大學(xué)網(wǎng)絡(luò)空間安全研究中心研究員 周亞金:有一個(gè)所謂叫最小特權(quán)原則,就是說(shuō)如果你不這么做,或者你把某一項(xiàng)你需要的權(quán)限給拿掉,或者你把你目前在后臺(tái)做的某一個(gè)操作給拿掉,它不影響你App的正常功能,這個(gè)權(quán)限你實(shí)際上就不應(yīng)該獲取。
專家:獲取技術(shù)在進(jìn)步 信息保護(hù)在加碼
近年來(lái),有關(guān)部門定期針對(duì)App違法獲取個(gè)人信息的行為進(jìn)行曝光,針對(duì)App的各項(xiàng)隱私政策也在不斷細(xì)化和規(guī)范。
專家分析,因?yàn)楂@取成本高、法律風(fēng)險(xiǎn)大,短期內(nèi),大家不必過于擔(dān)心自己的語(yǔ)音、上傳的圖片等隱私信息被收集。
App專項(xiàng)治理工作組專家 何延哲:完全沒必要用竊聽這么復(fù)雜高級(jí)的手段,去針對(duì)某一個(gè)人的購(gòu)物需求去做這樣的事。造成精準(zhǔn)推送的原因有很多,有可能是你的好友搜了一個(gè)商品,它可能知道你們是好友關(guān)系,可能就會(huì)給這些人都會(huì)推這樣的信息,但是你感覺好像是自己的原因,好像被“竊聽”了。
不過,專家也提醒,越來(lái)越多新的技術(shù)手段正在降低用戶信息獲取的成本和風(fēng)險(xiǎn)。今年,浙江大學(xué)的最新研究成果顯示,手機(jī)App甚至可以利用手機(jī)內(nèi)置的加速度傳感器,采集手機(jī)揚(yáng)聲器所發(fā)出的聲音振動(dòng)頻率。這樣的技術(shù),可以在用戶不知情的情況下,繞開隱私協(xié)議,合法地獲取語(yǔ)音信息。
360集團(tuán)首席安全官 杜躍進(jìn) :普通用戶能做的很有限,最多就是看一看App里面的隱私聲明,但是稍微大一點(diǎn)的App,也都會(huì)知道在法規(guī)上文字上是不會(huì)有問題的。
浙江大學(xué)網(wǎng)絡(luò)空間安全研究中心研究員周亞金 :一些廠商可以提出繞過隱私協(xié)議的一些機(jī)制,來(lái)繼續(xù)訪問用戶的隱私行為,但是也不彈窗,也不會(huì)被發(fā)現(xiàn),這個(gè)其實(shí)技術(shù)上的攻防是一直存在的。
與此同時(shí),個(gè)人信息的保護(hù)也一直在不斷加強(qiáng)。去年12月,國(guó)家網(wǎng)信辦出臺(tái)《App違法違規(guī)收集使用個(gè)人信息行為認(rèn)定方法》,強(qiáng)化用戶的知情權(quán)和決定權(quán)。
App專項(xiàng)治理工作組專家 何延哲:能夠關(guān)閉這也是一種控制,廣告太精準(zhǔn)了,恐怕最后起到的效果不一定很好,這里面就需要制定一些規(guī)則,比如用戶畫像,不一定做一些直接的畫像,比如可能這一群人喜歡足球、喜歡讀書,這是一種愛好習(xí)慣,就用這種寬泛性的愛好習(xí)慣來(lái)代替對(duì)于個(gè)人的精準(zhǔn)的需求。
超詳細(xì)的Proactor模式&Reactor模式解析
一、簡(jiǎn)介
服務(wù)器端編程經(jīng)常需要構(gòu)造高性能的IO模型,常見的IO模型有四種:
(1)同步阻塞IO(BlockingIO):即傳統(tǒng)的IO模型。
(2)同步非阻塞IO(Non-blockingIO):默認(rèn)創(chuàng)建的socket都是阻塞的,非阻塞IO要求socket被設(shè)置為NONBLOCK。注意這里所說(shuō)的NIO并非Java的NIO(NewIO)庫(kù)。
(3)IO多路復(fù)用(IOMultiplexing):即經(jīng)典的Reactor設(shè)計(jì)模式,有時(shí)也稱為異步阻塞IO,Java中的Selector和Linux中的epoll都是這種模型。
(4)異步IO(AsynchronousIO):即經(jīng)典的Proactor設(shè)計(jì)模式,也稱為異步非阻塞IO。
同步和異步的概念描述的是用戶線程與內(nèi)核的交互方式:同步是指用戶線程發(fā)起IO請(qǐng)求后需要等待或者輪詢內(nèi)核IO操作完成后才能繼續(xù)執(zhí)行;而異步是指用戶線程發(fā)起IO請(qǐng)求后仍繼續(xù)執(zhí)行,當(dāng)內(nèi)核IO操作完成后會(huì)通知用戶線程,或者調(diào)用用戶線程注冊(cè)的回調(diào)函數(shù)。
阻塞和非阻塞的概念描述的是用戶線程調(diào)用內(nèi)核IO操作的方式:阻塞是指IO操作需要徹底完成后才返回到用戶空間;而非阻塞是指IO操作被調(diào)用后立即返回給用戶一個(gè)狀態(tài)值,無(wú)需等到IO操作徹底完成。
另外,RichardStevens在《Unix網(wǎng)絡(luò)編程》卷1中提到的基于信號(hào)驅(qū)動(dòng)的IO(SignalDrivenIO)模型,由于該模型并不常用,本文不作涉及。接下來(lái),我們?cè)敿?xì)分析四種常見的IO模型的實(shí)現(xiàn)原理。為了方便描述,我們統(tǒng)一使用IO的讀操作作為示例。
二、同步阻塞IO
同步阻塞IO模型是最簡(jiǎn)單的IO模型,用戶線程在內(nèi)核進(jìn)行IO操作時(shí)被阻塞。
如圖1所示,用戶線程通過系統(tǒng)調(diào)用read發(fā)起IO讀操作,由用戶空間轉(zhuǎn)到內(nèi)核空間。內(nèi)核等到數(shù)據(jù)包到達(dá)后,然后將接收的數(shù)據(jù)拷貝到用戶空間,完成read操作。
用戶線程使用同步阻塞IO模型的偽代碼描述為:
1 {2 read(socket, buffer);3 process(buffer);4 }
即用戶需要等待read將socket中的數(shù)據(jù)讀取到buffer后,才繼續(xù)處理接收的數(shù)據(jù)。整個(gè)IO請(qǐng)求的過程中,用戶線程是被阻塞的,這導(dǎo)致用戶在發(fā)起IO請(qǐng)求時(shí),不能做任何事情,對(duì)CPU的資源利用率不夠。
三、同步非阻塞IO
同步非阻塞IO是在同步阻塞IO的基礎(chǔ)上,將socket設(shè)置為NONBLOCK。這樣做用戶線程可以在發(fā)起IO請(qǐng)求后可以立即返回。
如圖2所示,由于socket是非阻塞的方式,因此用戶線程發(fā)起IO請(qǐng)求時(shí)立即返回。但并未讀取到任何數(shù)據(jù),用戶線程需要不斷地發(fā)起IO請(qǐng)求,直到數(shù)據(jù)到達(dá)后,才真正讀取到數(shù)據(jù),繼續(xù)執(zhí)行。
用戶線程使用同步非阻塞IO模型的偽代碼描述為:
1 {2 while(read(socket, buffer) != SUCCESS);3 process(buffer);4 }
即用戶需要不斷地調(diào)用read,嘗試讀取socket中的數(shù)據(jù),直到讀取成功后,才繼續(xù)處理接收的數(shù)據(jù)。整個(gè)IO請(qǐng)求的過程中,雖然用戶線程每次發(fā)起IO請(qǐng)求后可以立即返回,但是為了等到數(shù)據(jù),仍需要不斷地輪詢、重復(fù)請(qǐng)求,消耗了大量的CPU的資源。一般很少直接使用這種模型,而是在其他IO模型中使用非阻塞IO這一特性。
四、IO多路復(fù)用
IO多路復(fù)用模型是建立在內(nèi)核提供的多路分離函數(shù)select、poll以及epoll基礎(chǔ)之上的,使用這些函數(shù)可以避免同步非阻塞IO模型中輪詢等待的問題,因?yàn)橛脩艟€程將這個(gè)輪詢的過程將給內(nèi)核來(lái)執(zhí)行,而自己則表現(xiàn)為阻塞態(tài)。
如圖3所示,用戶首先將需要進(jìn)行IO操作的socket添加到select中,然后阻塞等待select系統(tǒng)調(diào)用返回。當(dāng)數(shù)據(jù)到達(dá)時(shí),socket被激活,select函數(shù)返回。用戶線程正式發(fā)起read請(qǐng)求,讀取數(shù)據(jù)并繼續(xù)執(zhí)行。
從流程上來(lái)看,使用select函數(shù)進(jìn)行IO請(qǐng)求和同步阻塞模型沒有太大的區(qū)別,甚至還多了添加監(jiān)視socket,以及調(diào)用select函數(shù)的額外操作,效率更差。但是,使用select以后最大的優(yōu)勢(shì)是用戶可以在一個(gè)線程內(nèi)同時(shí)處理多個(gè)socket的IO請(qǐng)求。用戶可以注冊(cè)多個(gè)socket,然后不斷地調(diào)用select讀取被激活的socket,即可達(dá)到在同一個(gè)線程內(nèi)同時(shí)處理多個(gè)IO請(qǐng)求的目的。而在同步阻塞模型中,必須通過多線程的方式才能達(dá)到這個(gè)目的。
用戶線程使用select函數(shù)的偽代碼描述為:
1 { 2 select(socket); 3 while(1) 4 { 5 sockets = select(); 6 for(socket in sockets) { 7 if(can_read(socket)) { 8 read(socket, buffer); 9 process(buffer);10 }11 }12 }13 }
其中while循環(huán)前將socket添加到select監(jiān)視中,然后在while內(nèi)一直調(diào)用select獲取被激活的socket,一旦socket可讀,便調(diào)用read函數(shù)將socket中的數(shù)據(jù)讀取出來(lái)。
然而,使用select函數(shù)的優(yōu)點(diǎn)并不僅限于此。雖然上述方式允許單線程內(nèi)處理多個(gè)IO請(qǐng)求,但是每個(gè)IO請(qǐng)求的過程還是阻塞的(在select函數(shù)上阻塞),平均時(shí)間甚至比同步阻塞IO模型還要長(zhǎng)。如果用戶線程只注冊(cè)自己感興趣的socket或者IO請(qǐng)求,然后去做自己的事情,等到數(shù)據(jù)到來(lái)時(shí)再進(jìn)行處理,則可以提高CPU的利用率。
IO多路復(fù)用模型使用了Reactor設(shè)計(jì)模式實(shí)現(xiàn)了這一機(jī)制。
圖4Reactor設(shè)計(jì)模式
如圖4所示,EventHandler抽象類表示IO事件處理器,它擁有IO文件句柄Handle(通過get_handle獲取),以及對(duì)Handle的操作handle_event(讀/寫等)。繼承于EventHandler的子類可以對(duì)事件處理器的行為進(jìn)行定制。Reactor類用于管理EventHandler(注冊(cè)、刪除等),并使用handle_events實(shí)現(xiàn)事件循環(huán),不斷調(diào)用同步事件多路分離器(一般是內(nèi)核)的多路分離函數(shù)select,只要某個(gè)文件句柄被激活(可讀/寫等),select就返回(阻塞),handle_events就會(huì)調(diào)用與文件句柄關(guān)聯(lián)的事件處理器的handle_event進(jìn)行相關(guān)操作。
如圖5所示,通過Reactor的方式,可以將用戶線程輪詢IO操作狀態(tài)的工作統(tǒng)一交給handle_events事件循環(huán)進(jìn)行處理。用戶線程注冊(cè)事件處理器之后可以繼續(xù)執(zhí)行做其他的工作(異步),而Reactor線程負(fù)責(zé)調(diào)用內(nèi)核的select函數(shù)檢查socket狀態(tài)。當(dāng)有socket被激活時(shí),則通知相應(yīng)的用戶線程(或執(zhí)行用戶線程的回調(diào)函數(shù)),執(zhí)行handle_event進(jìn)行數(shù)據(jù)讀取、處理的工作。由于select函數(shù)是阻塞的,因此多路IO復(fù)用模型也被稱為異步阻塞IO模型。注意,這里的所說(shuō)的阻塞是指select函數(shù)執(zhí)行時(shí)線程被阻塞,而不是指socket。一般在使用IO多路復(fù)用模型時(shí),socket都是設(shè)置為NONBLOCK的,不過這并不會(huì)產(chǎn)生影響,因?yàn)橛脩舭l(fā)起IO請(qǐng)求時(shí),數(shù)據(jù)已經(jīng)到達(dá)了,用戶線程(相當(dāng)于工作線程)一定不會(huì)被阻塞。
用戶線程使用IO多路復(fù)用模型的偽代碼描述為:
1 voidUserEventHandler::handle_event(){2 if(can_read(socket)){3 read(socket,buffer);4 process(buffer);5 }6 }7 {8 Reactor.register(newUserEventHandler(socket));9 }
用戶需要重寫EventHandler的handle_event函數(shù)進(jìn)行讀取數(shù)據(jù)、處理數(shù)據(jù)的工作,用戶線程只需要將自己的EventHandler注冊(cè)到Reactor即可。Reactor中handle_events事件循環(huán)的偽代碼大致如下。
1 Reactor::handle_events(){2 while(1){3 sockets=select();4 for(socketinsockets){5 get_event_handler(socket).handle_event();6 }7 }8 }
事件循環(huán)不斷地調(diào)用select獲取被激活的socket,然后根據(jù)獲取socket對(duì)應(yīng)的EventHandler,執(zhí)行器handle_event函數(shù)即可。IO多路復(fù)用是最常使用的IO模型,但是其異步程度還不夠“徹底”,因?yàn)樗褂昧藭?huì)阻塞線程的select系統(tǒng)調(diào)用。因此IO多路復(fù)用只能稱為異步阻塞IO,而非真正的異步IO。
相關(guān)視頻推薦
linux多線程之epoll原理剖析與reactor原理及應(yīng)用
網(wǎng)絡(luò)原理tcp/udp,網(wǎng)絡(luò)編程epoll/reactor,面試中正經(jīng)“八股文”
[linux]一個(gè)讓性能飛起的解決方案,異步處理到底有哪些不一樣
需要C/C Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun812855908獲取(資料包括C/C ,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg等),免費(fèi)分享
五、異步IO
“真正”的異步IO需要操作系統(tǒng)更強(qiáng)的支持。在IO多路復(fù)用模型中,事件循環(huán)將文件句柄的狀態(tài)事件通知給用戶線程,由用戶線程自行讀取數(shù)據(jù)、處理數(shù)據(jù)。而在異步IO模型中,當(dāng)用戶線程收到通知時(shí),數(shù)據(jù)已經(jīng)被內(nèi)核讀取完畢,并放在了用戶線程指定的緩沖區(qū)內(nèi),內(nèi)核在IO完成后通知用戶線程直接使用即可。
異步IO模型使用了Proactor設(shè)計(jì)模式實(shí)現(xiàn)了這一機(jī)制。
如圖6,Proactor模式和Reactor模式在結(jié)構(gòu)上比較相似,不過在用戶(Client)使用方式上差別較大。Reactor模式中,用戶線程通過向Reactor對(duì)象注冊(cè)感興趣的事件監(jiān)聽,然后事件觸發(fā)時(shí)調(diào)用事件處理函數(shù)。而Proactor模式中,用戶線程將AsynchronousOperation(讀/寫等)、Proactor以及操作完成時(shí)的CompletionHandler注冊(cè)到AsynchronousOperationProcessor。AsynchronousOperationProcessor使用Facade模式提供了一組異步操作API(讀/寫等)供用戶使用,當(dāng)用戶線程調(diào)用異步API后,便繼續(xù)執(zhí)行自己的任務(wù)。AsynchronousOperationProcessor會(huì)開啟獨(dú)立的內(nèi)核線程執(zhí)行異步操作,實(shí)現(xiàn)真正的異步。當(dāng)異步IO操作完成時(shí),AsynchronousOperationProcessor將用戶線程與AsynchronousOperation一起注冊(cè)的Proactor和CompletionHandler取出,然后將CompletionHandler與IO操作的結(jié)果數(shù)據(jù)一起轉(zhuǎn)發(fā)給Proactor,Proactor負(fù)責(zé)回調(diào)每一個(gè)異步操作的事件完成處理函數(shù)handle_event。雖然Proactor模式中每個(gè)異步操作都可以綁定一個(gè)Proactor對(duì)象,但是一般在操作系統(tǒng)中,Proactor被實(shí)現(xiàn)為Singleton模式,以便于集中化分發(fā)操作完成事件。
如圖7所示,異步IO模型中,用戶線程直接使用內(nèi)核提供的異步IOAPI發(fā)起read請(qǐng)求,且發(fā)起后立即返回,繼續(xù)執(zhí)行用戶線程代碼。不過此時(shí)用戶線程已經(jīng)將調(diào)用的AsynchronousOperation和CompletionHandler注冊(cè)到內(nèi)核,然后操作系統(tǒng)開啟獨(dú)立的內(nèi)核線程去處理IO操作。當(dāng)read請(qǐng)求的數(shù)據(jù)到達(dá)時(shí),由內(nèi)核負(fù)責(zé)讀取socket中的數(shù)據(jù),并寫入用戶指定的緩沖區(qū)中。最后內(nèi)核將read的數(shù)據(jù)和用戶線程注冊(cè)的CompletionHandler分發(fā)給內(nèi)部Proactor,Proactor將IO完成的信息通知給用戶線程(一般通過調(diào)用用戶線程注冊(cè)的完成事件處理函數(shù)),完成異步IO。
用戶線程使用異步IO模型的偽代碼描述為:
1 voidUserCompletionHandler::handle_event(buffer){2 process(buffer);3 }4 {5 aio_read(socket,newUserCompletionHandler);6 }
用戶需要重寫CompletionHandler的handle_event函數(shù)進(jìn)行處理數(shù)據(jù)的工作,參數(shù)buffer表示Proactor已經(jīng)準(zhǔn)備好的數(shù)據(jù),用戶線程直接調(diào)用內(nèi)核提供的異步IOAPI,并將重寫的CompletionHandler注冊(cè)即可。
相比于IO多路復(fù)用模型,異步IO并不十分常用,不少高性能并發(fā)服務(wù)程序使用IO多路復(fù)用模型 多線程任務(wù)處理的架構(gòu)基本可以滿足需求。況且目前操作系統(tǒng)對(duì)異步IO的支持并非特別完善,更多的是采用IO多路復(fù)用模型模擬異步IO的方式(IO事件觸發(fā)時(shí)不直接通知用戶線程,而是將數(shù)據(jù)讀寫完畢后放到用戶指定的緩沖區(qū)中)。Java7之后已經(jīng)支持了異步IO,感興趣的讀者可以嘗試使用。
六、reactor總結(jié)
6.1 背景
如果要讓服務(wù)器服務(wù)多個(gè)客戶端,那么最直接的方式就是為每一條連接創(chuàng)建線程。
其實(shí)創(chuàng)建進(jìn)程也是可以的,原理是一樣的,進(jìn)程和線程的區(qū)別在于線程比較輕量級(jí)些,線程的創(chuàng)建和線程間切換的成本要小些,為了描述簡(jiǎn)述,后面都以線程為例。
處理完業(yè)務(wù)邏輯后,隨著連接關(guān)閉后線程也同樣要銷毀了,但是這樣不停地創(chuàng)建和銷毀線程,不僅會(huì)帶來(lái)性能開銷,也會(huì)造成浪費(fèi)資源,而且如果要連接幾萬(wàn)條連接,創(chuàng)建幾萬(wàn)個(gè)線程去應(yīng)對(duì)也是不現(xiàn)實(shí)的。
要這么解決這個(gè)問題呢?我們可以使用「資源復(fù)用」的方式。
也就是不用再為每個(gè)連接創(chuàng)建線程,而是創(chuàng)建一個(gè)「線程池」,將連接分配給線程,然后一個(gè)線程可以處理多個(gè)連接的業(yè)務(wù)。
不過,這樣又引來(lái)一個(gè)新的問題,線程怎樣才能高效地處理多個(gè)連接的業(yè)務(wù)?
當(dāng)一個(gè)連接對(duì)應(yīng)一個(gè)線程時(shí),線程一般采用「read -> 業(yè)務(wù)處理 -> send」的處理流程,如果當(dāng)前連接沒有數(shù)據(jù)可讀,那么線程會(huì)阻塞在 read 操作上( socket 默認(rèn)情況是阻塞 I/O),不過這種阻塞方式并不影響其他線程。
但是引入了線程池,那么一個(gè)線程要處理多個(gè)連接的業(yè)務(wù),線程在處理某個(gè)連接的 read 操作時(shí),如果遇到?jīng)]有數(shù)據(jù)可讀,就會(huì)發(fā)生阻塞,那么線程就沒辦法繼續(xù)處理其他連接的業(yè)務(wù)。
要解決這一個(gè)問題,最簡(jiǎn)單的方式就是將 socket 改成非阻塞,然后線程不斷地輪詢調(diào)用 read 操作來(lái)判斷是否有數(shù)據(jù),這種方式雖然該能夠解決阻塞的問題,但是解決的方式比較粗暴,因?yàn)檩喸兪且?CPU 的,而且隨著一個(gè)線程處理的連接越多,輪詢的效率就會(huì)越低。
上面的問題在于,線程并不知道當(dāng)前連接是否有數(shù)據(jù)可讀,從而需要每次通過 read 去試探。
那有沒有辦法在只有當(dāng)連接上有數(shù)據(jù)的時(shí)候,線程才去發(fā)起讀請(qǐng)求呢?答案是有的,實(shí)現(xiàn)這一技術(shù)的就是 I/O 多路復(fù)用。
6.2 IO多路復(fù)用
? 我們熟悉的 select/poll/epoll 就是內(nèi)核提供給用戶態(tài)的多路復(fù)用系統(tǒng)調(diào)用,線程可以通過一個(gè)系統(tǒng)調(diào)用函數(shù)從內(nèi)核中獲取多個(gè)事件。
select/poll/epoll 是如何獲取網(wǎng)絡(luò)事件的呢?
在獲取事件時(shí),先把我們要關(guān)心的連接傳給內(nèi)核,再由內(nèi)核檢測(cè):
如果沒有事件發(fā)生,線程只需阻塞在這個(gè)系統(tǒng)調(diào)用,而無(wú)需像前面的線程池方案那樣輪訓(xùn)調(diào)用 read 操作來(lái)判斷是否有數(shù)據(jù)。
如果有事件發(fā)生,內(nèi)核會(huì)返回產(chǎn)生了事件的連接,線程就會(huì)從阻塞狀態(tài)返回,然后在用戶態(tài)中再處理這些連接對(duì)應(yīng)的業(yè)務(wù)即可。
當(dāng)下開源軟件能做到網(wǎng)絡(luò)高性能的原因就是 I/O 多路復(fù)用嗎?
是的,基本是基于 I/O 多路復(fù)用,用過 I/O 多路復(fù)用接口寫網(wǎng)絡(luò)程序的同學(xué),肯定知道是面向過程的方式寫代碼的,這樣的開發(fā)的效率不高。
于是,大佬們基于面向?qū)ο蟮乃枷耄瑢?duì) I/O 多路復(fù)用作了一層封裝,讓使用者不用考慮底層網(wǎng)絡(luò) API 的細(xì)節(jié),只需要關(guān)注應(yīng)用代碼的編寫。大佬們還為這種模式取了個(gè)讓人第一時(shí)間難以理解的名字:Reactor 模式。
6.3 簡(jiǎn)介
Reactor 翻譯過來(lái)的意思是「反應(yīng)堆」,可能大家會(huì)聯(lián)想到物理學(xué)里的核反應(yīng)堆,實(shí)際上并不是的這個(gè)意思。
這里的反應(yīng)指的是「對(duì)事件反應(yīng)」,也就是來(lái)了一個(gè)事件,Reactor 就有相對(duì)應(yīng)的反應(yīng)/響應(yīng)。
事實(shí)上,Reactor 模式也叫 Dispatcher 模式,我覺得這個(gè)名字更貼合該模式的含義,即 I/O 多路復(fù)用監(jiān)聽事件,收到事件后,根據(jù)事件類型分配(Dispatch)給某個(gè)進(jìn)程 / 線程。
Reactor 模式主要由 Reactor 和處理資源池這兩個(gè)核心部分組成,它倆負(fù)責(zé)的事情如下:
Reactor 負(fù)責(zé)監(jiān)聽和分發(fā)事件,事件類型包含連接事件、讀寫事件;
處理資源池負(fù)責(zé)處理事件,如 read -> 業(yè)務(wù)邏輯 -> send;
Reactor 模式是靈活多變的,可以應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,靈活在于:
Reactor 的數(shù)量可以只有一個(gè),也可以有多個(gè);
處理資源池可以是單個(gè)進(jìn)程 / 線程,也可以是多個(gè)進(jìn)程 /線程;
將上面的兩個(gè)因素排列組設(shè)一下,理論上就可以有 4 種方案選擇:
單 Reactor 單進(jìn)程 / 線程;
單 Reactor 多進(jìn)程 / 線程;
多 Reactor 單進(jìn)程 / 線程;
多 Reactor 多進(jìn)程 / 線程;
其中,「多 Reactor 單進(jìn)程 / 線程」實(shí)現(xiàn)方案相比「單 Reactor 單進(jìn)程 / 線程」方案,不僅復(fù)雜而且也沒有性能優(yōu)勢(shì),因此實(shí)際中并沒有應(yīng)用。
方案具體使用進(jìn)程還是線程,要看使用的編程語(yǔ)言以及平臺(tái)有關(guān):
Java 語(yǔ)言一般使用線程,比如 Netty;
C 語(yǔ)言使用進(jìn)程和線程都可以,例如 Nginx 使用的是進(jìn)程,Memcache 使用的是線程。
接下來(lái),分別介紹這三個(gè)經(jīng)典的 Reactor 方案。
6.4 單 Reactor 單進(jìn)程 / 線程
6.4.1 流程圖
一般來(lái)說(shuō),C 語(yǔ)言實(shí)現(xiàn)的是「單 Reactor 單進(jìn)程」的方案,因?yàn)?C 語(yǔ)編寫完的程序,運(yùn)行后就是一個(gè)獨(dú)立的進(jìn)程,不需要在進(jìn)程中再創(chuàng)建線程。
而 Java 語(yǔ)言實(shí)現(xiàn)的是「單 Reactor 單線程」的方案,因?yàn)?Java 程序是跑在 Java 虛擬機(jī)這個(gè)進(jìn)程上面的,虛擬機(jī)中有很多線程,我們寫的 Java 程序只是其中的一個(gè)線程而已。
我們來(lái)看看「單 Reactor 單進(jìn)程」的方案示意圖:
6.4.2 流程圖分析
可以看到進(jìn)程里有 Reactor、Acceptor、Handler 這三個(gè)對(duì)象:
Reactor 對(duì)象的作用是監(jiān)聽和分發(fā)事件;
Acceptor 對(duì)象的作用是獲取連接;
Handler 對(duì)象的作用是處理業(yè)務(wù);
對(duì)象里的 select、accept、read、send 是系統(tǒng)調(diào)用函數(shù),dispatch 和 「業(yè)務(wù)處理」是需要完成的操作,其中 dispatch 是分發(fā)事件操作。
接下來(lái),介紹下「單 Reactor 單進(jìn)程」這個(gè)方案:
Reactor 對(duì)象通過 select (IO 多路復(fù)用接口) 監(jiān)聽事件,收到事件后通過 dispatch 進(jìn)行分發(fā),具體分發(fā)給 Acceptor 對(duì)象還是 Handler 對(duì)象,還要看收到的事件類型;
如果是連接建立的事件,則交由 Acceptor 對(duì)象進(jìn)行處理,Acceptor 對(duì)象會(huì)通過 accept 方法 獲取連接,并創(chuàng)建一個(gè) Handler 對(duì)象來(lái)處理后續(xù)的響應(yīng)事件;
如果不是連接建立事件, 則交由當(dāng)前連接對(duì)應(yīng)的 Handler 對(duì)象來(lái)進(jìn)行響應(yīng);
Handler 對(duì)象通過 read -> 業(yè)務(wù)處理 -> send 的流程來(lái)完成完整的業(yè)務(wù)流程。
單 Reactor 單進(jìn)程的方案因?yàn)槿抗ぷ鞫荚谕粋€(gè)進(jìn)程內(nèi)完成,所以實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,不需要考慮進(jìn)程間通信,也不用擔(dān)心多進(jìn)程競(jìng)爭(zhēng)。
6.4.3 缺點(diǎn)
但是,這種方案存在 2 個(gè)缺點(diǎn):
第一個(gè)缺點(diǎn),因?yàn)橹挥幸粋€(gè)進(jìn)程,無(wú)法充分利用 多核 CPU 的性能;
第二個(gè)缺點(diǎn),Handler 對(duì)象在業(yè)務(wù)處理時(shí),整個(gè)進(jìn)程是無(wú)法處理其他連接的事件的,如果業(yè)務(wù)處理耗時(shí)比較長(zhǎng),那么就造成響應(yīng)的延遲;
6.4.4 應(yīng)用場(chǎng)景和實(shí)例
所以,單 Reactor 單進(jìn)程的方案不適用計(jì)算機(jī)密集型的場(chǎng)景,只適用于業(yè)務(wù)處理非常快速的場(chǎng)景。
Redis 是由 C 語(yǔ)言實(shí)現(xiàn)的,它采用的正是「單 Reactor 單進(jìn)程」的方案,因?yàn)?Redis 業(yè)務(wù)處理主要是在內(nèi)存中完成,操作的速度是很快的,性能瓶頸不在 CPU 上,所以 Redis 對(duì)于命令的處理是單進(jìn)程的方案。Redis的瓶頸最有可能是機(jī)器內(nèi)存的大小或者網(wǎng)絡(luò)帶寬。
Redis將數(shù)據(jù)存放在內(nèi)存當(dāng)中,這也就意味著,Redis在操作數(shù)據(jù)時(shí),不需要進(jìn)行磁盤I/O。磁盤I/O是一個(gè)比較耗時(shí)的操作,所以對(duì)于需要進(jìn)行磁盤I/O的程序,我們可以使用多線程,在某個(gè)線程進(jìn)行I/O時(shí),CPU切換到當(dāng)前程序的其他線程執(zhí)行,以此減少CPU的等待時(shí)間。而Redis直接操作內(nèi)存中的數(shù)據(jù),所以使用多線程并不能有效提升效率,相反,使用多線程反倒會(huì)因?yàn)樾枰M(jìn)行線程的切換而降低效率。
除此之外,使用多線程的話,多個(gè)線程間進(jìn)行同步,保證線程的安全,也是需要開銷的。尤其是Redis的數(shù)據(jù)結(jié)構(gòu)都是一些實(shí)現(xiàn)較為簡(jiǎn)單的集合結(jié)構(gòu),若使用多線程,將會(huì)頻繁地發(fā)生線程沖突,線程的競(jìng)爭(zhēng)頻率較高,反倒會(huì)拖慢Redis的響應(yīng)速度。
綜上所述,Redis為了保持簡(jiǎn)單和高效,自然而然地就使用了單線程。
6.5 單 Reactor 單進(jìn)程 / 線程
6.5.1 流程圖
如果要克服「單 Reactor 單線程 / 進(jìn)程」方案的缺點(diǎn),那么就需要引入多線程 / 多進(jìn)程,這樣就產(chǎn)生了單 Reactor 多線程 / 多進(jìn)程的方案。
聞其名不如看其圖,先來(lái)看看「單 Reactor 多線程」方案的示意圖如下:
6.5.2 流程圖分析
詳細(xì)說(shuō)一下這個(gè)方案:
Reactor 對(duì)象通過 select (IO 多路復(fù)用接口) 監(jiān)聽事件,收到事件后通過 dispatch 進(jìn)行分發(fā),具體分發(fā)給 Acceptor 對(duì)象還是 Handler 對(duì)象,還要看收到的事件類型;
如果是連接建立的事件,則交由 Acceptor 對(duì)象進(jìn)行處理,Acceptor 對(duì)象會(huì)通過 accept 方法 獲取連接,并創(chuàng)建一個(gè) Handler 對(duì)象來(lái)處理后續(xù)的響應(yīng)事件;
如果不是連接建立事件, 則交由當(dāng)前連接對(duì)應(yīng)的 Handler 對(duì)象來(lái)進(jìn)行響應(yīng);
上面的三個(gè)步驟和單 Reactor 單線程方案是一樣的,接下來(lái)的步驟就開始不一樣了:
Handler 對(duì)象不再負(fù)責(zé)業(yè)務(wù)處理,只負(fù)責(zé)數(shù)據(jù)的接收和發(fā)送,Handler 對(duì)象通過 read 讀取到數(shù)據(jù)后,會(huì)將數(shù)據(jù)發(fā)給子線程里的 Processor 對(duì)象進(jìn)行業(yè)務(wù)處理;
子線程里的 Processor 對(duì)象就進(jìn)行業(yè)務(wù)處理,處理完后,將結(jié)果發(fā)給主線程中的 Handler 對(duì)象,接著由 Handler 通過 send 方法將響應(yīng)結(jié)果發(fā)送給 client;
6.5.3 優(yōu)點(diǎn)和缺點(diǎn)
6.5.3.1 優(yōu)點(diǎn)
單 Reator 多線程的方案優(yōu)勢(shì)在于能夠充分利用多核 CPU 的能,那既然引入多線程,那么自然就帶來(lái)了多線程競(jìng)爭(zhēng)資源的問題。
6.5.3.2 缺點(diǎn)
資源共享導(dǎo)致的競(jìng)爭(zhēng)
例如,子線程完成業(yè)務(wù)處理后,要把結(jié)果傳遞給主線程的 Reactor 進(jìn)行發(fā)送,這里涉及共享數(shù)據(jù)的競(jìng)爭(zhēng)。
要避免多線程由于競(jìng)爭(zhēng)共享資源而導(dǎo)致數(shù)據(jù)錯(cuò)亂的問題,就需要在操作共享資源前加上互斥鎖,以保證任意時(shí)間里只有一個(gè)線程在操作共享資源,待該線程操作完釋放互斥鎖后,其他線程才有機(jī)會(huì)操作共享數(shù)據(jù)。
單 Reactor 多進(jìn)程的通信(資源共享)
聊完單 Reactor 多線程的方案,接著來(lái)看看單 Reactor 多進(jìn)程的方案。
事實(shí)上,單 Reactor 多進(jìn)程相比單 Reactor 多線程實(shí)現(xiàn)起來(lái)很麻煩,主要因?yàn)橐紤]子進(jìn)程 <-> 父進(jìn)程的雙向通信,并且父進(jìn)程還得知道子進(jìn)程要將數(shù)據(jù)發(fā)送給哪個(gè)客戶端。
而多線程間可以共享數(shù)據(jù),雖然要額外考慮并發(fā)問題,但是這遠(yuǎn)比進(jìn)程間通信的復(fù)雜度低得多,因此實(shí)際應(yīng)用中也看不到單 Reactor 多進(jìn)程的模式。
單 Reactor 的壓力
另外,「單 Reactor」的模式還有個(gè)問題,因?yàn)橐粋€(gè) Reactor 對(duì)象承擔(dān)所有事件的監(jiān)聽和響應(yīng),而且只在主線程中運(yùn)行,在面對(duì)瞬間高并發(fā)的場(chǎng)景時(shí),容易成為性能的瓶頸的地方。
6.6 多 Reactor 多進(jìn)程 / 線程
6.6.1 流程圖
要解決「單 Reactor」的問題,就是將「單 Reactor」實(shí)現(xiàn)成「多 Reactor」,這樣就產(chǎn)生了第 多 Reactor 多進(jìn)程 / 線程的方案。
老規(guī)矩,聞其名不如看其圖。多 Reactor 多進(jìn)程 / 線程方案的示意圖如下(以線程為例):
6.6.2 流程圖分析
方案詳細(xì)說(shuō)明如下:
主線程中的 MainReactor 對(duì)象通過 select 監(jiān)控連接建立事件,收到事件后通過 Acceptor 對(duì)象中的 accept 獲取連接,將新的連接分配給某個(gè)子線程;
子線程中的 SubReactor 對(duì)象將 MainReactor 對(duì)象分配的連接加入 select 繼續(xù)進(jìn)行監(jiān)聽,并創(chuàng)建一個(gè) Handler 用于處理連接的響應(yīng)事件。
如果有新的事件發(fā)生時(shí),SubReactor 對(duì)象會(huì)調(diào)用當(dāng)前連接對(duì)應(yīng)的 Handler 對(duì)象來(lái)進(jìn)行響應(yīng)。
Handler 對(duì)象通過 read -> 業(yè)務(wù)處理 -> send 的流程來(lái)完成完整的業(yè)務(wù)流程。
多 Reactor 多線程的方案雖然看起來(lái)復(fù)雜的,但是實(shí)際實(shí)現(xiàn)時(shí)比單 Reactor 多線程的方案要簡(jiǎn)單的多,原因如下:
主線程和子線程分工明確,主線程只負(fù)責(zé)接收新連接,子線程負(fù)責(zé)完成后續(xù)的業(yè)務(wù)處理。
主線程和子線程的交互很簡(jiǎn)單,主線程只需要把新連接傳給子線程,子線程無(wú)須返回?cái)?shù)據(jù),直接就可以在子線程將處理結(jié)果發(fā)送給客戶端。
6.6.3 應(yīng)用場(chǎng)景和實(shí)例
大名鼎鼎的兩個(gè)開源軟件 Netty 和 Memcache 都采用了「多 Reactor 多線程」的方案。
采用了「多 Reactor 多進(jìn)程」方案的開源軟件是 Nginx,不過方案與標(biāo)準(zhǔn)的多 Reactor 多進(jìn)程有些差異。
具體差異表現(xiàn)在主進(jìn)程中僅僅用來(lái)初始化 socket,并沒有創(chuàng)建 mainReactor 來(lái) accept 連接,而是由子進(jìn)程的 Reactor 來(lái) accept 連接,通過鎖來(lái)控制一次只有一個(gè)子進(jìn)程進(jìn)行 accept(防止出現(xiàn)驚群現(xiàn)象),子進(jìn)程 accept 新連接后就放到自己的 Reactor 進(jìn)行處理,不會(huì)再分配給其他子進(jìn)程。
七、Proactor總結(jié)
7.1 背景
前面提到的 Reactor 是非阻塞同步網(wǎng)絡(luò)模式,而 Proactor 是異步網(wǎng)絡(luò)模式。
7.1.1 阻塞 I/O分析
先來(lái)看看阻塞 I/O,當(dāng)用戶程序執(zhí)行 read ,線程會(huì)被阻塞,一直等到內(nèi)核數(shù)據(jù)準(zhǔn)備好,并把數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到應(yīng)用程序的緩沖區(qū)中,當(dāng)拷貝過程完成,read 才會(huì)返回。
注意,阻塞等待的是「內(nèi)核數(shù)據(jù)準(zhǔn)備好」和「數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)」這兩個(gè)過程。過程如下圖:
7.1.2 阻塞 I/O分析
知道了阻塞 I/O ,來(lái)看看非阻塞 I/O,非阻塞的 read 請(qǐng)求在數(shù)據(jù)未準(zhǔn)備好的情況下立即返回,可以繼續(xù)往下執(zhí)行,此時(shí)應(yīng)用程序不斷輪詢內(nèi)核,直到數(shù)據(jù)準(zhǔn)備好,內(nèi)核將數(shù)據(jù)拷貝到應(yīng)用程序緩沖區(qū),read 調(diào)用才可以獲取到結(jié)果。過程如下圖:
注意,這里最后一次 read 調(diào)用,獲取數(shù)據(jù)的過程,是一個(gè)同步的過程,是需要等待的過程。這里的同步指的是內(nèi)核態(tài)的數(shù)據(jù)拷貝到用戶程序的緩存區(qū)這個(gè)過程。
7.1.3 同步和異步分析
舉個(gè)例子,如果 socket 設(shè)置了 O_NONBLOCK 標(biāo)志,那么就表示使用的是非阻塞 I/O 的方式訪問,而不做任何設(shè)置的話,默認(rèn)是阻塞 I/O。
因此,無(wú)論 read 和 send 是阻塞 I/O,還是非阻塞 I/O 都是同步調(diào)用。因?yàn)樵?read 調(diào)用時(shí),內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間的過程都是需要等待的,也就是說(shuō)這個(gè)過程是同步的,如果內(nèi)核實(shí)現(xiàn)的拷貝效率不高,read 調(diào)用就會(huì)在這個(gè)同步過程中等待比較長(zhǎng)的時(shí)間。
而真正的異步 I/O 是「內(nèi)核數(shù)據(jù)準(zhǔn)備好」和「數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)」這兩個(gè)過程都不用等待。
當(dāng)我們發(fā)起 aio_read (異步 I/O) 之后,就立即返回,內(nèi)核自動(dòng)將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,這個(gè)拷貝過程同樣是異步的,內(nèi)核自動(dòng)完成的,和前面的同步操作不一樣,應(yīng)用程序并不需要主動(dòng)發(fā)起拷貝動(dòng)作。過程如下圖:
?舉個(gè)你去飯?zhí)贸燥埖睦樱愫帽葢?yīng)用程序,飯?zhí)煤帽炔僮飨到y(tǒng)。
阻塞 I/O 好比,你去飯?zhí)贸燥垼秋執(zhí)玫牟诉€沒做好,然后你就一直在那里等啊等,等了好長(zhǎng)一段時(shí)間終于等到飯?zhí)冒⒁贪巡硕肆顺鰜?lái)(數(shù)據(jù)準(zhǔn)備的過程),但是你還得繼續(xù)等阿姨把菜(內(nèi)核空間)打到你的飯盒里(用戶空間),經(jīng)歷完這兩個(gè)過程,你才可以離開。
非阻塞 I/O 好比,你去了飯?zhí)茫瑔柊⒁滩俗龊昧藳]有,阿姨告訴你沒,你就離開了,過幾十分鐘,你又來(lái)飯?zhí)脝柊⒁蹋⒁陶f(shuō)做好了,于是阿姨幫你把菜打到你的飯盒里,這個(gè)過程你是得等待的。
異步 I/O 好比,你讓飯?zhí)冒⒁虒⒉俗龊貌巡舜虻斤埡欣锖螅扬埡兴偷侥忝媲埃麄€(gè)過程你都不需要任何等待。
很明顯,異步 I/O 比同步 I/O 性能更好,因?yàn)楫惒?I/O 在「內(nèi)核數(shù)據(jù)準(zhǔn)備好」和「數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間」這兩個(gè)過程都不用等待。
7.2 Proactor
7.2.1 Proactor和Reactor對(duì)比
Proactor 正是采用了異步 I/O 技術(shù),所以被稱為異步網(wǎng)絡(luò)模型。現(xiàn)在我們?cè)賮?lái)理解 Reactor 和 Proactor 的區(qū)別,就比較清晰了。
Reactor 是非阻塞同步網(wǎng)絡(luò)模式,感知的是就緒可讀寫事件。需要注意的是,這里所屬的非阻塞是指使用的socket是非阻塞的,但是用戶進(jìn)程依然是阻塞的,與前面的分析并不沖突,在每次感知到有事件發(fā)生(比如可讀就緒事件)后,就需要應(yīng)用進(jìn)程主動(dòng)調(diào)用 read 方法來(lái)完成數(shù)據(jù)的讀取,也就是要應(yīng)用進(jìn)程主動(dòng)將 socket 接收緩存中的數(shù)據(jù)讀到應(yīng)用進(jìn)程內(nèi)存中,這個(gè)過程是同步的,讀取完數(shù)據(jù)后應(yīng)用進(jìn)程才能處理數(shù)據(jù)。
Proactor 是異步網(wǎng)絡(luò)模式, 感知的是已完成的讀寫事件。在發(fā)起異步讀寫請(qǐng)求時(shí),需要傳入數(shù)據(jù)緩沖區(qū)的地址(用來(lái)存放結(jié)果數(shù)據(jù))等信息,這樣系統(tǒng)內(nèi)核才可以自動(dòng)幫我們把數(shù)據(jù)的讀寫工作完成,這里的讀寫工作全程由操作系統(tǒng)來(lái)做,并不需要像 Reactor 那樣還需要應(yīng)用進(jìn)程主動(dòng)發(fā)起 read/write 來(lái)讀寫數(shù)據(jù),操作系統(tǒng)完成讀寫工作后,就會(huì)通知應(yīng)用進(jìn)程直接處理數(shù)據(jù)。
因此,Reactor 可以理解為「來(lái)了事件操作系統(tǒng)通知應(yīng)用進(jìn)程,讓應(yīng)用進(jìn)程來(lái)處理」,而 Proactor 可以理解為「來(lái)了事件操作系統(tǒng)來(lái)處理,處理完再通知應(yīng)用進(jìn)程」。這里的「事件」就是有新連接、有數(shù)據(jù)可讀、有數(shù)據(jù)可寫的這些 I/O 事件這里的「處理」包含從驅(qū)動(dòng)讀取到內(nèi)核以及從內(nèi)核讀取到用戶空間。
舉個(gè)實(shí)際生活中的例子,Reactor 模式就是快遞員在樓下,給你打電話告訴你快遞到你家小區(qū)了,你需要自己下樓來(lái)拿快遞。而在 Proactor 模式下,快遞員直接將快遞送到你家門口,然后通知你。
無(wú)論是 Reactor,還是 Proactor,都是一種基于「事件分發(fā)」的網(wǎng)絡(luò)編程模式,區(qū)別在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式則是基于「已完成」的 I/O 事件。
7.2.2 Proactor 模式的示意圖
7.2.3 Proactor 模式的示意圖分析
介紹一下 Proactor 模式的工作流程:
Proactor Initiator 負(fù)責(zé)創(chuàng)建 Proactor 和 Handler 對(duì)象,并將 Proactor 和 Handler 都通過Asynchronous Operation Processor 注冊(cè)到內(nèi)核;
Asynchronous Operation Processor 負(fù)責(zé)處理注冊(cè)請(qǐng)求,并處理 I/O 操作;
Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
Proactor 根據(jù)不同的事件類型回調(diào)不同的 Handler 進(jìn)行業(yè)務(wù)處理;
Handler 完成業(yè)務(wù)處理;
7.3 Proactor 模式的問題
可惜的是,在 Linux 下的異步 I/O 是不完善的,aio系列函數(shù)是由 POSIX 定義的異步操作接口,不是真正的操作系統(tǒng)級(jí)別支持的,而是在用戶空間模擬出來(lái)的異步,并且僅僅支持基于本地文件的 aio 異步操作,網(wǎng)絡(luò)編程中的 socket 是不支持的,這也使得基于 Linux 的高性能網(wǎng)絡(luò)程序都是使用 Reactor 方案,linux也有內(nèi)核級(jí)別的異步IO操作函數(shù)libaio,但是存在著一定的缺陷,所有的文件打開的時(shí)候必須包含書O_DIRECT標(biāo)志,并非所有的文件系統(tǒng)都支持該類接口,如果不支持,IO操作就會(huì)變成阻塞的,當(dāng)然,如果你不添加O_DIRECT標(biāo)志,它鎖使用的IO操作也是阻塞的。
而 Windows 里實(shí)現(xiàn)了一套完整的支持 socket 的異步編程接口,這套接口就是 IOCP,是由操作系統(tǒng)級(jí)別實(shí)現(xiàn)的異步 I/O,真正意義上異步 I/O,因此在 Windows 里實(shí)現(xiàn)高性能網(wǎng)絡(luò)程序可以使用效率更高的 Proactor 方案。
7.4 小結(jié)
常見的 Reactor 實(shí)現(xiàn)方案有三種。
第一種方案單 Reactor 單進(jìn)程 / 線程,不用考慮進(jìn)程間通信以及數(shù)據(jù)同步的問題,因此實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,這種方案的缺陷在于無(wú)法充分利用多核 CPU,而且處理業(yè)務(wù)邏輯的時(shí)間不能太長(zhǎng),否則會(huì)延遲響應(yīng),所以不適用于計(jì)算機(jī)密集型的場(chǎng)景,適用于業(yè)務(wù)處理快速的場(chǎng)景,比如 Redis 采用的是單 Reactor 單進(jìn)程的方案。
第二種方案單 Reactor 多線程,通過多線程的方式解決了方案一的缺陷,但它離高并發(fā)還差一點(diǎn)距離,差在只有一個(gè) Reactor 對(duì)象來(lái)承擔(dān)所有事件的監(jiān)聽和響應(yīng),而且只在主線程中運(yùn)行,在面對(duì)瞬間高并發(fā)的場(chǎng)景時(shí),容易成為性能的瓶頸的地方。
第三種方案多 Reactor 多進(jìn)程 / 線程,通過多個(gè) Reactor 來(lái)解決了方案二的缺陷,主 Reactor 只負(fù)責(zé)監(jiān)聽事件,響應(yīng)事件的工作交給了從 Reactor,Netty 和 Memcache 都采用了「多 Reactor 多線程」的方案,Nginx 則采用了類似于 「多 Reactor 多進(jìn)程」的方案。
Reactor 可以理解為「來(lái)了事件操作系統(tǒng)通知應(yīng)用進(jìn)程,讓應(yīng)用進(jìn)程來(lái)處理」,而 Proactor 可以理解為「來(lái)了事件操作系統(tǒng)來(lái)處理,處理完再通知應(yīng)用進(jìn)程」。
因此,真正的大殺器還是 Proactor,它是采用異步 I/O 實(shí)現(xiàn)的異步網(wǎng)絡(luò)模型,感知的是已完成的讀寫事件,而不需要像 Reactor 感知到事件后,還需要調(diào)用 read 來(lái)從內(nèi)核中獲取數(shù)據(jù)。
不過,無(wú)論是 Reactor,還是 Proactor,都是一種基于「事件分發(fā)」的網(wǎng)絡(luò)編程模式,區(qū)別在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式則是基于「已完成」的 I/O 事件,這個(gè)完成指的是數(shù)據(jù)的讀取已經(jīng)完成,實(shí)際上單Reactor多線程就是一種模擬的Proactor。
鎧俠 極至光速系列內(nèi)存卡評(píng)測(cè):經(jīng)典紅白復(fù)刻,唯有品質(zhì)依舊
[PConline 評(píng)測(cè)]自從東芝存儲(chǔ)更名為鎧俠以后,整個(gè)品牌的各類產(chǎn)品包裝配色都隨之發(fā)生了變換,尤其是SD卡產(chǎn)品更是一改往日傳統(tǒng)低調(diào)的黑色風(fēng)格,選擇了更為年輕化的配色,比如今天這款鎧俠 EXCERIA PLUS 極至光速系列 存儲(chǔ)卡,就采用了騷氣十足的紅色,主打高性能,相信會(huì)是攝像愛好者的最愛,現(xiàn)在就讓筆者來(lái)分享一下上手體驗(yàn)。
包裝&外觀:辨識(shí)度極高
鎧俠 EXCERIA PLUS 存儲(chǔ)卡的外包裝十分簡(jiǎn)潔,包裝整體以品紅色為主,正中則是帶云臺(tái)的攝像機(jī)的圖案,表明了這款儲(chǔ)存卡的主要使用場(chǎng)景,適合那些追求高速穩(wěn)定的攝影與錄像用戶群體。
在包裝的最下面是品牌的Logo,而最上面則是產(chǎn)品的一些簡(jiǎn)單信息,如型號(hào)、容量、名稱等,這款存儲(chǔ)卡支持V30、U3、class 10等技術(shù)協(xié)議,是鎧俠目前在高性能TF卡市場(chǎng)上最優(yōu)的產(chǎn)品,充分保障了我們對(duì)于4K視頻拍攝的需求,幫用戶清晰紀(jì)錄每一瞬間。
產(chǎn)品包裝的背面則是產(chǎn)品的一些功能和特色介紹,其最大的讀寫速度分別為100MB/s和85MB/s,并支持4K視頻的拍攝,并具備耐受-25℃~85℃極端溫度、防X射線、防水、5米抗摔等特性,可滿足攝影愛好者在各種惡劣環(huán)境中高清拍攝的使用要求。
鎧俠 EXCERIA PLUS 存儲(chǔ)卡為標(biāo)準(zhǔn)的SD卡規(guī)格,三圍是32*24*2.1mm,重量約為2克,殼體是經(jīng)典的白紅配色,讓人印象深刻,而左邊的黃色開關(guān),則用于數(shù)據(jù)讀寫鎖定,需要的時(shí)候可以撥下來(lái)。
這張存儲(chǔ)卡的背面則是全白配色,上面印有一些序列號(hào)之類的信息,產(chǎn)地則是日本,通過了CE認(rèn)證。
這次我們手上的是256G版本,可以存儲(chǔ)500萬(wàn)像素的圖片約162710張;1800萬(wàn)像素的圖片約38510漲;高清視頻(12Mbps)約2620分鐘;4K(100Mbps)約314分鐘,讓你無(wú)須拍攝擔(dān)心存儲(chǔ)空間不夠使用。此外,還擁有32G、64G和128G三個(gè)版本,消費(fèi)者可以根據(jù)自己的需求選擇適合自己的容量。
這款存儲(chǔ)卡采用的是鎧俠原廠的BiCS Flash 3D閃存顆粒,品質(zhì)有保障,這也是目前鎧俠品牌立足之根本了。
高速讀寫,4K@60p高碼率隨心錄
作為一張SD卡,最常用的場(chǎng)合就是相機(jī)了,不過現(xiàn)今相機(jī)拍攝時(shí)產(chǎn)生的數(shù)據(jù)讀寫速度也不是一般SD卡能承受的,鎧俠EXCERIA PLUS經(jīng)過我們測(cè)試,無(wú)論是使用EOS R高速連拍3030萬(wàn)像素照片,還是使用富士XT-3拍攝4K@60P 高碼率視頻,它都能非常順暢的完成任務(wù)。
在EOS R上,SD卡存取速度的快慢會(huì)影響高速連拍的速度,我們實(shí)際測(cè)試的連拍效果是非常給力的,不過在文章中就無(wú)法展現(xiàn)出高速連拍的效果了,我們就選擇拍攝4K@60P視頻來(lái)體現(xiàn)存儲(chǔ)卡的速度。
富士XT-3要開啟4K@60P的條件比較苛刻,只要存儲(chǔ)卡沒有達(dá)到標(biāo)準(zhǔn),選項(xiàng)是灰色不可選取狀態(tài)。而鎧俠EXCERIA PLUS開啟富士XT-3的4K@60P拍攝模式是沒有問題的,且可以選擇最高碼率200Mbps。
實(shí)際拍攝的效果如動(dòng)圖,非常流暢。
性能小測(cè):連續(xù)讀寫穩(wěn)定夠用
接下來(lái)就是速度測(cè)試環(huán)節(jié),我們首先使用了3款常用存儲(chǔ)產(chǎn)品測(cè)試軟件來(lái)測(cè)出它的理論讀寫速度,后面也會(huì)加入實(shí)際傳輸測(cè)試。
、
首先是Crystal Disk Mark測(cè)試,在1G文件的測(cè)試中,這款存儲(chǔ)卡的寫入速度為86.41MB/s,讀取速度為97.74MB/s。
在ATTO Disk Benchmark測(cè)試中,可以根據(jù)不同大小的數(shù)據(jù)包來(lái)檢驗(yàn)這兩張內(nèi)存卡在不同文件大小下的讀寫性能。鎧俠 EXCERIA PLUS系列 存儲(chǔ)卡 256G版本最高寫入速度達(dá)到93.43MB/s,最大讀取速度為86.66MB/s,基本達(dá)到了官方的數(shù)據(jù)(官方測(cè)試以1mb=1000kb進(jìn)行換算)。同時(shí),從測(cè)試我們可以發(fā)現(xiàn),鎧俠這款SD卡在64KB到4MB之間時(shí),讀寫性能是最優(yōu)的。這也可以理解為大文件順序讀寫的范圍,在讀寫如視頻,圖片這種體積較大的文件時(shí)能保證較高的速度。
然后在HD Tune Pro下的文件基準(zhǔn)測(cè)試,該模式下分別通過真實(shí)寫入文件后再讀取文件的方式進(jìn)行測(cè)試,能很好地模擬存儲(chǔ)卡的實(shí)際工作狀態(tài)和真實(shí)傳輸速度。 這張存儲(chǔ)卡的定位是主打高性能,為了測(cè)試這張存儲(chǔ)卡在長(zhǎng)時(shí)間連續(xù)讀寫場(chǎng)景使用下有何表現(xiàn),我們?cè)O(shè)定了20G的文件長(zhǎng)度進(jìn)行測(cè)試,傳輸速度一直穩(wěn)定在85MB/s左右,整體表現(xiàn)非常穩(wěn)定。
最后是實(shí)際傳輸測(cè)試環(huán)節(jié),通過拷貝13GB大小的MP4格式視頻文件來(lái)測(cè)試這款存儲(chǔ)卡的傳輸速度,這張鎧俠 EXCERIA PLUS系列 存儲(chǔ)卡的寫入速度基本是穩(wěn)定在84MB/s左右,和上面的測(cè)試結(jié)果比較接近,穩(wěn)定性十分出色。
PConline 評(píng)測(cè)室總結(jié):好用的大容量高速卡
鎧俠 EXCERIA PLUS系列 存儲(chǔ)卡主打高性能,最大讀寫速度分別達(dá)到了97.74MB/s,86.410MB/s,性能比自家的持久存儲(chǔ)系列還要略勝一籌,再加上原廠的顆粒加持,讓這款存儲(chǔ)卡能夠擁有出色的傳輸穩(wěn)定性,可以說(shuō)是繼承了東芝存儲(chǔ)一直以來(lái)的高品質(zhì)。此外,能夠耐受-25℃~85℃極端溫度、防X射線、防水、5米抗摔等特性,非常適合各位“快槍手”在各種環(huán)境下拍攝出卓越質(zhì)量的照片和視頻。