io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序
CPU密集型(CPU-Bound)是指系統(tǒng)指花費(fèi)相對(duì)大部分時(shí)間在做CPU運(yùn)算、邏輯判斷等,CPU使用率很高,典型的如加密運(yùn)算;I/O密集型(I/O-Bound)是指系統(tǒng)花費(fèi)大部分時(shí)間在等待相對(duì)較慢的I/O操作完成,如硬盤(pán)文件的讀寫(xiě)。進(jìn)程一般賦予I/O密集型的線程優(yōu)先級(jí)高于CPU密集型的線程,通俗點(diǎn)可以想成人機(jī)交互的需要有高的響應(yīng)優(yōu)先級(jí)。實(shí)際上這樣設(shè)置優(yōu)先級(jí)是因?yàn)镮/O密集型操作通常是要花費(fèi)一定時(shí)間,在此段時(shí)間里可以釋放對(duì)CPU的占用,讓CPU去處理CPU密集型的運(yùn)行,當(dāng)I/O再次需求CPU參與時(shí)又能夠獲取到CPU的使用權(quán)。前陣子遇到了一個(gè)小編程比賽題目,其中有個(gè)簡(jiǎn)答題,一系列的三個(gè)小題目,具體題目如下:問(wèn)題一:一臺(tái)主機(jī),單核CPU,只有一塊硬盤(pán)。現(xiàn)在硬盤(pán)上有4個(gè)大小為1G的文件,一個(gè)程序要將這4個(gè)文件讀取出來(lái),然后對(duì)文件內(nèi)容進(jìn)行加密(加密算法是現(xiàn)成的,加密后的數(shù)據(jù)量和加密前相等),再通過(guò)網(wǎng)絡(luò)發(fā)送到服務(wù)器上。設(shè)單個(gè)文件最大讀取速度為 2MB/S,單個(gè)線程對(duì)文件進(jìn)行加密的速度為1MB/S(加密算法支持多線程協(xié)同并行處理), 網(wǎng)絡(luò)最大傳輸帶寬為 8MB/S。請(qǐng)你給出最優(yōu)的設(shè)計(jì)方案。?問(wèn)題二:現(xiàn)在將主機(jī)配置升級(jí),改為8核CPU, 4塊硬盤(pán)4個(gè)大小為1G的文件,分別存放在4塊硬盤(pán)上,一個(gè)程序要將這4個(gè)文件讀取出來(lái),然后對(duì)文件內(nèi)容進(jìn)行加密(加密算法是現(xiàn)成的,加密后的數(shù)據(jù)量和加密前相等),再通過(guò)網(wǎng)絡(luò)發(fā)送到服務(wù)器上。設(shè)單個(gè)文件讀取速度為 2MB/S,單個(gè)線程對(duì)文件進(jìn)行加密的速度為1MB/S(加密算法支持多線程協(xié)同并行處理),網(wǎng)絡(luò)最大傳輸帶寬為 8MB/S。請(qǐng)你給出最優(yōu)的設(shè)計(jì)方案。問(wèn)題三:基于題目二。在8核CPU的主機(jī)上現(xiàn)在額外運(yùn)行了一些關(guān)鍵程序,要求我們?cè)O(shè)計(jì)的程序CPU占用率不能超過(guò) 25%,給出你的設(shè)計(jì)方案。
有興趣的童鞋可以先思考下,或者直接跳過(guò)分割線。
既然作為一個(gè)考題,必然有其考的知識(shí)點(diǎn)。個(gè)人覺(jué)得本題考的知識(shí)點(diǎn)就是IO密集型與CPU密集型及其對(duì)應(yīng)的線程處理方法。在IO密集型程序中大量時(shí)間花在反復(fù)讀寫(xiě)文件上,耗費(fèi)CPU資源并不多;而CPU密集型則程序的大量時(shí)間都花在CPU運(yùn)算上,對(duì)文件的讀寫(xiě)很少。那么本題中的讀硬盤(pán)文件和網(wǎng)絡(luò)發(fā)送都屬于IO操作,對(duì)文件加密則是靠CPU計(jì)算的,很耗CPU的,屬于CPU密集型操作。PS:為什么IO操作不耗CPU?現(xiàn)代計(jì)算機(jī)的這一操作主要都交給了DMA完成,需要IO時(shí),CPU將要干的事情告訴DMA后就可以釋放CPU,讓CPU干別的活了,當(dāng)IO操作完成后DMA會(huì)進(jìn)行中斷請(qǐng)求,這時(shí)CPU合適時(shí)便來(lái)接著處理之前IO之后的事情。所以題目一我是這樣作答的:將文件的讀取與網(wǎng)絡(luò)發(fā)送放在線程1中(IO密集型操作),將文件的加密放在線程2中(CPU密集型操作),線程1的優(yōu)先級(jí)高于線程2的優(yōu)先級(jí);先啟動(dòng)線程1進(jìn)行讀取文件(4個(gè)文逐個(gè)件依次讀取,讀完1再讀2,以此類推),將讀取的數(shù)據(jù)存放于隊(duì)列1,再啟動(dòng)線程2對(duì)隊(duì)列1中的數(shù)據(jù)進(jìn)行加密,加密后的數(shù)據(jù)存放于隊(duì)列2中,線程1中每次讀文件后將加密好的數(shù)據(jù)進(jìn)行發(fā)送。注:線程1優(yōu)先級(jí)高于線程2的優(yōu)先級(jí),因?yàn)榫€程2是CPU密集型操作,只有這樣當(dāng)線程2執(zhí)行時(shí),線程1在需要時(shí)才可以被調(diào)度到,否則線程1一直占著CPU,其他線程就沒(méi)法工作了。因?yàn)橥瓿杉用芄ぷ魇且恢毙枰狢PU參與的,本題只有一個(gè)CPU,所以只要一個(gè)加密線程就夠了,多了反而降低性能。問(wèn)題二作答:開(kāi)4個(gè)線程處理讀文件和網(wǎng)絡(luò)發(fā)送,分別為線程1、2、3、4;開(kāi)8個(gè)線程用于加密操作,分別為線程a、b、c、d、e、f、g、h。讀文件與網(wǎng)絡(luò)發(fā)送的4個(gè)線程優(yōu)先級(jí)相同,加密的8個(gè)線程優(yōu)先級(jí)相同,但文件讀取與網(wǎng)絡(luò)發(fā)送的線程優(yōu)先級(jí)高于加密線程。線程1讀取硬盤(pán)1中的文件,存放于隊(duì)列1中,線程a、b對(duì)隊(duì)列1中的數(shù)據(jù)進(jìn)行加密,加密后的數(shù)據(jù)存放于隊(duì)列a中,線程1中每4次讀操作后對(duì)隊(duì)列a中的數(shù)據(jù)進(jìn)行一次網(wǎng)絡(luò)發(fā)送;線程2讀取硬盤(pán)2中的文件,存放于隊(duì)列2中,線程c、d對(duì)隊(duì)列2中的數(shù)據(jù)進(jìn)行加密,加密后的數(shù)據(jù)存放于隊(duì)列b中,線程2中每次讀文件后將加密好的數(shù)據(jù)進(jìn)行發(fā)送;其他依次類推。問(wèn)題三作答:即使用2核CPU進(jìn)行滿負(fù)荷處理。開(kāi)1個(gè)線程處理讀文件和網(wǎng)絡(luò)發(fā)送,分別為線程1;開(kāi)2個(gè)線程用于加密操作,分別為線程a、b。加密的2個(gè)線程優(yōu)先級(jí)相同,但文件讀取與網(wǎng)絡(luò)發(fā)送的線程優(yōu)先級(jí)高于加密線程。線程1依次讀取每個(gè)硬盤(pán)中的文件(4個(gè)文逐個(gè)件依次讀取,讀完1再讀2,以此類推),存放于隊(duì)列1中,線程a、b對(duì)隊(duì)列1中的數(shù)據(jù)進(jìn)行加密,加密后的數(shù)據(jù)存放于隊(duì)列a中,線程1中每次讀文件后將加密好的數(shù)據(jù)進(jìn)行發(fā)送。
以上是自己的一點(diǎn)分析與作答,歡迎大家回復(fù)進(jìn)行交流與討論。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cacti监控java,Cacti fo
- 下一篇: java json 教程,【简明教程】J