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