并发-多线程

目录

进程

线程

线程的串行

区别

多线程


进程

  • 是指计算机中已执行的程序,曾经是分时系统的基本运作单位
  • 在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,是程序的基本执行实体
  • 在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本执行单位,而是线程的容器
  • 程序本身只是指令、数据及其组织形式的描述,相当于一个名词
  • 进程才是程序(那些指令和数据)的真正执行实例,可以想像说是现在进行式
  • 若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立执行
  • 所以是在操作系统中运行的一个应用程序
  • 比如同时打开QQ,WeChat;操作系统就会分别启动2个进程
  • 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
  • 在Windows中,可以通过任务管理器查看正在运行的进程

进程是一种抽象的概念,从来没有统一的标准定义看,一般由程序、数据集合和进程控制块三部分组成:

  • 程序用于描述进程要完成的功能,是控制进程执行的指令集
  • 数据集合是程序在执行时所需要的数据和工作区
  • 程序控制块,包含进程的描述信息和控制信息,是进程存在的唯一标志

线程

  • 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
  • 线程 也被称为 轻量级进程,是程序执行流程的最小单元
  • 一个标准的线程由 线程ID、当前指令指针PC、寄存器集合 和 堆栈 组成
  • 通常来说,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)以及一些进程资源(如打开文件和信号)
  • 1个进程要想执行任务,必须得有线程(每1个进程至少要有1个线程)
  • 一个进程的所有任务都在线程中执行
  • 比如使用酷狗播放音乐,使用迅雷下载文件,都需要在线程中执行

线程的串行

  • 1个线程中任务的执行是串行的
  • 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
  • 在同一时间内,1个线程只能执行1个任务
  • 比如在1个线程中下载3个文件(分别是文件A,文件B,文件C)

区别

  • 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
  • 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
  • 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
  • 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
  • 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程

举个例子:进程=火车,线程=车厢

  • 线程在进程下行进(单纯的车厢无法运行)
  • 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)

多线程

  • 1个进程中可以开启多个线程,所有线程可以并行(同时)执行不同的任务
  • 多线程技术可以提高程序的执行效率
  • 比如同时开启3个线程分别下载3个文件
  • 多线程的原理
  • 现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)执行的感觉
  • 即同一时间,CPU的1个核心只能处理1个线程
  • 多线程并发(同时)执行,其实是CPU快速地在多个线程之间调度(切换)
  • 如果CPU调度线程的速度足够快,就造成了多线程并发执行的假象
  • 同样的,使用多线程技术的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时执行(在不同的CPU上)
  • 使用多线程的原因:
  • 某个操作可能会陷入长时间的等待,等待的线程会进入睡眠状态,无法继续执行
  • 多线程执行可以有效利用等待时间
  • 典型的例子是等待网络响应,这可能需要花费数秒甚至数十秒
  • 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互就会中断
  • 多线程可以让一个线程负责交互,另一个负责计算
  • 程序逻辑本身就要求兵法操作,例如一个多任务下载软件
  • 多CPU或者多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥计算机的全部计算性能
  • 相对于多进程应用,多线程在数据共享方面的效率要高很多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PL理论】(1) 语法与语义:归纳的定义 | 推理规则 | 推导树 | 数学归纳法证明 (MI)

💭 写在前面:在学习编程的过程中,我们经常会听到 "语法" 和 "语义" 这两个词,这对于理解和编写高质量的代码至关重要。在本博客中,我们将深入探讨这两个概念,从而帮助读者更好地理解编…

趣味算法,猴子算法。python如何实现猴子算法

给一只猴子一台打印机,虽然这只猴子根本不识字,但会乱按,经过一段时间后,在它乱按出来的单词里总能找到一些至少看起来是有意义的部分,比如一两个简短的单词,由此可以推出:只要给它足够长的时间…

vite+vue3动态模块化导入并使用pinia

一、安装引入pinia 1.安装 pnpm install pinia # 或者使用 yarn yarn add pinia # 或者使用 npm npm install pinia 2.在main.js里引入 import { createApp } from vue import App from ./App.vue import { createPinia } from pinia createApp(App).use(createPinia()).mo…

辽渤湾海现已加入2024第七届燕窝天然滋补品博览会

参展企业介绍 大连辽渤湾海产品有限公司,是一家主营海参、鲍鱼、海胆等大连海产品的加工和销售的综合型水产企业,拥有国内精良的整条加工流水线,拥有上千平米的现代化加工办公场地的现代化企业。现已发展成为大连海参产品的主导型深加工基地。…

如何清理释放群晖客户端缓存?

任正菲说:企业最大的浪费,是经验的浪费! 而一个一个的经验,又都来自企业的每一个工作者。 因此当我们在工作过程中遇到一些问题时,我们就应该下意识的把解决问题的经验沉淀下来,从而可以与大家进行分享。…

软件设计师19--文件管理

软件设计师19--文件管理 考点1:文件相关概念例题: 考点2:树形目录结构(绝对路径与相对路径)例题: 考点3:位示图例题: 考点4:索引文件索引文件结构例题: 考点1…

武汉星起航:跨境电商行业的领军者,互帮互助共创佳绩

武汉星起航电子商务有限公司,作为跨境电商行业的领军者,以其出色的业绩和卓越的团队实力,在业内赢得了广泛的赞誉。公司自运营团队在亚马逊平台上成功开设了多家店铺,凭借着深耕跨境电商行业多年所积累的经验,取得了令…

[自研开源] 数据集成之分批传输 v0.7

开源地址:gitee | github 详细介绍:MyData 基于 Web API 的数据集成平台 部署文档:用 Docker 部署 MyData 使用手册:MyData 使用手册 试用体验:https://demo.mydata.work 交流Q群:430089673 介绍 本篇基于…

面试笔记——Java集合篇

Java集合框架体系 重点:单列集合——ArrayList、LinkedList;双列集合——HashMap、ConcurrentHashMap。 List相关 数组(Array) 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素: 为什…

为什么在vite中使用eslint报错‘__dirname‘ is not defined?

问题分析 发生这种情况是因为 ESLint 不知道 vite.config.js 中的代码在 Node.js 中使用,__dirname 未在浏览器中定义,也未在 ES 模块中定义。因此要告诉 ESLint 代码将作为 CommonJS 模块在 Node.js 中运行。 解决方案 请打开 ESLint 配置并在该 env …

关于 boost::asio::strand 初始化 socket、stream、resolver、deadline_timer 对象

在 boost::asio 之中默认情况下,大家使用 io_context 来为这些对象初始化传递的执行者,但我需要这里说明。 对于 boost::asio 构造类似 socket 对象必须构造传递 io_context 是个伪命题,boost::asio 对象并非只允许传递 boost::asio::io_cont…

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

【面试题】ES文档写入和读取流程详解

前言:在回答这个问题之前我们先要搞清楚一个问题那就是什么是文档,避免不知所云! 一、什么是文档? 在Elasticsearch中,文档(Document)是最基本的信息单元,用于表示和存储数据。文…

数据采集用,集成了主流工业通讯协议

IoTClient 是一个物联网设备通讯协议实现客户端,集成了主流工业通讯协议,包括主流PLC通信读取、ModBus协议、Bacnet协议等。该组件基于.NET Standard 2.0,适用于.NET的跨平台开发,可在Windows、Linux等系统上运行,甚至…

LinkedIn账号为什么被封?被封后如何解决?

近期会有一些小伙伴说自己遇到了帐号无法登录的情况,其实出现领英帐号被封号(被限制登录)主要会有两类情况,今天就给大家分享一下如果被封该如何解决,强烈建议收藏。 在电脑领英官网或者手机领英APP上,输入领英帐号密码点击登录后…

数据结构(五)单链表专题

在开始之前,我先来给大家讲一下顺序表与链表的区别: 它们在堆上存储的差异: 我们可以很容易的知道,循序表是连续的有序的,但链表是杂乱的,它们通过地址彼此联系起来。 1. 链表的概念及结构 概念&#xff1…

【光伏科普】光伏投融资计算的意义

光伏产业,作为清洁能源的重要组成部分,近年来在全球范围内得到了广泛的关注与发展。而在光伏项目的实施过程中,投融资计算显得尤为重要。本文旨在探讨光伏投融资计算的意义,以及它如何影响光伏产业的可持续发展。 首先&#xff0c…

无法找到filesystem头文件

无法找到filesystem头文件 一、前言 这段时间接老板命令,做目标识别模型的嵌入式部署。需要将模型运行环境编译后打包到瑞芯微开发板上运行,在此之前我对原C文件做过修改,为了能实现与厂商提供的数据接口对接。 我在用CMake打包过程中&…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中,JMeter是一款非常强大和流行的自动化测试工具,它可以测试各种类型的应用程序,并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程,指导你如何使用JMe…