菜鸟笔记
提升您的技术认知

cpu密集型 io密集型-ag真人游戏

cpu密集型(cpu-bound)
cpu密集型线程的作用是进行无阻塞的逻辑运算的线程。比如:rpg游戏中的游戏逻辑服务器(也叫地图服务器)里面的主逻辑线程,这个主逻辑线程需要进行大量的无阻塞的逻辑处理。当被操作系统内核调度的时候,这个线程就在给定的cpu执行时间内进行无阻塞的操作。如果这个游戏逻辑服务器还创建更多的线程来进行逻辑操作的话,这样的行为是得不尝失的。因为,本进程的线程越多,而本进程获取的cpu执行时间又是固定的,导致了进程内每个线程的执行时间很短。所以,像游戏逻辑服务器中的线程应该属于cpu密集型线程。所以线程不宜过多。

cpu密集型也叫计算密集型,指的是系统的硬盘、内存性能相对cpu要好很多,此时,系统运作大部分的状况是cpu loading 100%,cpu要读/写i/o(硬盘/内存),i/o在很短的时间就可以完成,而cpu还有许多运算要处理,cpu loading很高。

在多重程序系统中,大部份时间用来做计算、逻辑判断等cpu动作的程序称之cpu bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于cpu bound的程序。

cpu bound的程序一般而言cpu占用率相当高。这可能是因为任务本身不太需要访问i/o设备,也可能是因为程序是多线程实现因此屏蔽掉了等待i/o的时间。

io密集型(i/o bound)
io密集型线程是针对于io操作比cpu计算操作占用更多的cpu时间来说的。比如:数据库服务器,这个服务器中的线程的职责就是进行阻塞的io操作。当线程因为io阻塞而进入阻塞状态后,该线程的调度被操作系统内核立即停止,不再占用cpu时间片段,而其他io线程能立即被操作系统内核调度,等io阻塞操作完成后,原来阻塞状态的线程重新变成就绪状态,而可以被操作系统调度。所以,像数据库服务器中的io密集型线程来说,线程的数量就应该适量的多点。

io密集型指的是系统的cpu性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是cpu在等i/o (硬盘/内存) 的读/写操作,此时cpu loading并不高。

i/o bound的程序一般在达到性能极限时,cpu占用率仍然较低。这可能是因为任务本身需要大量i/o操作,而pipeline做得不是很好,没有充分利用处理器能力。

cpu密集型 vs io密集型
我们可以把任务分为计算密集型和io密集型。

计算密集型任务的特点是要进行大量的计算,消耗cpu资源,比如计算圆周率、对视频进行高清解码等等,全靠cpu的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,cpu执行任务的效率就越低,所以,要最高效地利用cpu,计算密集型任务同时进行的数量应当等于cpu的核心数。

计算密集型任务由于主要消耗cpu资源,因此,代码运行效率至关重要。python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用c语言编写。

第二种任务的类型是io密集型,涉及到网络、磁盘io的任务都是io密集型任务,这类任务的特点是cpu消耗很少,任务的大部分时间都在等待io操作完成(因为io的速度远远低于cpu和内存的速度)。对于io密集型任务,任务越多,cpu效率越高,但也有一个限度。常见的大部分任务都是io密集型任务,比如web应用。

io密集型任务执行期间,99%的时间都花在io上,花在cpu上的时间很少,因此,用运行速度极快的c语言替换用python这样运行速度极低的脚本语言,完全无法提升运行效率。对于io密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,c语言最差。

总之,计算密集型程序适合c语言多线程,i/o密集型适合脚本语言开发的多线程。

网站地图