转载自:
https://blog.csdn.net/qq_21480607/article/details/100135524

首先我们需要了解一些基础概念:

串行,并发与并行

串行

多个任务,执行时一个执行完再执行另一个。

并发

多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。

并行

每个线程分配给独立的核心,多个线程同时运行。

一、多核多线程

cpu的超线程技术

以2核4线程的电脑为例,电脑只有一个处理器(cpu)芯片,2个核是指在一个cpu中集成了两个完整的计算引擎(内核)。

多核

仅仅提高单核芯片的速度会遇到很多问题,英特尔工程师转而“横向发展”,提高计算机性能。线程应用能够充分利用多个内核,在同样的时间内完成更多的任务,大大提高cpu的性能。多核处理器是单枚芯片,可以插入一个处理器卡槽内,操作系统会利用相关资源将单枚芯片中的多个执行内核分立为多个处理器。

多线程(不同于程序中的多线程)

事实上单个执行内核的性能并没有被充分利用,因此工程师们又采用了另一个思路去提高cpu性能,即让单个执行内核可以同时执行多重线程,从而进一步提高cpu性能,这就是所谓的超线程技术。

虽然单线程核心每秒能处理成千上万条指令,但任一时刻,内核只能对一条线程进行操作,而其实这个内核还有很多性能没有被利用到,空闲着。超线程技术就是在一个执行内核上同时执行两个线程,两个线程共享这一个内核的资源。理论上来说就像两个独立的执行内核分别同时执行两个线程一样,但其实并不是这样。当两个线程同时需要同一个内核资源时,其中一个线程必须等待另一个线程使用完后释放资源,才能继续执行。所以超线程性能并不等于两个执行内核的性能。这里的多线程只是逻辑上的多线程,并不是真正意义上独立的多线程。

二、多进程与多线程

1. 多任务

思考这样一个场景,你正在使用电脑一边播放音乐,一边浏览网页,同时还在聊QQ。此时电脑上至少有三个任务在“同时”运行,其实还有许多任务在后台执行只是你看不到罢了。任务数远大于cpu核心数,所以这里的多任务同时运行往往指的是并发执行,而不是并行执行。大量任务在cpu的多个内核上交替切换执行,但由于cpu执行速度太快,以至于我们感觉不到任务的切换,让人感觉所有任务都是在同时运行着。事实上,如果cpu是2核2进程的,则同一时刻只能有2个任务同时执行;如果cpu是2核4进程的,理论上同一时刻能够同时执行4个任务,实际上往往并不会达到4个任务并行执行,原因上节已经讲述在此不再赘述。

2. 多进程与多线程

对于操作系统来说,一个任务就是一个进程。比如打开一个world就是一个进程,打开两个world就是两个进程,打开浏览器也是一个进程。但有些进程不单单只完成一件事,比如在浏览器上看电影时,浏览器既要播放视频又要播放音频还要播放字幕等,这样在一个进程内就要做多件事,这多个子任务实际上就是进程中的线程。

由于每个进程至少要干一件事,多以每个进程至少有一个线程。多个线程的执行方式和多进程执行方式一样,是由操作系统在多个线程间切换执行的,切换速度极快导致我们感觉多个线程是同时执行的,事实上,现代操作系统都将线程作为最小的调度单位,而将进程作为资源分配的最小单位。一个进程内的多个线程是可以并行运行在多个核上的,但这也并不是一定的,比如python的线程模型并不支持并行运行在多个核上。

3. 多任务与多进程,多线程的关系

结合以上两节我们可以总结出同时执行多个任务的3种解决方案:

  • 多进程模式:开启多个进程,每个进程开启一个线程,每个线程完成一件事,多个进程就完成多件事
  • 多线程模式:开启一个进程,一个进程里开启多个线程,每个线程完成一件事,1个进程就完成多件事
  • 多进程和多线程组合模式:开启多个进程,每个进程内开启多个线程,每个线程完成一件事,多个进程就完成多件事

以上三个解决方案中,方案三实现起来很复杂,需要解决的问题很多,使用的较少。而方案二,看似很好,一个进程就能完成多件事,那我们是不是可以将多个任务都在一个进程内的多个线程上完成呢?事实上,一个进程内不能无限制地开启很多个线程,当线程数量超过一定上限时,进程内线程间的切换,上下文环境的保存恢复需要占用大量时间,导致cpu性能下降。

4. 多进程与多线程的关系及优缺点

进程与线程间的关系:

  • 一个进程至少有一个线程,可以有多个线程,但不可有过多的线程,否则性能下降
  • 一个进程内的多个线程可以并行运行在多核多线程的处理器上
  • 一个线程只属于一个进程,不可能两个或多个进程拥有同一个线程
  • 进程是操作系统资源分配的最小单位,一个进程内的多个线程共享该进程的资源
  • 线程是操作系统调度的最小单位,即cpu分配给线程,真正在cpu上执行的是线程

多进程的优缺点

优点:每个进程间是相互独立的,一个进程的崩溃不会影响到其他进程的执行,稳定性高。

缺点:进程创建,调度等开销大。

多线程优缺点

优点:多线程直接共享进程资源,创建调度等开销小。

缺点:正是由于多线程共享进程资源导致任何一个线程挂掉都可能导致整个进程奔溃。

不管是多进程还是多线程,如果数量一多,效率就会下降,因为系统调度会占用大量cpu时间。

三、python中的多线程

前面说到一个进程内的多个线程可以并行运行在多个cpu内核上,但Python程序的线程不能运行在多个内核中,所有线程都只能在一个cpu内核中交替执行。因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL(Global interpreter Lock)锁,python线程在执行前必须先获得GIL锁,而一个进程中只有唯一的一个GIL锁,导致python线程不能实现并行。即使是100个线程在100个核的cpu上执行,真正能用到的也只有一个核。python中虽然可以使用多线程,但无法利用多核的性能。

解决方案:

  • 重写python的解释器,实现一个不带GIL锁的解释器
  • 对线程并行要求较高的程序,核心代码使用C,C++或java来编写
  • 使用多进程来替代多线程,充分利用多核的性能。多个python进程各自有自己的GIL锁,互不影响。

四、IO密集型 vs 计算密集型

是否需要开启多进程,多线程?开启多少个进程,线程?这与任务的类型有关。我们可以将任务分成IO密集型和计算密集型两种。

计算密集型
  • 程序主要为复杂的逻辑判断和复杂的运算。
  • cpu的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。
IO密集型

- 程序主要为IO操作,比如磁盘IO(读取文件)和网络IO(网络请求)。 - 因为IO操作会阻塞线程,cpu利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高cpu利用率。


并发、并行、线程、进程与CPU基本概念相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_1整起(进程线程协程并发并行、进程线程切换进程间通信、死锁\进程调度策略、分段分页、交换空间、OS三大调度机制)

    PART0:OS,这货到底是个啥? OS,是个啥? OS的结构们: 存储器: 存储器的层次结构: 内存:我们的程序和数据都是存储在内存,我们的程序和数据都是存储在内存,每一个字节都对应一个内存地址.内 ...

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

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

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

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

  4. 判断线程是否执行完毕_Java并发编程 | 线程核心机制,基础概念扩展

    源码地址:GitHub || GitEE 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个 ...

  5. Python的并发并行[3] - 进程[1] - 多进程的基本使用

    多进程的基本使用 1 subprocess 常用函数示例 首先定义一个子进程调用的程序,用于打印一个输出语句,并获取命令行参数 1 import sys 2 print('Called_Functio ...

  6. meo学习笔记3:并行与并发,线程与进程的区别

    并发与并行,线程与进程到底有啥区别呀?? 1.前言 最近有为了工作简单看一下操作系统的相关基础问题,看到并发和并行以及线程和进程,感觉可以记录区分一下,以下内容来自网上的文章和我自己的一些理解: 2. ...

  7. 内核/逻辑处理器/线程/多线程/多CPU/多核CPU

    文章目录 1. 逻辑CPU 2. 线程数和逻辑CPU个数,内核个数 3.线程/进程/多核CPU 1. 逻辑CPU 先查看电脑cpu信息,可以看到,是8个逻辑cpu 2. 线程数和逻辑CPU个数,内核个 ...

  8. CPU核心数线程数、程序进程线程、并发并行

    核心数(物理概念) 8核:有8个相对独立的CPU核心单元组,这是物理概念,也就是说1个CPU有 8个独立的小CPU,物理上只能同时处理8个任务,也就是物理上是8核8线程. 线程数(逻辑概念) 既然物理 ...

  9. CPU核心数线程数、程序进程线程、并发并行的简单理解

    CPU核心数线程数.程序进程线程.并发并行.简单理解和区分 这篇文章是对上述感念的简单理解,想深入研究可以看看<计算机组成原理> CPU的核心数 线程数 当我们买电脑的时候,会看到CPU的 ...

最新文章

  1. PCL:英文参考链接
  2. step1 . day2:Linux系统基础知识
  3. Django终端运行报错:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
  4. 在Mac OS X中配置Apache + PHP + MySQL 很详细
  5. pandas某一列去重获取唯一值
  6. 【全套完结】数字信号处理----全套Matlab实验报告【建议保存】
  7. 16天7000dict
  8. STL之字符串类模板 string(一)、C++ string类库简介
  9. Python12306自动抢票下单,五一旅游回家就选Python
  10. 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用
  11. 传说中最贵的跑车: 布加迪威龙
  12. 苹果手机浏览器$(document).on(click,function(){})点击无效的问题(转)
  13. ThinkPHP5_无限极分类
  14. python爬虫-小说《大江大河》
  15. 打印输入的字符串(C语言)
  16. 应届生和工作三年的人究竟有多大差距?
  17. 水泵控制器,适用于0.55-37KW 小功率水泵
  18. SRILM的java接口
  19. ubuntu16.04+anaconda3+python2.7虚拟环境+caffe配置过程及踩坑经历
  20. 图书馆区域集群管理系统软件V4.0

热门文章

  1. 基于主体掩码的实体关系抽取方法
  2. 数据安全治理的几个基本问题
  3. 专题:数据自治开放(下)
  4. 【数据库系统】事务、锁、隔离、自动恢复
  5. 【Java】基于IDE的JUnit软件测试入门
  6. 【Python】PyCharm中Matplotlib绘图不能显示UI效果的问题解决
  7. 以太坊Dapp项目-网页钱包开发手册
  8. 大牛带你深入解读HashMap
  9. day13-递归函数、匿名函数、内置函数
  10. 一线互联网公司的工程师们更应该增长技术以外的职场经验