最近由于有抢票的需求,对于一个用户而言,用一个死循环,一个刷票就好了,刷到了就break退出。但是现在我要考虑同时给很多人抢,那么必须要考虑并发。但是这是一个耗时的任务,很可能几天都不能结束这个任务,所以这个和普通的java web并发不同。我在思考如何设置这个线程模型时引出了一个问题,之前还一直都没思考过这个。

多核时,一个线程是始终由一个cpu核运行还是每个cpu核都会运行该线程呢?

先来看看进程的三种状态

对于这个问题,先假设第一种情况成立(线程始终由某一个核执行)

那么对于一个四核cpu来说,一个线程A假如第一次是有cpu0执行,那么后续直到执行完毕,A永远由cpu0执行。

再假设第二种情况成立(线程由不同的核执行)。

那么对于一个四核cpu来说,一个线程A假如第一次是有cpu0执行,那么第二次可能由cpu1执行,第三次可能由cpu2执行,第四次可能由cpu3执行,每个cpu交替执行,直到A执行完成。

那么,到底哪种假设是正确的呢?,为此我做了一个简单的测试。

我用xcode写了一个简单的oc代码

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];while (1) {//死循环用来查看cpu利用率}}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

工程命名cputest,运行模拟器,打开mac上活动监视器观察

可以看到cpu使用率达到了98.3%,咋一看像是使用了一个cpu核,如果这时候你认为假设一是正确的那就错了。可能你会很诧异,明明都快到100%,为什么不是!!!我来告诉你答案,接下来我用查看多核cpu的每个核使用率方法(见我上篇文章mac查看多核cpu利用率)

是不是很惊讶,这个双核四线程里没有一个核达到了98.3%,最高也才50%吧。那么由此我们可以得出结论了,第二种假设是正确的,多核cpu情况下,一个线程不是由某一个核一直执行完成的。

此处需要解释下%cpu = 98.3%是怎么来的, 它是由四核(有两个核是虚拟的)的利用率相加得来的。

但是在实际工作中,你可能会有某些特殊要求,为了优化项目,不得不让某个进程一直由cpu的某一个核执行直到完成。事实上这样也是可以的,你可以指定进程由某一cpu核来完成执行。详情可以搜索 taskset 命令。

另附上知乎   “一个进程能不能在多个核上跑?”  的链接   https://www.zhihu.com/question/31683094

最后 由于春运快到了,给大家安利一个抢火车票的小程序心到抢票,微信扫码关注点击立即抢票即可

个人亲测效率很高,大家也可以加他们官方微信  xdticket  咨询。

线程进程是怎样使用多核的相关推荐

  1. 打开线程 | 进程 | 协程的大门

    不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...

  2. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...

    线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...

  3. python的线程如何启用和结束_python线程进程

    操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...

  4. python协程和线程_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  5. python apply_async死锁_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...

  6. python_21_线程+进程+协程

    python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...

  7. 十四丶并发编程(线程 进程 协程)

    Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...

  8. linux 线程 进程经典文章

    进程是程 序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是 死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能的进程就是 ...

  9. PHP 会话 线程 进程,接上节我们来了解了解多进程的一些基础进程 / 线程 / 多进程 / 父进程 / 子进程 / 会话 / 控制终端等...

    多进程的一些基础 定义 进程/父进程/子进程 进程是资源调度和分配的一个独立单元 进程是由线程组成 即等于 一个进程 = 一个线程. 进程是由另一个进程创建 (系统进程 init进程除外) 所以会出现 ...

最新文章

  1. python ffmpeg pyav
  2. IOS-React-Native:unable to find utility instruments, not a developer tool or in PATH
  3. idea debug只断点当前线程,不阻塞其他线程
  4. Ubuntu桌面版网络设置
  5. [转载] 【Python】向json文件中追加新的对象
  6. indesign软件教程,如何将文本格式保存为样式?
  7. Anonymous推荐软件含有恶意***程序
  8. SVN下载以及中文包安装
  9. 单片机蓝牙模块与手机蓝牙通信(1)
  10. matlab插值拟合
  11. c语言之数据类型长度
  12. proxifier for mac 破解版 v2.19
  13. GuessingGame
  14. google 的高级搜索
  15. php中左移和右移,c语言左移和右移的示例详解
  16. json mysql 字段 默认值_MySQL新增JSON类型字段的使用总结
  17. 南开大学计算机提前批,提前批几家985/211高校爆出冷门,考生:后悔没报最后一所...
  18. yapi 全局变量使用_yapi 中 mock JSONP 接口响应的方法
  19. 上职高学计算机专业有前途吗,职高有哪些专业前途好有发展前景
  20. 回溯法求解消消乐实验

热门文章

  1. 依照测试用例分类(按功能)的结果生成对应的universe文件
  2. 信创云“华山论剑” 五强鼎力谁与争锋?
  3. php实现腾讯云视频加密
  4. bochs安装以及使用
  5. jQuery-----选择器
  6. 利用shell脚本将json文件导入es
  7. 数据类型扩展及面试题讲解
  8. mysql 数字 除以 一万_腾讯股票接口、和讯网股票接口、新浪股票接口、雪球股票数据、网易股票数据...
  9. 忘记网站登录密码不要慌,一招拯救你
  10. 双11付费专栏9折优惠