Open xinrong2019 opened 5 years ago
CPU密集型,英文叫CPU-bound,也叫计算密集型。用于描述偏向于计算的应用,比如数学计算、逻辑运算、循环、视频的高清解码等,不需要经过磁盘和网络IO的运算任务。
表现就是,CPU占用率很高,IO占用率低。
IO密集型,英文叫I/O bound,一般指磁盘或网络IO,需要读写和传输大量数据。
表现为,IO占用率高,CPU占用率低。
计算密集型任务同时进行的数量应当等于CPU的核心数。因为过多的并行任务,需要更多的CPU线程切换,而对于CPU密集型任务来说,CPU资源是最宝贵的,显然你不能同时处理过多的任务。
对于CPU密集型任务来说,代码运行效率至关重要,所以Python这样的脚本语言运行效率很低,C语言更适合CPU密集型任务。
对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。
总之,计算密集型程序适合C语言多线程,I/O密集型适合脚本语言开发的多线程。
参考:
幂等可以保证重复操作不要紧,不会出现问题。比如:重复按两次电梯按钮,不会叫来两部电梯。
幂等实际上保障的是安全重试,安全重试是分布式系统最基础的保障,否则就无从谈及分布式一致性。
为什么要学习编程?为什么要学习并发编程?
编程,是为了和机器交互,让机器按照人的思维,去做提高效率的事情。
并发编程,是为了充分利用现代CPU的多核能力,充分利用现在分布式集群、横向扩展的能力。一方面并发编程提高了处理问题的能力,另一方面也带来了附加的问题,比如各个环节的故障如何处理,比如各节点网络通信的问题,如果做高可用,如何实现事务,保证操作的原子性、一致性。这些问题就是你需要思考的,要一直带着问题,为什么要学习并发编程,才能更持久的学下去。