此文中的大部分资料来自于网络上,我只是觉得把有道理的整理一下,方便以后查阅。

1.多线程在单核和多核CPU上的执行效率问题的讨论
a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢)
多个cpu的话就可以在两个cpu中同时执行了..............

a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑

效率不会有提高的
切换线程反倒会增加开销

a3: #3楼说的是对的。所以一般没有必要的话,尤其在单核CPU的时候,不推荐使用多线程。
单核CPU时使用多线程,通常是有线程要处于等待状态。
而对于普通的进度条更新类的,能够简单控制的(比如:在循环里面手动处理消息)就简单控制,一般不使用线程,这样可以提高程序的性能。并且避免掉不必要的线程同步问题。

a4: 你试一下双核三线程,保准效率反而比双线程低!

算法同样时,CPU占用率达到100%的最小线程数效率最高,如果是cpu占率率高的运算单核单线程,双核双线程,四核四线程是最适合的。

但为什么有时候线程数超过CPU内核数会更快呢?原因是这种程序的单个线程运算量不足以占满CPU一个内核(比如存在大量IO操作,IO比较慢,是程序瓶颈)。

a5: 多线程的用处在于,做某个耗时的操作时,需要等待返回结果,这时用多线程可以提高程序并发程度。如果一个不需要任何等待并且顺序执行能够完成的任务,用多线程简直是浪费。

http://bbs.csdn.net/topics/320003381

2.浅谈多核CPU、多线程与并行计算

a1: CPU发展趋势

核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。

a2: 线程越多越好吗?什么时候才有必要用多线程?

线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。

Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

什么时候该使用多线程呢?这要分四种情况讨论:

a.多核CPU——计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。

b.单核CPU——计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。

c.单核CPU——IO密集型任务,使用多线程还是为了人机交互方便,

d.多核CPU——IO密集型任务,这就更不用说了,跟单核时候原因一样。

4.程序员需要掌握的技巧/技术

(1)减少串行化的代码用以提高效率。这是废话。

(2)单一的共享数据分布化:把一个数据复制很多份,让不同线程可以同时访问。

(3)负载均衡,分为静态的和动态的两种。具体的参见有关文献。

http://www.linuxidc.com/Linux/2015-02/113734.htm

3.请问:CPU的多核和应用程序的多线程的关系是怎么样的?
a1: 多核儿就是系统同时可以运行多个线程,比如双核可以同时执行两个线程。单核儿只能一次执行一个线程。

a2: 试了一个ping 从192.168.0.1 到192.169.0.255的程序
用多线程做的,发现在单核的机器上和多核的机器运行性能有两倍左右的差异。

a3: 多核对于用户,应该说对于程序员来说,是透明的,根本不用管它,当你是单核的编程就可以了,除非使用OpenMP进行编程,就用很多条条框框了,另外你上面的测试是不准确的,网络(主要是远程主机)会因为不同时候而有不同的响应速度,你应该在干净的本机同环境下进行测试.但是,对于多线程多核优于单核还是可以确定的. 总之,我们不用担心程序在单核或多核上会出现并发问题.

a4: 多核指的是CPU有多个核心,多线程是程序有多个线程在同时执行。
多核也要用多线程才能发挥优势。
同样,多线程要在多核上才能真正有优势。
这点来说,对程序员不是透明的。程序员可以控制程序/线程在哪个CPU(核)上运行。用户也可以控制程序在哪几个核上运行。所以多核,多线程对用户和程序员都不是透明的。程序员必须了解这方面的知识。才能让程序最大限度的发挥机器的性能。

http://bbs.csdn.net/topics/120075600

4.pthread
php手册中关于pthread有关函数: http://php.net/manual/en/book.pthreads.php
pthread扩展:http://pecl.php.net/package/pthreads

http://www.baidu.com/s?wd=php%20pthread
http://www.sogou.com/web?query=php%20pthread
http://www.sogou.com/web?query=php%20pthread

延伸阅读:
http://www.baidu.com/s?wd=多线程程序%20单核cpu%20多核cpu
http://www.sogou.com/web?query=多线程程序%20单核cpu%20多核cpu
http://www.sogou.com/web?query=多线程程序%20单核cpu%20多核cpu
[转]浅谈多核CPU、多线程与并行计算: http://www.cnblogs.com/lihaozy/archive/2013/03/13/2957520.html
PHP使用Pthread实现的多线程操作实例: http://www.jb51.net/article/74849.htm
php三种实现多线程类似的方法: http://www.jb51.net/article/74165.htm

对于多线程程序,单核cpu与多核cpu是怎么工作的的更多相关文章

  1. 多线程程序在单核cpu与多核cpu上是怎么工作的?

    转自 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢) 多个cpu的话就可以在两个cpu中同时 ...

  2. (概念)多个CPU和多核CPU以及超线程(Hyper-Threading)

    引言 在这篇文章中我会主要介绍CPU相关的一些重要概念和技术.如果你想更好地了解操作系统,那就从本文开始吧. 中央处理器(Central processing unit) 在我们了解其它概念之前,我们 ...

  3. java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction;RecursiveTask

    1,给定并行级别: 1,ExecutorService newWorkStealingPool(int parallelism): 创建持有足够的线程的线程池来支持给定的并行级别,该方法还会使用多个队 ...

  4. 多核cpu电脑运行多线程程序的问题

    呵呵,当初我学多线程时也遇到过这样的问题,也是输出的结果每次都不一样.后来我找到原因了---都是多核惹得祸. 我猜你的电脑应该也是多核的.单核的cpu在处理多线程时每次只能执行一跳指令,也就是说无论你 ...

  5. 浅谈多核CPU、多线程、多进程

    1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其 ...

  6. 多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  7. python多线程不能利用多核cpu,但有时候多线程确实比单线程快。

    python 为什么不能利用多核 CPU  GIL 其实是因为在 python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁.  1.最开始时候设计GIL是 ...

  8. “多个单核CPU”与“单个多核CPU”哪种方式性能较强?

    多个单核CPU: 成本更高,因为每个CPU都需要一定的线路电路支持,这样对主板上布局布线极为不便.并且当运行多线程任务时,多线程间通信协同合作也是一个问题.依赖总线的传输,速度较慢,且每一个线程因为运 ...

  9. 多CPU,多核,多进程,多线程

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位(调度单位). 3.一个进程可以包括多个线程. 4.在 ...

随机推荐

  1. php数据结构课程---3、队列(队列实现方法)

    php数据结构课程---3.队列(队列实现方法) 一.总结 一句话总结: 1.数据实现:适用于功能不复杂的情况 2.链表实现:受限链表,只能队头队尾操作:适用于功能复杂情况 1.队列的数组实现注意点? ...

  2. web项目中添加logger日志

    在项目中添加log4j.xml文件 log4j.xml文件 <?xml version="1.0" encoding="UTF-8" ?><! ...

  3. Android Studio Mac版快捷键

    mac上按键符号 ⌥ : option / alt ⇧ : shift ⌃ : control ⌘ : command ⎋ : esc (一)查找/查看相关 搜索任意内容 双击 sft 当前文件查找/ ...

  4. css中单位px和em,rem的区别

    PX:PX实际上就是像素,用PX设置字体大小时,比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,如果改变了浏览器的缩放,这时会使用我们的Web页面布局被打破.这样 ...

  5. 在接口中的静态方法来获取model的实例对象

    直接先上代码: 接口代码 abstract class BaseModel { /** * @var null */ protected static $_instances = Array(); / ...

  6. Linux Shell 判断块设备节点是否存在

    /************************************************************************* * Linux Shell 判断块设备节点是否存在 ...

  7. BZOJ1216:[HNOI2003]操作系统

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  8. 问题4:对dict、list、tuple中的元素排序

    一)对字典中元素排序   方法一:利用sorted的key参数进行排序 from random import randint date = {k:randint(0, 20) for k in ran ...

  9. 问题15:如何判断字符串a是否以字符串b开头或结尾

    方法一:使用正则表达式的^和$实现 '^000':表示,只匹配字符串的开头,若开头是 '000' ,则返回 ['000'] : '000$':表示,只匹配字符串的结尾,若结尾是 '000' ,则返回 ...

  10. ArrayList,Vector, LinkedList的存储性能和特性

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入 ...