当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发。

首先,要先了解几个概念:

  1、进程是程序的一次执行。

  2、进程是资源分配的基本单位。

  3、一个进程可以包括多个线程。

  4、在单CPU计算机中,有一个资源是无法被多个程序并行使用的:CPU。

  5、操作系统调度器:拆分CPU为一段段时间的运行片,轮流分配给不同的程序。

  6、操作系统内存管理模块:管理物理内存、虚拟内存相关的事务。

  由于CPU同时刻只能执行一个进程,如果我们不加以控制的话,一个进程可能使用CPU直到运行结束,于是出现了操作系统调度器,而进程也成为了调度单位。

  进程的运行不仅仅需要CPU,还需要很多其他资源,如内存啊,显卡啊,GPS啊,磁盘啊等等,统称为程序的执行环境,也就是程序上下文。

  在这里就出现了并发的概念,调度器切换CPU给不同进程使用的速度非常快,于是在使用者看来程序是在同时运行,这就是并发,而实际上CPU在同一时刻只在运行一个进程。并发只是给人的假现象 ,原因就是由于cpu工作很快,不断地loop感觉是同时发生,实际都是单个执行的。

  CPU进程无法同时刻共享,但是出现一定要共享CPU的需求呢?此时线程的概念就出现了。线程被包含在进程当中,进程的不同线程间共享CPU和程序上下文。(共享进程分配到的资源)

  单CPU进行进程调度的时候,需要读取上下文+执行程序+保存上下文,即进程切换。

  如果这个CPU是单核的话,那么在进程中的不同线程为了使用CPU核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换比进程切换开销少了很多。在这里依然是并发,唯一核心同时刻只能执行一个线程。

出现线程的原因就是由于进程切换需要大量的资源切换,线程却还资源是共享的,切换速度很快,占用资源小,线程内容是隐私的,存储一些上下文信息,以及堆栈信息,占用内存很小,切换很快,同一进程不同线程切换共享进程资源,切换迅速。

  如果这个CPU是多核的话,那么进程中的不同线程可以使用不同核心,真正的并行出现了。多核才是并行,单核只能说是并发,假并行

  线程是CPU调度和分配的基本单位,一定要和 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 区别清楚。有句话说CPU只能看到线程,可以这么理解,假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。于是线程是CPU调度和分配的基本单位。

  最后说一下操作系统内存管理模块这里做的事:在这之前,程序员需要为每个程序安排运行的空间,这里的空间指的是内存的物理地址,但是这么的问题就是,每个程序都要协商如何使用同一内存的不同空间,而且程序员还要关心底层内存分配问题。解决办法就是,提出进程的概念,每个进程用一样的虚拟地址空间,CPU上增加了MMU模块负责转换虚拟地址和物理地址,虚拟地址经过操作系统和MMU之后,虚拟地址会映射到不同的物理地址,不同的进程就能获得各自独立的物理内存空间。

  另外在有的操作系统里,进程不是调度单位,线程是最基本的调度单位,调度器只调度线程,不调度进程,如VxWorks。

  总结:

  1、单CPU中进程只能是并发,多CPU计算机中进程可以并行。

  2、单CPU单核中线程只能并发,单CPU多核中线程可以并行。

  3、无论是并发还是并行,使用者来看,看到的是多进程,多线程。

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

———————————————— 
版权声明:本文为CSDN博主「mengxuepingwxhn」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38998213/article/details/87688929

多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别相关推荐

  1. 多CPU/多核/多进程/多线程/并发/并行之间的关系

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

  2. Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)

    Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 文章目录 Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux) 摘要 1 什么是CPU亲缘性 2 目的 3 API ...

  3. 怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...

    本文带来各类奇怪的IT百科知识. [百尺竿头,更进一步学Python]Python进阶课程--进程:线程和协程的区别 现在多进程多线程已经是老生常谈了:协程也在最近几年流行起来.今天我们本文主要介绍进 ...

  4. 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件:应用程序是具有某种功能的程序,程序是运行 ...

  5. 进程和线程最生动的理解

    进程 (process)和 线程 (thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.我发现有一个很好的类比,可以把它们解释地清晰易懂. 计算机的核心是CPU,它承担了所有的计算任务. ...

  6. php和python的多线程,Python多线程以及线程锁简单理解(代码)

    本篇文章给大家带来的内容是关于Python多线程以及线程锁简单理解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 多线程threading 模块创建线程创建自己的线程类线程通 ...

  7. python协程和线程区别_Python中进程、线程、协程及其区别

    以下为复制内容: https://blog.csdn.net/mr__l1u/article/details/81772073 1> 进程.线程和协程的认识: 进程是系统进行资源分配和调度的独立 ...

  8. 进程 线程 多进程 多线程 父进程 子进程

    1. 进程定义: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  9. python线程池并发_python 并发编程多线程之进程池/线程池

    一.验证GIL锁的存在 Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可以"运行"多个线程,但在任意时刻只有一个线程在解释器中运行 ...

最新文章

  1. 业界对生成图片缩略图的做法归纳
  2. div内实现文字左右循环滚动
  3. 【转】【UNITY3D 游戏开发之五】Google-protobuf与FlatBuffers数据的序列化和反序列化...
  4. 项目开发之git配置
  5. Nature 机器智能综述:AI如何自动生成游戏
  6. C# 互通操作 (二)基础知识1
  7. WPF实现统计图(饼图仿LiveCharts)
  8. gtest 编译、安装和使用
  9. 操作系统 —— 内存管理
  10. X86 “将死“?RISC-V 正当立
  11. windows小工具
  12. 苹果mac轻量级思维导图软件:Xmind
  13. 20200128每日一句
  14. 网速慢?网线选对了吗?!网线类型对应带宽等详细参数
  15. 经典上海弄堂线路攻略
  16. 用 Python 做股市数据分析(2)
  17. 知识图谱从入门到应用——知识图谱的获取与构建:知识工程与知识获取
  18. 频数直方图的步骤_《频数直方图》PPT课件
  19. 【OpenGL学习笔记①】——openGL flew flgw flut 环境配置 + 绘制出Hello World
  20. 项目分享|小师弟手把手教你用蓝牙模块

热门文章

  1. kylin 部分问题
  2. 计算机图形学基础考试题及答案,计算机图形学基础模拟试题参考答案
  3. android+listview设置行高,android – 无法在行xml中设置listView行高的高度
  4. html按钮按下效果_您应该在网站中尝试的8种惊人的HTML按钮悬停效果,让您的网站令人难忘...
  5. 光纤熔接盒盘线方法_【图文教程】光纤熔接技术的操作与技巧分享!
  6. 如何编译 php,如何编译安装一个php模块
  7. python使用xml布局界面_Python:使用ElementTree更新XML文件,同时尽可能地保留布局...
  8. linux vi删除操作,vi删除操作
  9. sdk没有登录什么意思_检查肝功能没有空腹,影响效果吗?转氨酶100是什么意思?...
  10. powerbuilder查询符合条件的数据并且过滤掉其他数据_论文浅尝 ISWC2020 | KnowlyBERT: 知识图谱结合语言模型补全图谱查询...