CPU核数跟多线程的关系
来源:互联网 发布:网络安全法明确了 编辑:程序博客网 时间:2024/06/05 14:32
一直以来有这样的疑惑,单核CPU适合多线程吗?是不是几个核的CPU开几个线程是最合适的?
今天就这一问题查了一些资料,现整理如下:
要说多线程就离不开进程,进程和线程的区别在这里就不详细说了,只将关键的几点:
a)进程之间是相互独立的,不共享内存和数据,线程之间的内存和数据是公用的,每个线程只有自己的一组CPU指令、寄存器和堆栈,对于线程来说只有CPU里的东西是自己独享的,程序中的其他东西都是跟同一个进程里的其他线程共享的。
b)操作系统创建进程时要分配好多外部资源,所以开销大。(这个跟操作系统有关,有人做过实验,window创建进程的开销大,linux创建进程的开销就很小。)
再来说一下CPU,在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核CPU的情况下,同一时间点可以执行多个任务,具体到这个任务在CPU哪个核上运行,这个就跟操作系统和CPU本身的设计相关了。
我们假设一个极端的情况:在一台单核计算机上只运行2个程序,一个是我们的程序A,另一个是操作系统的程序B,每个程序是一个进程。单核CPU的时候,A和B在CPU上交替运行,具体的分配方式由操作系统来判断,我这里猜测应该跟A和B的线程数有关,因为线程是CPU级别的,如果A有5个线程,B也有5个线程,那么CPU分配给A和B的时间应该是1:1的;如果A增加到15个线程,CPU分配给A和B的时间应该是3:1的比例。所以此时如果A的线程数多,那么获得的CPU执行次数就多,处理的速度也就快了。以上假设的前提是:①A和B的优先级相同,②A和B都是只消耗CPU资源的程序。
如果相同的情况用一个双核的计算机来处理又会是什么结果呢?假设这个双核的计算机和操作系统比较傻,把A进程分配到核1上,B进程分配到核2上,那不管A有几个线程,都是用核1来处理,那么时间肯定是一样的。不过现实中应该不会有这么傻的CPU和操作系统吧。 所以赶紧还是会根据线程来进行处理,当A的线程比B多时,会占用核2来处理A的线程。
刚才说的是只消耗CPU资源的程序,但这样的程序在实际应用中基本上是没有的,总会有跟资源打交道的。比如读个文件,查个数据库,访问一个网络连接等等。这个时候多线程才真正体现出优势,在一个进程中,线程a去读文件,线程b去查数据库,线程c去访问网络,a先用一下CPU,然后去读文件,此时CPU空闲,b就用一下,然后去查数据库,……,相对于读文件、查数据库、访问网络来说CPU计算的时间几乎可以忽略不计,所以多线程实际上是计算机多种资源的并行运用,跟CPU有几个核心是没什么关系的。
- CPU核数跟多线程的关系
- CPU核数跟多线程的关系
- CPU核数跟多线程的关系
- CPU核数跟多线程的关系
- CPU核数和多线程的关系
- cpu个数、核数、线程数、Java多线程关系的理解
- linux物理cpu,逻辑cpu,cpu核数的关系与区别
- 虚拟机处理器核数与物理cpu的关系
- ubuntu下cpu数,核心数,线程数的关系
- ubuntu下cpu数,核心数,线程数的关系
- Linux下cpu数,核心数,线程数的关系
- CPU的核心数、线程数的关系和区别
- CPU的核心数、线程数的关系和区别
- linux的CPU物理颗数、内核数、线程数查看及关系
- 线程与CPU核的关系
- 关于oracle 10g的bit数 跟 os的bit数 跟 硬件的bit数之间的支持关系
- 感悟:Java的多线程跟Java的类系统之间的关系
- 物理cpu 逻辑cpu cpu核数
- 装船问题
- ffmpeg加入libass
- Java研发方向如何准备BAT技术面试答案(下)
- Jenkins入门系列之——00答疑解惑
- SQL Server的ltrim()和rtrim()函数
- CPU核数跟多线程的关系
- iBatis简单入门教程
- 任务和特权级保护(一)
- request.getRemoteAddr() 获取的值为0:0:0:0:0:0:0:1的原因及解决办法
- Jenkins进阶系列之——15Maven获取Jenkins的Subversion的版本号
- 编码规范建议
- 剑指offer 面试题4 替换空格
- git
- QQ笔试