`

CPU核数跟多线程的关系

 
阅读更多

原文  http://blog.csdn.net/qingchen191/article/details/20478651

一直以来有这样的疑惑,单核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有几个核心是没什么关系的。

分享到:
评论

相关推荐

    Linux系统:物理cpu数、cpu核数、逻辑cpu数、几路几核几线程、CPU信息详细查询方法

    文章目录一、名词解释二、查看CPU信息参考文献未看完的参考文献 一、名词解释 CPU(Central Processing Unit): 中央处理单元, ...cpu核数: 每颗物理CPU可以有1个或者多个物理内核,通常每颗物理CPU

    Java多线程的使用

    近在项目里面使用了多线程处理技术,...  2.1对于内核数这个来做下自己的说明,当时自己在做的时候,查看了一些对于使用cpu核数的文章  有些高手做了一些性能方面的测试,表示当核数叫多的时候,处理性能提升很好,

    多核CPU测试工具(PI)

    CPU测试...多线程测试多核CPU的工具

    Python—-多线程—-多任务

    并发:指的是任务数多于cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已) 并行:指的是任务数小于等于cpu核数...

    Java多线程的初识与简单的安全问题解决

    多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,...

    计算机的底层秘密 - 了解计算机的基本逻辑(带目录)

    CPU核数与线程数有什么关系?你管这破玩意叫mmap? 彻底理解零拷贝 操作系统与内核有什么区别?彻底理解树的递归遍历 CPU寄存器是如何装入结构体的? CPU可以跑多快?从地球到火星的距离告诉你回调函数实现的...

    java7hashmap源码-lf-study-java-multithreading:华东师范及马士兵多线程,项目主要介绍java多线程以及

    java多线程和多进程 以下内容包含:华东师范大学的多线程讲解 及 马士兵多线程讲解 马士兵多线程讲解迁移位置:仓库 DOCRecord\ResteasyComplexDemo\src\pers\lishbo\timetask 1.多进程: 1.当前的操作系统都是多...

    使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)

    我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都...

    Python实现的多进程拷贝文件并显示百分比功能示例

    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep physical id| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep cpu ...

    XCode编译速度慢的处理方法

    XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。 2. 将Debug Information Format改为DWARF 在工程对应Target的Build...

    python基础教程:Python实现的多进程拷贝文件并显示百分比功能示例

    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu...

    c# 面试必备线程基础知识点

    线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统、CPU、...严格意义上来说,同一时间可以并行运行的线程数取决于 CPU 的核数。 根据线程运行模式,可以把线程分为前台线程、后台线程和守护(Daemon)线程:

    多核计算与程序设计(2009年3月1日出版)第一二三部分

    本书是我从学校图书馆下的,出版时间: 2009-3-1。看本书之前最好先看《多任务下的数据结构与...本部分介绍的各种并行算法和程序中,重点介绍如何解决多核系统中的计算随CPU核数的扩展性,CPU Cache伪共享方面的问题。

    XCode 加快编译链接速度的方法

    加快XCode的编译链接速度,XCode编译速度慢的解决方案 ...XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度

    cordova插件开发 (手机单核多核)

    使用cordova开平台开发 代码亲测亲手写的 可用 验证就是手机CPU的核数 只是android的实现没有写ios平台 在研究插件的人可以看一下 有详细的注释

    面向煤炭开采的大数据处理平台构建关键技术

    对于服务器的CPU,提出主结点服务器用多内核多线程的CPU;对于集群存储系统,提出将服务器应用软件存储与海量数据储存分离,服务器本机选用固态盘用于存储应用软件,海量数据存储系统采用网络接入存储和存储区域网络...

    Android-SmartStart一个Android智能启动框架

    框架特性:1、支持依赖关系。2、多样化任务:可选择延时任务、IO任务。3、智能多线程异步:根据CPU核数控制线程池大小。4、自学习优先级能力:根据上一次启动的任务链耗时,计算本次启动每个任务的优先级

    c/c++用一个源文件,一个头文件实现的线程池源码,包含测试代码,可运行

    工作线程的数量建议设置到和cpu的核数一样。 9、编码方式: g++ -std=c++11 -o test test.c cppThreadWorkers.cpp -I./ -lpthread test.c:测试的c文件; cppThreadWorkers.cpp: 线程池源文件 cppThreadWorkers.h: ...

    Vert.x应用开发实例教程

    一个Vert.x有一个或多个事件循环线程组成,线程最大数量为主机有效的CPU核数。 Event Loop Vertical:事件的业务处理线程,存在于Event Loop中,用于处理非阻塞短任务。 Worker Vertical : 事件的业务处理线程,用于...

    hbasedatacompare:并发scan hbase,redis 的工具类

    Concurrent scanning of data sources 工具介绍 这是一个并发扫描数据源(hbase,redis)的工具,多线程scan提高效率,但会... scan redis key不属于cpu密集型操作,线程池大小可以设置大一些(cpu核数的两倍)。 2.hbased

Global site tag (gtag.js) - Google Analytics