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中每次读文件后将加密好的数据进行发送。

以上是自己的一点分析与作答,欢迎大家回复进行交流与讨论。

io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序相关推荐

  1. IO密集型和CPU密集型程序-概念与实现

    欢迎关注笔者的微信公众号 概念 在计算机科学中,有两种不同类型的程序:IO 密集型和 CPU 密集型.这两种程序的主要差别在于它们在执行任务时瓶颈所在的地方. IO 密集型:这类程序主要通过读写磁盘文 ...

  2. io密集型和cpu密集型_一次说明白Python爬虫中多线程,多进程,异步IO编程

    图/文:迷神 我们在Python爬虫中,重要的是讲究速度,如果有10万或者100万Url地址,写过爬虫的都会知道,那估计是非常慢的.我们的Python爬虫一般IO密集型业务,Python爬虫程序需要发 ...

  3. io密集型和cpu密集型_和小胖一起理解CPU负载和利用率

    作者:小胖前言 凌晨一点,正整着炸鸡的小胖,微信一呼"你的服务器CPU持续超载 - " 麻溜的连上服务器,先把CPU负载摁下来.仔细一想,最近1分钟平均负载很大,但CPU利用率却≤ ...

  4. java cpu监控,java系统监控CPU 磁盘

    java系统监控CPU 磁盘 import java.io.*; /** * linux 下cpu 内存 磁盘 jvm的使用监控 * @author avery_leo * */ public cla ...

  5. Java工程进行性能测试时通常要考虑哪些要素,如何使接口响应时间在毫秒级范围,Java项目如何进行性能测试?0.2s的反应时间内返回响应,用户感知情况较好。附IO密集型和计算密集型性能测试摸底代码

    研究表明,人的反应时间通常在0.2s左右,运动员0.14s已经是顶级反应了,所以响应时间在0.2秒以内通常是无感的.那么在性能测试时,需要关注哪些指标呢? CPU:有的应用需要大量计算,他们会长时间. ...

  6. IO密集型和CPU密集型

    系统有四大资源:CPU.内存.磁盘.网络 CPU密集型: 介绍:说明系统的瓶颈在CPU上面(比如做大量的运算.矩阵运算.计算圆周率.渲染等),此时性能瓶颈就在CPU上面,无论你磁盘读写多块,性能也上不 ...

  7. io密集服务器cpu性能,IO密集型和CPU密集型 线程数的计算

    CPU密集型 每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费.对于计算密集型的应用,完全是靠CP ...

  8. java监控cpu绘图,java gateway监控cpu使用率

    1. 下载zabbix java gateway源码. 2. 修改zabbix-java源码 3.修改JMXItemChecker,增加如下代码: /** * @des get cpu usage * ...

  9. 谈计算(cpu)密集型和io密集型与php性能优化

    这篇文章计划很久了一直感觉无从下手, 一直想全面.深入的写一篇关于php优化,但思绪很乱,经过很多天的构思和整理,终于有点头绪了. 几十年来,php以超高的开发效率.低成本的投入.内置丰富的函数库.灵 ...

最新文章

  1. UML之交互图(协作图和顺序图)
  2. android 默认光标大小设置,如何默认光标位置设置的EditText
  3. Hadoop HBase概念学习系列之HBase的Shell(步骤非常清晰)(二十四)
  4. 12行代码AC——L1-058 6翻了(15分)
  5. python之os模块
  6. 把庞大的 npm script 拆到单独文件中
  7. 数据库水平切分(MyCat分片)
  8. 使用dx命令在cmd环境下执行的正确方法,我用的版本android4.4.2,jdk1.8
  9. JAVA编写俄罗斯方块
  10. 方案:软件集成测试工作流程指南
  11. LNK2005符号重定义问题
  12. Chrome键盘快捷键
  13. js函数式编程之柯里化(curry)
  14. 《博客女王干群皇太后名人世界》中国最著名博客女王干群原创作品编号2012100706
  15. 魔域充值卡表cq_card里chk_sum参数的算法
  16. python中迭代_python中的迭代什么意思
  17. 基于R语言的层次聚类分析-【案例实操】-基本操作,一看就会
  18. 华为通信能力开放系列--华为通信能力开放平台初印象
  19. You Can’t Future-Proof Solutions
  20. Lasso回归理论及代码实现

热门文章

  1. vector基础操作
  2. JavaScript(15)jQuery 选择器
  3. GMT 时间日期格式
  4. 关于“习惯”的精彩分析
  5. thinkPHP开发基础知识 包括变量神马的
  6. Android 计步功能-简单实现
  7. Leetcode1710. 卡车上的最大单元数[C++题解]:贪心
  8. 中国人民大学_《组织行为学》_11怎样招到最合适的人
  9. oracle awr windows,windows下的oracle 如何生成awr报告
  10. python 类继承和组合_Python:继承与组合