对线程与进程的区别以及对多线程并发的理解

2023-05-16

一、线程与进程的区别

先简单说说线程与进程的概念:

(1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程。

(2)线程是指进程中的一个执行流程。

区别:

一个程序至少有一个进程,而一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。而线程则是指进程中的一个执行流程,一个进程可以有多个线程,每个线程分别执行不同的任务,当进程内的多个线程同时运行时,这种运行方式就被称为并发运行。

另外,线程与进程还有一个非常重要的区别:每个进程在执行过程中都拥有独立的内存单元,而同一个进程中的多个线程则共享内存,从而极大地提高了程序的运行效率。

二、对多线程并发的理解

多线程并发只是表面和感觉上的并发,并不是实质上的并发。一个线程要运行,它必须占有CPU,而我们目前用的计算机大多都是单CPU的,所以一次最多只能有一个线程获取CPU并运行。

多线程的实质是“最大限度地利用CPU资源”,当某一个线程的处理不需要占用CPU而只需要和I/O等资源打交道时,让其他线程有机会获得CPU资源。这有点类似于“统筹方法”,例如让你打扫房子和烧水,要在最短的时间内做好这两件事,你一定会想到先把水烧上,然后在等水烧开的空闲时间中去打扫房子,而不是先打扫好了再去烧水,也不是先烧好了再去打扫,这个例子里面,你是那个唯一的CPU,而烧水和打扫就是两个线程。

虽然CPU只有一个,但是它在多个线程之间频繁切换,当切换的频率高到一定程度时,我们就感觉所有的线程在同时运行,于是感觉这多个线程是并发的。因此,并发并不是真的指多个线程同时运行,它仅仅只是形容一种现象。就好像说有些人是“铁人”一样,仅仅只是用于形容某个人不怕苦不怕累,像个“铁人”。

1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥

2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。

3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。

其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。

4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。

5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。

6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

为了对以上概念的更好理解举一个简单例子, 假设我要做 烧开水,举杠铃100下, 洗衣服 3件事情。

烧开水 这件事情, 我要做的事情为, 准备烧开水 1分钟, 等开水烧开 8 分钟 , 关掉烧水机 1分钟

举杠铃100下 我要做的事情为, 举杠铃100下 10分钟

洗衣服 我要做的事情为, 准备洗衣服 1分钟, 等开水烧开 5 分钟 , 关掉洗衣机 1分钟

单核情况下

同步的完成,我需要做的时间为 1+ 8 +1 + 10 + 1+ 5 +1 = 27 分

如果异步,就是在等的时候,我可以切换去做别的事情

准备烧开水(1) + 准备洗衣服(1) + 举50下杠铃 (5)分钟+ 关洗衣机 1分钟 + 举杠铃20下 (2)分钟+ 关烧水机 1分钟 + 举30下杠铃(3)分钟

1+1+5+1+2+1+3 =14 分钟

双核 异步 并行

核1 准备烧开水 1分钟+ 举杠铃50下(5)分钟+ 等待3分钟 + 关掉烧水机 1分钟

核2 准备洗衣服 1分钟+ 举杠铃50下(5)分钟+ 关掉洗衣机 1分钟 + 等待3分钟

其实只花了 1+5+3+1 = 10分钟

其中还有双核都等待了3分钟

双核 异步 非并行

核1 举杠铃100下(10)分钟

核2 准备烧开水 1分钟+ 准备洗衣服 1分钟+ 等待5 分钟+ + 关掉烧水机 1分钟 + 等待 1 分钟 + 关掉洗衣机 1分钟

其实只花了 1+5+3+1 = 10分钟

多线程的做法

单核下

线程1 准备烧开水 1分钟, 等开水烧开 8 分钟 , 关掉烧水机 1分钟

线程2 举杠铃100下 10分钟

线程3 准备洗衣服 1分钟, 等开水烧开 5 分钟 , 关掉洗衣机 1分钟

cpu 可能这么切换 最理想的切换方式

线程1 准备烧开水1 sleep 1 sleep 5 sleep 1 sleep 2 关开水 1分钟 exit

线程2 sleep 1 sleep 1 举杠铃50 5分钟 sleep 1 举杠铃20 2分钟 sleep1 举杠铃30下 3分钟

线程3 sleep 1 准备洗衣服1 分钟 sleep 5 关洗衣机1分钟 exit

最后使用了 14分钟 和异步是一样的。

但是实际上是不一样的,因为线程不会按照我们设想的去跑, 如果线程2 举杠铃先跑,整个流程的速度就下来了。

异步和同步的区别, 在io等待的时候,同步不会切走,浪费了时间。

如果都是独占cpu 的业务, 比如举杠铃的业务, 在单核情况下 多线和单线 没有区别。

多线程的好处,比较容易的实现了 异步切换的思想, 因为异步的程序很难写的。多线程本身程还是以同步完成,但是应该说

比效率是比不上异步的。 而且多线很容易写, 相对效率也高。

多核的好处,就是可以同时做事情, 这个和单核完全不一样的。

技术图片

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对线程与进程的区别以及对多线程并发的理解 的相关文章

  • c#中程序以管理员身份运行的三种办法

    三种办法 xff1a 一 设置程序本身的属性 xff1a 勾选 以管理员身份运行此程序 xff0c 必要时设置 更改所有用户设置 以管理员身份运行此程序 xff0c 当然这种办法是被动的 xff0c 也不是最实际的办法 xff1b 二 代码
  • 在c#中将debug/release下文件打包成一个可直接运行exe文件

    winrar5 60 1 选择debug release下所有文件 xff0c 鼠标右键 添加到压缩文件 2 常规 gt 压缩选项 gt 创建自解压格式压缩文件 xff0c 可将默认文件名重命名 3 高级 gt 自解压选项 3 1 设置 g
  • C#-文件只读时进行拷贝或删除报错, 对路径不允许访问

    文件只读时进行拷贝报错 xff0c 解决方法如下 xff1a 设置文件属性为正常 然后在进行拷贝 lt summary gt 拷贝文件夹 lt summary gt lt param name 61 34 sourceDirectory 3
  • c# gdi设置画刷透明

    使用solidBrush新建画刷 xff0c 定义画刷的颜色为透明色 Brush b 61 new SolidBrush Color FromArgb 50 Color Green 这里的50是透明度的设置 xff0c 范围从0 255 x
  • c#中实现图像图像卷积与滤波-高斯平滑

    使用C 语言编写高斯平滑 一 线性滤波与卷积的基本概念 2D卷积需要4个嵌套循环4 double loop xff0c 所以它并不快 xff0c 除非我们使用很小的卷积核 这里一般使用3 3或者5 5 而且 xff0c 对于滤波器 xff0
  • C# 中Bitmap图像处理含增强对比度的三种方法

    Bitmap类 Bitmap对象封装了 xff27 xff24 xff29 43 中的一个位图 xff0c 此位图由图形图像及其属性的像素数据组成 因此Bitmap是用于处理由像素数据定义的图像的对象 该类的主要方法和属性如下 xff1a
  • c#获取控件指定坐标的像素值

    DllImport 34 gdi32 dll 34 private static extern uint GetPixel IntPtr hDC int XPos int YPos Graphics g 61 control CreateG
  • C#完美实现透明窗体的绘制效果

    为了实现透明窗体的绘制 xff0c 最开始是采用了双层窗体的模式 思路 xff1a 将form1的属性transparencyKey设置为背景色 xff0c 将form2的opicaty设置的很低 xff0c 比如0 05 保证鼠标不会穿透
  • CAS SSO 单点登录框架 学习

    1 了解单点登录 SSO 主要特点是 SSO 应用之间使用 Web 协议 如 HTTPS xff0c 并且只有一个登录入口 SSO 的体系中有下面三种角色 1 User 多个 2 Web 应用 多个 3 SSO 认证中心 一个 2 SSO
  • C# override详解

    重载 重写 覆写 xff0c 分别指的是overload override new 一 override重写 xff0c 是在子类中重写父类中的方法 xff0c 两个函数的函数特征 xff08 函数名 参数类型与个数 xff09 相同 用于
  • C# -WinForm 中英文实现, 国际化实现的简单方法

    来源 xff1a http www jb51 net article 45675 htm xff0c 今天看到了借鉴过了 xff0c 保存一下 xff0c 下次开发直接用嘻嘻 软件行业发展到今天 xff0c 国际化问题一直都占据非常重要的位
  • C#的Winform多语言实现(resx文件)

    使用resx文件实现Winform多语言切换 xff0c 本博文提供的代码可以实现简体中文 繁体中文 英文的切换 如果需要增加其它语言的切换 xff0c 只需要编写相应的语言的resx文件即可 并且 xff0c 当修改了语言之后 xff0c
  • c#中中读取嵌入和使用资源文件的方法

    Dotnet中嵌入资源 xff08 位图 图标或光标等 xff09 有两种方式 xff0c 一是直接把资源文件加入到项目 xff0c 作为嵌入资源 xff0c 在代码中通过Assembly的GetManifestResourceStream
  • c#中英文切换实例

    1 创建两个资源文件 Resource en US resx Resource zh CN resx 注意中间部分每种语言文件名固定 xff0c 后缀名是 resx 首部分是自定义的名字 2 创建读写工具类 上面两个资源文件都是在Utili
  • TCP/IP协议讲的明明白白

    从字面意义上讲 xff0c 有人可能会认为 TCP IP 是指 TCP 和 IP 两种协议 实际生活当中有时也确实就是指这两种协议 然而在很多情况下 xff0c 它只是利用 IP 进行通信时所必须用到的协议群的统称 具体来说 xff0c I
  • TCP/IP协议与Http协议的区别详解

    TPC IP协议是传输层协议 xff0c 主要解决数据如何在网络中传输 xff0c 而HTTP是应用层协议 xff0c 主要解决如何包装数据 关于TCP IP和HTTP协议的关系 xff0c 网络有一段比较容易理解的介绍 xff1a 我们在
  • C#中使用MD5对用户密码加密与解密

    C 中常涉及到对用户密码的加密于解密的算法 xff0c 其中使用MD5加密是最常见的的实现方式 本文总结了通用的算法并结合了自己的一点小经验 xff0c 分享给大家 一 使用16位 32位 64位MD5方法对用户名加密 1 xff09 16
  • C#中修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限

    写在前面 在windows系统中 xff0c c盘中的目录权限比较高 xff0c 有时制作安装包的时候 xff0c 默认的安装路径就是在c盘 xff0c 但对运行可执行文件 xff0c 有时候需要为其添加完全控制权限 xff0c 或者读写权
  • C#使用SafeNet的开发狗和超级狗加密使用方法

    1 在安装光盘中选择Windows文件夹 xff0c 单击Setup exe执行安装程序 xff0c 安装过程默认选择 xff0c 单击下一步即可 2 安装完毕后插入超级狗 xff0c 在菜单栏中打开 超级狗开发商向导 xff0c 选择下载
  • Keil5 新建工程编译后Download按钮变灰

    Keil5 新建工程编译后Download按钮变灰 百度看到很多文章解决变灰方法为 这个主要目的是生成 HEX文件 xff0c 但有时候当你在线下载时点了Creat HEX File 并进行编译后 Download按钮依然呈现灰色 此时问题

随机推荐

  • C# SQLite 数据库操作语句与文件视图管理器

    sqlite数据库视图管理器 SQLiteSpy是一款专业的SQLite数据库管理 xff0c 主要用于读取sqlite数据库 xff0c 建立新的SQL查询 xff0c 视图 xff0c 复制和删除表 编辑单元格 xff0c 以及查看索引
  • C#JSON与XML相互转换

    using System using System Collections Generic using System Linq using System Text using System Xml using Newtonsoft Json
  • 让使用SQLite的.NET应用自适应32位/64位系统

    Windows 7 64 bit 刚扩到4G内存 果断换64位的 那速度杠杠的 Microsoft Visual Studio 2010 Ultimate 32bit 在64位系统里运行正常 sqlite netFx40 setup bun
  • WinForm 布局控件“WeifenLuo.WinFormsUI.Docking“的使用

    本篇介绍Winform程序开发中的布局界面的设计 xff0c 介绍如何在我的共享软件中使用布局控件 34 WeifenLuo WinFormsUI Docking 34 布局控件 34 WeifenLuo WinFormsUI Dockin
  • C#中JSON和对象之间互相转换功能示例

    本文实例讲述了C 实现JSON和对象之间互相转换功能 分享给大家供大家参考 xff0c 具体如下 xff1a 1 首先是声明用户信息对象 xff0c DataContract修饰类 xff0c 表示可以被解析成JSON xff0c Data
  • C#使用DataContractJsonSerializer来进行JSON解析

    在使用DataContractJsonSerializer进行解析之前 xff0c 我们首先需要将两个包引入进来 xff1a using System Runtime Serialization using System Runtime S
  • 步进电机驱动器脉冲频率确定 步进电机驱动器

    1 步进电机为什么要配步进电机驱动器才能工作 xff1f 步进电机作为一种控制精密位移及大范围调速专用的电机 它的旋转是以自身固有的步距角角 xff08 转子与定子的机械结构所决定 xff09 一步一步运行的 其特点是每旋转一步 xff0c
  • MFC添加自定义消息及重写消息过程

    由于MFC中无法通过类向导来自定义消息 xff0c 所以需要手动添加 xff0c 主要过程如下 xff1a 本文基于vs2008下通过线程实现数据实时更新的对话框运用程序 1 定义消息 xff08 Resource h文件中 xff09 x
  • C#操作注册表方法

    1 xff1a 要操作注册表 xff0c 我们必须要引入必要的命名空间 xff1a using Microsoft Win32 在这个命名空间里面包含了许多注册表相关的类 xff0c 足够我们使用了 2 xff1a 命名空间里面提供了一个类
  • 怎样测试ESP8266wifi模块?

    这里测试的方法是用USB TTL转换电路进行的测试 接线图如下所示 xff1a ESP8266引脚图如下 xff1a 因为ESP8266需要3 3V电压供电 xff0c 所以USB TTL的3 3V电压 xff0c GND分别与ESP826
  • Qt信号与槽机制

    一 简介 就我个人来理解 xff0c 信号槽机制与Windows下消息机制类似 xff0c 消息机制是基于回调函数 xff0c Qt中用信号与槽来代替函数指针 xff0c 使程序更安全简洁 信号和槽机制是 Qt 的核心机制 xff0c 可以
  • QT中手动释放堆中的对象(new 出来的)

    Qt内存自动释放有两个前提条件 xff1a 1 必须是QObject的派生类 2 必须指定了parent对象 即 xff1a Qt 中 父亲被删除的时候会自动销毁他的孩子 所以如果New出来的并且没有父亲 那么则需要手动删除它 需要 xff
  • c++指针概念回顾

    前言 复杂类型说明 要了解指针 多多少少会出现一些比较复杂的类型 所以我先介绍一下如何完全理解一个复杂类型 要理解复杂类型其实很简单 一个类型里会出现很多运算符 他们也像普通的表达式一样 有优先级 其优先级和运算优先级一样 所以我总结了一下
  • c语言指针详解(概念示例)

    指针是 xff23 语言中广泛使用的一种数据类型 运用指针编程是 xff23 语言最主要的风格之一 利用指针变量可以表示各种数据结构 xff1b 能很方便地使用数组和字符串 xff1b 并能象汇编语言一样处理内存地址 xff0c 从而编出精
  • C#中模态对话框释放问题

    以下实例中可以测出 xff0c 当一个模态对话框返回DialogResult的结果后 xff0c 对话框自动隐藏 xff0c 但对话框db并没有彻底释放掉 xff0c 因此 仍可以访问db中的成员 xff0c 想要彻底释放需要手动加上db
  • qt中设置窗体大小

    在我们的编程中 xff0c 我们有时候会想让我们的程序窗体固定大小 xff0c 而该大小是我们在编辑时的大小 经过我的摸索 xff0c 和查阅资料 找到了一个方法 其实也很简单 其实也就是先找到该窗体的物理大小 然后设置固定窗体的大小即可
  • c++ (QT)笔记

    1 标准情况下 xff0c c 43 43 中的类声明都在头文件中 xff0c 实现在 cpp文件中 xff0c 所以只在 cpp中实现类的函数在头文件中没有声明会报错 c 43 43 的函数实现和声明都可放在头文件中这样 cpp文件也可访
  • C语言中指针动态内存的申请和释放

    什么是动态内存的申请和释放 xff1f 当程序运行到需要一个动态变量时 xff0c 需要向系统的堆中申请一块内存 xff0c 用来存储这块变量 xff0c 这就是内存的申请 当程序不需要这个变量时 xff0c 就需要把申请的这块内存释放掉
  • Qt中线程使用汇总

    QThread类提供一种独立于平台的线程管理方式 方法1 一个QThread实例管理程序中的一个线程 QThread的执行开始于run 默认情况下 xff0c run 通过调用exec 启动事件循环 xff0c 并在线程内运行Qt事件循环
  • 对线程与进程的区别以及对多线程并发的理解

    一 线程与进程的区别 先简单说说线程与进程的概念 xff1a xff08 1 xff09 进程是指一个内存中运行的应用程序 xff0c 比如在Windows系统中 xff0c 一个运行的exe就是一个进程 xff08 2 xff09 线程是