【多线程】进程与线程

news2024/10/7 6:37:43

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 操作系统
  • 2. 进程
    • 2.1 进程是什么
    • 2.2 进程管理
    • 2.3 进程调度
    • 2.3 内存管理
    • 2.4 进程间通信
  • 3. 线程
    • 3.1 线程是什么
    • 3.2 多线程编程
    • 3.3 线程与进程联系与区别

1. 操作系统

概念】是一个软件,是一组做计算机资源管理的软件统称,非常复杂,所以操作系统本身是一个很大的话题(这里简单了解,引入进程概念)
常见的操作系统
在这里插入图片描述
基本功能
1)防止硬件被时空的应用程序滥用
2)向应用程序提供简单一致的机制来控制复杂低级硬件设备
在这里插入图片描述
对上】要给软件提供稳定的运行环境
对下】要管理好各种硬件设备
操作系统的功能非常多,其中一个与我们密切相关的功能模块—>进程管理
接下来让我们一起来看看,进程是什么吧~~~

2. 进程

2.1 进程是什么

进程】也称作任务一个运行起来的程序,就是进程~
在这里插入图片描述
这个.exe是一个可执行文件,即程序,当我们双击这个exe,这个程序微信就运行起来,在系统中形成一个进程
即进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程
基本单位进程是操作系统进行资源分配基本单位
(此处涉及到的资源包括不限于内存,硬盘,CPU等等)
在任务管理器中,我们可以看到电脑的进程,打开任务管理器的快捷键为Ctrl+Alt+Del,如图:
在这里插入图片描述
通过任务管理器,我们能看到系统中有如此多的进程都在跑着!那么进程有如此之多,如何去管理呢~

2.2 进程管理

所谓进程管理,即进程多了才需要管理,分为以下两步:

1)描述一个进程:使用结构体/类,表示一个进程的信息
2)组织这些进程:使用一定的数据结构,把这些结构体/对象放到一起

举一个生活中常见的栗子叭~
一个大型超市,有特别多的商品,超市需要管理这些商品,建立一个商品信息管理系统,需要做:
1)明确每个商品的相关信息(价格、生产日期等)
2)通过一定的数据结构将这些商品信息都组织起来(如通过表格等)

2.3 进程调度

进程调度概念】操作系统对CPU资源的分配,采用时间模式,不同的进程在不同的时间段去使用 CPU 资源即为进程调度~
先来了解进程的基本知识叭~
在Java中,我们通过类/对象描述这个特征,即每一个PCB对象代表一个在运行的程序即进程
进程类—> PCB(process control block)

class PCB {
//属性1 pid
//属性2 内存指针
//属性3 文件描述表
//属性4 进程调度信息
//...
}

操作系统再通过数据结构把PCB对象组织起来,往往使用双向链表来组织PCB对象,进程相当于链表中的节点,方便管理时进行增删改查的操作

  1. 创建一个进程,即创建一个链表的节点
  2. 销毁一个进程,即把链表的节点删除
  3. 遍历进程列表,即遍历链表

PCB中的属性非常多,在这里枚举4个核心的属性:
1)pid
每个进程需要有一个唯一的身份标识(如每个人都有独一无二的身份证~~)
2)内存指针
当前这个进程使用的内存是哪一部分(进程要跑起来,就需要消耗一定的硬件资源,比如内存~进程运行的时候,使用哪些内存上的资源)
3)文件描述符表
进程每次打开一个文件,就会产生一个"文件描述符",标识了这个被打开的文件,一个进程可能会打开很多文件,对应一组文件描述符,把这些文件描述符放到一个顺序表这样的结构,构成文件描述符表
4)进程调度信息
这一组属性都是描述和CPU资源相关的属性,这些属性都辅助进行进程调度
预备知识】先来了解了解CPU!
我们的程序能运行,全靠CPU,每一个程序相当于一组"二进制指令"的集合
CPU中的一个概念:核心数(在任务管理器中可以看到我们电脑的核心数)
在这里插入图片描述
这个表示16核32线程,即CPU里有16个核心,每个核心顶两个!16个人可以干32个人的活~
但是我们可以看到一个电脑上可以运行很多程序,不止这些,那么计算机是如何做的呢~
并行】同一时刻,两个核心同时执行两个进程,此时这两个进程就是并行执行的(强调同时)
并发】一个核心先执行进程1执行一会后再去执行进程2…只要这里切换进程的速度足够快,看起来进程1和2就是"同时"进行的
所以虽然只有这些核心,但是也可以同时执行很多很多个任务啦~
在计算机中,通过并行+并发的方式来完成的(由操作系统控制,我们感知不到的~)所以很多时候把并行+并发统称为并发!
进程调度意义】如上所述,进程调度就是为了解决电脑核心数是固定的但是电脑有很多程序要运行的问题~
A) 进程状态
简单认为进程状态主要是这两个:
就绪态】该进程已准备好,随时可以上CPU执行
阻塞态】该进程暂时无法上CPU执行
B)进程的优先级
进程之间的调度不一定是"公平"的,有的会优先调度(在现实生活中,我们也会将事情根据重要性排个序,有的事情就需要优先做~)
C) 进程的上下文
即描述当前进程执行到哪里的"存档记录",进程在暂时离开CPU时把当前运行的中间结果进行"存档",等下次进程回到CPU执行时,恢复之前的"存档",从上次的结果继续往后执行(即记录离开结果,这样回来时我可以从离开的地方继续执行)具体过程如下:
在这里插入图片描述
D)进程的记账信息
统计了每个进程在CPU上执行多久(这个可以作为调度的参考依据~)

2.3 内存管理

操作系统对内存资源的分配,采用空间模式,不同进程使用内存中的不同区域,互相之间不会干扰,相互独立的~
每个进程访问的内存地址并不是真实的物理内存地址,操作系统给进程分配的内存是以"虚拟地址空间"的方式进行分配的~
直接访问物理内存地址缺点】如果进程1内容改变则会可能会影响进程2的内存内容
(比如进程1数组下标越界、野指针情况等)
虚拟地址空间优点
在这里插入图片描述解释说明】站在进程角度,它们的代码操作的内存地址是图中0x00-0x33这一段,这里访问的内存就会被操作系统自动映射到真实的物理内存上,当然进程自己是感受不到实际物理内存地址是什么的,如果进程1代码出bug,就没有什么影响,因为任何一个内存操作都需要通过页表翻译,如果拿着这个地址发现页表没有这个地址,则不会翻译,也就不会修改真正物理内存,即不会对进程2的内存数据进行干扰
1)方便校验,当前地址是否有效
2)一个进程无法直接影响另一个进程的内存内容,每个地址都有自己独立的地址空间,具有独立性
3)大大提升操作系统的稳定性

2.4 进程间通信

进程是操作系统进行资源分配的最小单位,即各个进程互相之间是无法感受到对方存在的,是相互独立的,这样进程之间互相具备"隔离性",但有时候需要进程之间进行交互,相互配合~
进程间通信】即在隔离性前提下,找一个公共区域,让进程借助这个区域完成数据交换
实现方式】操作系统提供进程间通信具体实现方式,有很多种,如以下:
1)管道 2)共享内存 3)文件 4)信号 5)消息队列 6)网络 等等
其中网络是一种相对特殊的 IPC 机制,支持同主机也支持同一网络内部非同一主机,进行进程间通信

3. 线程

3.1 线程是什么

线程】是更轻量的进程,约定:一个进程中可以包含多个线程,此时这多个线程的每一个线程都是一个可以调度执行一个独立的"执行流",多个线程之间也是并发执行(多个线程可能是在多个CPU核心同时运行,也可能是在一个CPU核心上,通过快速调度进行运行),同时这些线程共用同一份进程的系统资源
即对于线程来说,系统资源已经分配好,创建线程就省下分配资源开销,但是创建进程则需要系统分配资源,较耗时~
为什么资源分配如此耗时
比如系统要给进程分配一块内存需要做的以及遇到的情况:
1)系统需遍历自己的空闲内存的表(数据结构) 找到差不多的空间,进行分配内存
2)很多进程都在向系统申请资源~但是系统进行资源分配时候,得一个个来,很耗时
为什么要线程
(1) 并发编程能更充分利用多核 CPU 资源,多进程编程和多线程编程都满足并发编程需求场景(并发编程即同一时刻要运行多个任务)
(2) 线程比进程更轻量,进程创建、销毁、调度成本高且速度慢不高效,线程则相反,线程创建、销毁、调度成本比进程~(只有在进程启动,创建第一个线程的时候,需花成本去申请系统资源,一旦进程创建完毕,后续再创建的线程,就不需要再申请资源,这样创建/销毁的效率大大提高)
(3) 在Java中不鼓励多进程编程,非常鼓励多线程编程~

3.2 多线程编程

意义】解决并发编程问题
举个栗子吧!更加深入理解一下多进程和多线程编程~
比如想加工一大批零件,有两种做法:
一是再建一个工厂重新再搭一套机器(多进程)
在这里插入图片描述此时这两套机器可以同时生产,不过这种方式需要再建立一个工厂,建工厂比较麻烦,成本较高,但这两个工厂之间是相互独立的,相互不影响~
二是还在当前工厂,引进机器再弄一套生产线(多线程)
在这里插入图片描述
这两套机器也可以各自独立生产,是两个独立的执行流,共用同一个资源工厂,除工厂共用,存储原料/成品/仓库/物流运输等等,都能共用,成本降低~
这两种方式均提高了工厂的生产效率,进程相当于工厂,线程相当于流水线~
多进程工厂方式,需多建工厂,开销大,且两机器之间看不到对方进度
多线程工厂方式,有两个机器,共用一个工厂,可以互相了解对方进度
此时想要生产更多的零件,在工厂内弄更多的机器,以此提高生产效率,但是并不是越多越好,如下图:
在这里插入图片描述
1)一个工厂的大小提供的空间是固定的即CPU核心数是固定的,此时想进一步提高机器的数量,工厂已经没有空余位置了,机器只能在工厂外干着急~这时,程序的效率并没进一步提升,可能不仅没提升,可能还会下降,因为调度本身也是有开销的,调度上一个机器,需要把之前的机器移出来,再把这个机器移进去,有开销,总并发程度依旧固定
2)机器是有脾气的,在这个调度来调度去的过程中,可能很生气很累,出现异常,如果一个线程出现异常,可能会带走整个进程!
在我们的电脑中:
1)在同一程序中,内部需要并发完成多组任务,此时使用多线程比较合适(比如微信,可以同时的视频,也可以聊天,网络传输等等)
2)多个程序之间,此时是多进程,进程之间具有"隔离性"(比如微信是一个进程,qq是一个进程等等)
所以多进程和多线程在电脑中是同时存在的~不是多线程代替了全部!且多进程和多线程都是可以并发和并行的

3.3 线程与进程联系与区别

联系
进程包含线程,一个进程可以有多个线程
区别

(1) 进程有自己独立的内存空间和文件描述符表,同一进程多个线程之间共享同一份地址空间和文件描述符表
(2) 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
(3) 进程具有独立性,一个进程不会影响另一个进程,但在同一进程的多个线程之间,一个线程挂了,可能会把整个线程带走,影响其它线程~
(4) 进程开销大,消耗资源多,线程执行开销小,但不利于资源的管理和保护

💛💛💛本期内容回顾💛💛💛
在这里插入图片描述
✨✨✨本期内容到此结束啦~下期再见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keepalived LVS群集

一、Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险 单点故障一旦发生,企业服务将发生中断,造成极大的危害 二、Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover&#…

VLM训练——Trainer源码解读

本文将以LLaVa源码为例,解析如何使用Trainer训练/微调一个VLM。 1. 参数解析ModelArgumentsDataArgumentsTrainingArguments 2. 加载模型3. 加载数据4. 创建Trainer开始训练 1. 参数解析 VLM 和 LLM 相关训练框架都会引入 ModelArguments、DataArguments、Trainin…

高考志愿填报秘籍:个人篇

选择适合自己的大学和专业,对广大考生来说至关重要。从某种程度上来说,决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿,选择适合自己的大学和专业,本公众号将推出如何用AI填报高考志愿专栏文章…

Linux环境各种软件安装配置

安装Java 官网 找个喜欢的版本 下载好了传到linux里,xshell的xftp直接拖过去就可以传 #安装rpm包管理 yum install -y rpm or apt-get install rpm #查找Java rpm -qa | grep java\|jdk\|gcj\|jre #卸载java rpm -e --nodeps jdk-1.8-1.8.0_401-10.x86_64 #安装 …

明基的台灯值得入手吗?书客、柏曼真实横向测评对比

近年来人们在工作、学习、娱乐等方面对电子设备的依赖程度也越来越高,长时间使用电子设备会对眼睛造成一定的伤害,如眼疲劳、干涩、近视等。人们对于能够缓解眼疲劳的照明产品的需求逐渐增加。护眼台灯能够更好地模拟自然光,提供更加柔和舒适…

AD24设计步骤

一、元件库的创建 1、AD工程创建 然后创建原理图、PCB、库等文件 2、电阻容模型的创建 注意:防止管脚时设置栅格大小为100mil,防止线段等可以设置小一点,快捷键vgs设置栅格大小。 1.管脚的设置 2.元件的设置 3、IC类元件的创建 4、排针类元件模型创建…

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …

14、modbus poll 使用教程小记1

开发平台:Win10 64位 Modbus Slave版本:64位 7.0.0 Modbus Poll版本:64位 7.2.2 因为项目中经常会用到modbus协议,所以就避免不了的要使用modbus测试工具,Modbus Slave/Poll无疑是众多测试工具中应用最广泛的。 文章目…

dll文件丢失了要如何处理?教你一键修复所有dll缺失的方法

dll文件丢失了要如何处理?其实dll文件的丢失还是比较常见的,它的丢失会引起一些程序无法启动,所以我们必须要去修复dll文件,这点是毋容置疑的,其修复方法也是有很多种的,今天就来给大家详细的聊一下dll文件…

BUAA-2024年春-OO第四单元总结

正向建模与开发 在本单元中,我们需要模拟一个小型的图书管理系统,完成图书馆所支持的相关业务,并遵守一定的规章制度。与前几次不同的是,本单元中,我们需要预先将自己的设计思路用UML来实现,然后进行编程。…

Coze+Discord:打造你的免费AI助手(教您如何免费使用GPT-4o/Gemini等最新最强的大模型/Discord如何正确连接Coze)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 准备Discord📝 准备Coze🔌 连接💡 测试效果⚓️ 相关链接 ⚓️📖 介绍 📖 你是否想免费使用GPT-4o/Gemini等最新最强的大模型,但又不想花费高昂的费用?本文将教你如何通过Coze搭建Bot,并将其转发…

RAG系统进阶(五)文本分割优化技巧及代码

背景 前边在介绍RAG系统时提到了文本分割(或分段)的作用和重要性。也提到了分段后所带来的一些问题,比如由于分段导致检索出来的TOP-n的结果可能未包含完整的答案。 粒度太大可能导致检索不精准,粒度太小可能导致信息不全面问题的…

教你一段代码激活计算机系统

方法简单粗暴,再也不用遭受未激活的烦恼了! 新建文本 输入代码,把文件后缀.txt改.bat slmgr /skms kms.03k.org slmgr /ato

2024-2025最新软考系统架构设计师的复习资料教材,解决如何快速高效通过该考试,试题的重点和难点在哪里?案例分析题和论文题的要点和踩坑点分析

目录 引言考试概述 考试结构考试内容 复习策略 制定复习计划学习资源 知识点详解 系统架构基础设计原则与模式系统分析与设计软件开发过程项目管理系统集成性能与优化安全性设计新兴技术 试题解析 选择题案例分析题论文题 重点与难点分析模拟试题与答案参考资料总结 引言 系…

DeepSpeed Pipeline并行

DeepSpeed为了克服一般Pipeline并行的forward时weights,和backward时计算梯度的weights, 二者不相同的问题,退而求其次,牺牲性能,采用gradient-accumulate方式,backward时只累积梯度至local,并不更新weights&#xff1…

css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕

现有6X7列的一个布局&#xff0c;如下图所示 想要用户能组成任意矩形盒子&#xff0c;并展示内容&#xff0c;具体效果如下&#xff08;仅为一个示例&#xff0c;其实可以任意组合矩形&#xff09;&#xff1a; html代码&#xff1a; <div class"grid-container"…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途&#xff1a;字段截取从指定开始的字符开始&#xff0c;截取要的数&#xff1b;指定开始的字符数字可以用负的&#xff0c;指定开始的字符从后往前(向左)数&#xff0c;截取要的数不能为负。 语…

BoxSizer布局

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面的实例中&#xff0c;使用了文本和按钮等控件&#xff0c;并将这些控件通过pos参数布置在pannel画板上。虽然这种设置坐标的方式很容易理解&am…

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支&#xff08;branch&#xff09;&#xff08;1&#xff09;分支的概念&#xff08;2&#xff09;branch命令 2.合并&#xff08;merge&#xff09;&#xff08;1&#xff09;三个命令pullfetchmergegit fetchgit mergegit pull &#xff08;2&#xff09;合并冲…

C++开源软件:跨平台本地密码管理器KeePassXC/KeePassDX

KeePassXC、KeePass和KeePassDX在功能、平台和特点上有所区别&#xff0c;以下是对这三款密码管理器的清晰区分&#xff1a; KeePassXC&#xff1a; 平台&#xff1a;跨平台&#xff0c;支持Windows、macOS和Linux等主流操作系统。 安全性&#xff1a;使用AES加密算法&#x…