【多线程】进程与线程

🏀🏀🏀来都来了,不妨点个关注!
🎧🎧🎧博客主页:欢迎各位大佬!
在这里插入图片描述

文章目录

  • 1. 操作系统
    • 1.1 什么是操作系统
    • 1.2 操作系统主要的功能
  • 2. 进程
    • 2.1 什么是进程
    • 2.2 通过PCB描述一个进程
    • 2.3 进程的调度
    • 2.4 PCB的管理
    • 2.5 内存管理
    • 2.6 进程间通信的方式
  • 3.线程
    • 3.1 什么是线程
    • 3.2 有了进程为什么还要有线程
    • 3.3 进程与线程的联系和区别

1. 操作系统

1.1 什么是操作系统

操作系统本质上是运行在计算机上的软件程序,对上,它负责给软件运行提供稳定的环境,对下,它要管理好各种硬件设备。我们可以通过以下的图文进行理解:

在这里插入图片描述

1.2 操作系统主要的功能

从资源管理的角度来看,操作系统主要有六大功能:

  • 进程和线程的管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等。
  • 存储管理:内存的分配和管理、外存(磁盘等)的分配和管理等。
  • 文件管理:文件的读、写、创建及删除等。
  • 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
  • 网络管理:操作系统负责管理计算机网络的使用。网络是计算机系统中连接不同计算机的方式,操作系统需要管理计算机网络的配置、连接、通信和安全等,以提供高效可靠的网络服务。
  • 安全管理:用户的身份认证、访问控制、文件加密等,以防止非法用户对系统资源的访问和操作。

可以看到操作系统的上述功能中,进程和线程管理和我们今天要讲的进程与线程关系密切。
那么为什么要进行进程的管理呢,那当然是因为进程太多了才需要管理嘛,就比如我们上学,学校也都有会一个学生管理系统,里面就记录着我们每个学生的信息。下面我们分别从进程和线程两个角度进行讲解。

2. 进程

2.1 什么是进程

一个运行起来的程序就是进程,而我们电脑中的.exe文件就是一个可执行的文件(程序),当双击这个.exe文件,这个程序跑起来就形成了一个进程。关于这个我们可以通过任务管理器查看,如下图:
在这里插入图片描述
在这里插入图片描述
我们从上面两种图都可以观察到我们的计算机上运行着许许多多的进程,我们在最开始提到过,操作系统的一大功能就是进行进程的管理,那么它是如何对进程进行管理的呢?其实就分为两步,下面我们就来介绍:

  1. 描述一个进程:使用结构体/类把一个进程有哪些信息描述出来
  2. 组织这些进程:使用一定的数据结构将这些结构体/对象组织在一起

2.2 通过PCB描述一个进程

在上面我们提到对进程管理分为了两步,第一步就是描述该进程,而在操作系统中,用于描述系统进程状态的数据结构通常被称为进程控制块(Process Control Block, PCB)。而PCB有很多的属性,这里我们将介绍几个核心的:

  1. pid: 进程的唯一身份标识(这个我们在Linux常用命令章节里提到过)
  2. 内存指针:表示当前进程使用的内存是哪一部分(进程要运行起来就需要消耗一些硬件资源,这其中就包括了内存)
  3. 文件描述符表:文件描述符表是一个数据结构,用于记录当前进程打开了哪些文件。当进程需要操作文件时,它会在文件描述符表中分配一个表项,并构造一个结构体来描述该文件的相关信息。
  4. 进程状态:描述当前进程所处的状态
    主要为两个状态:
    就绪态:该进程已经准备好了,随时可以在CPU上运行
    阻塞态:该进程暂时无法在CPU上运行
  5. 进程的优先级:优先级用于决定操作系统调度进程的顺序。优先级高的进程会获得更多的CPU资源
  6. 进程的上下文:进程的上下文就是记录当前进程执行到哪里的"存档记录",进程在离开CPU的时候就需要把进程执行的中间结果进行"存档",等下一次回到CPU上的时候再恢复之前的"存档"。从上一次的结果继续往后面执行。(类似于我们玩游戏玩到一半不玩了进行存档退出,下一次玩的时候再进行读档,回到之前玩的地方继续往后面玩)
  7. 进程的记账信息:统计了每个进程在CPU上执行了多久了,可以作为进程调度的参考依据

其中,第4、5、6,7点都是和进程的调度有关的,下面我们先来介绍一些什么是进程的调度

2.3 进程的调度

在计算机操作系统中,进程调度是指按照某种策略或算法,从就绪队列中选择一个进程,将处理机分配给该进程,使之执行的过程。
那为什么要有进程的调度呢
我们先来了解一下CPU,我们的一个个程序能够运行起来,都是依靠着CPU的调度,我们可以打开任务管理器来看看CPU的相关属性,如下图:
在这里插入图片描述

这个表示我自己计算机的CPU有8个 物理核心,而一个物理核心相当于两个逻辑核心,这表示CPU同时能处理16个任务,此时就有人想问了但我们的计算机上同时运行的进程可不止16个,那CPU是如何处理的呢?这里我们介绍两个核心概念

  • 并行:两个核心同时执行两个任务(进程),此时这两个任务就是并行执行的。
  • 并发: 一个核心先运行进程1运行一会后再运行进程2运行一会后再运行进程3,只有切换的够快,这里的进程1、2,3看起来就像是同时执行的一样。
    这也就告诉我们,虽然我的CPU只能同时执行16个任务,但通过并行+并发,我们就可以同时处理多个任务了,通常我们也将这里的并行+并发统称为并发。

2.4 PCB的管理

操作系统往往是使用双向链表的方式将PCB组织起来,这样进程相当于链表中的节点,方便管理时进行增删改查的操作

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

2.5 内存管理

操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
而操作系统给每一个进程分配的内存空间都是以“虚拟地址空间”的方式分配的。
这里肯定就会有人要问了,有直接的物理地址,为什么不直接给每一个进程直接分配物理地址。我们用下面进程直接访问实际物理地址的图片来介绍:
在这里插入图片描述

上图就是每个进程都是直接访问物理内存的地址,此时可能就会产生一个比较严重的问题,万一进程1的代码出现了bug(比如数组下标越界,野指针…),可能就会连带着把进程2搞崩溃了。
下面我们就来看看操作系统是如何通过使用虚拟内存来解决这个问题的:
在这里插入图片描述

站在进程自身的角度看,它们的内存地址就是0x00aa-0x00ff,这里访问的内存地址就会被操作系统自动映射到真正的物理地址上,但是进程自身是感知不到实际的物理地址是啥的。
此时如果进程1代码出bug,就没有什么影响,因为任何一个内存操作都需要通过页表翻译,比如出现野指针0x11aa,拿着这个地址,页表无法映射也就不会修改真正物理内存,即不会对进程2的内存数据进行干扰。

  • 页表:操作系统使用页表来维护虚拟地址到物理地址的映射关系。页表是一种数据结构,它记录了每个虚拟页(通常是4KB大小)对应的物理页号。
  • 地址翻译:当CPU执行指令并需要访问某个内存地址时,它首先会检查这个地址是虚拟地址还是物理地址。如果是虚拟地址,CPU会通过页表将其转换为物理地址,然后访问物理内存。
  • 缺页异常:如果CPU在访问某个虚拟页时发现该页没有在物理内存中(即发生了缺页),它会产生一个缺页异常。操作系统会捕获这个异常,并从磁盘或其他存储介质中加载缺失的页到物理内存中,然后更新页表以反映这一变化。

2.6 进程间通信的方式

在上面我们说了操作系统给每个进程都分配了一块独立的虚拟地址空间,这保证了进程间的地址空间隔离。一个进程无法直接访问另一个进程的内存,从而避免了内存冲突和数据损坏。
即各个进程互相之间是无法感受到对方存在的,是相互独立的,这样进程之间互相具备"隔离性",但有时候需要进程之间进行交互,相互配合。
此时就有了进程间的通信:即在隔离性前提下,找一个公共区域,让进程借助这个区域完成数据交换。
目前,主流操作系统提供的进程通信机制有如下:

  1. 管道
  2. 共享内存
  3. 文件
  4. 网络
  5. 信号量
  6. 信号
  7. 套接字(Sockets)

其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。

3.线程

3.1 什么是线程

线程(Thread) 也被称为轻量级进程,更加轻量。多个线程可以在同一个进程中同时执行,并且共享进程的资源比如内存空间、文件句柄、网络连接等。举例:你打开的微信里就有一个线程专门用来拉取别人发你的最新的消息。

3.2 有了进程为什么还要有线程

  • 进程切换是一个开销很大的操作,线程切换的成本较低。
  • 线程更轻量,一个进程可以创建多个线程。
  • 多个线程可以并发处理不同的任务,更有效地利用了多处理器和多核计算机。而进程只能在一个时间干一件事,如果在执行过程中遇到阻塞问题比如 IO 阻塞就会挂起直到结果返回。
  • 同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核。

3.3 进程与线程的联系和区别

联系:一个进程中可以有多个线程,这些线程共享一份堆和方法区(jdk1.8之后称为元数据区)资源,同时每个线程有自己的虚拟机栈、本地方法栈和程序计数器。这点我们在JVM篇里介绍过。

区别

  1. 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位(这也告诉我们上述我们介绍的进程的调度,其实是对进程里的线程的调度)
  2. 进程具有独立性,一个进程不会影响另一个进程,但在同一进程的多个线程之间,一个线程挂了,可能会把整个线程带走,影响其它线程。
  3. 进程开销大,消耗资源多,线程执行开销小,但不利于资源的管理和保护

本次的分享就结束了,感谢支持!

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

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

相关文章

代码随想录算法训练营第22天|LeetCode 77. 组合、216.组合总和III、17.电话号码的字母组合

1. LeetCode 77. 组合 题目链接:https://leetcode.cn/problems/combinations/description/ 文章链接:https://programmercarl.com/0077.组合.html 视频链接:https://www.bilibili.com/video/BV1ti4y1L7cv 思路:利用递归回溯的方式…

nanodiffusion代码逐行理解之diffusion

目录 一、diffusion创建二、GaussianDiffusion定义三、代码理解def __init__(self,model,img_size,img_channels,num_classes,betas, loss_type"l2", ema_decay0.9999, ema_start5000, ema_update_rate1,):def remove_noise(self, x, t, y, use_emaTrue):def sample(…

MySQL 集群

MySQL 集群有多种类型,每种类型都有其特定的用途和优势。以下是一些常见的 MySQL 集群解决方案: 1. MySQL Replication 描述:MySQL 复制是一种异步复制机制,允许将一个 MySQL 数据库的数据复制到一个或多个从服务器。 用途&…

一拖二快充线:生活充电新风尚,高效便捷解决双设备充电难题

一拖二快充线在生活应用领域的优势与双接充电的便携性问题 在现代快节奏的生活中,电子设备已成为我们不可或缺的日常伴侣。无论是智能手机、平板电脑还是笔记本电脑,它们在我们的工作、学习和娱乐中扮演着至关重要的角色。然而,随着设备数量…

产品经理系列1—如何实现一个电商系统

具体笔记如下,主要按获客—找货—下单—售后四个部分进行模块拆解

代码随想录算法训练Day58|LeetCode417-太平洋大西洋水流问题、LeetCode827-最大人工岛

太平洋大西洋水流问题 力扣417-太平洋大西洋水流问题 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个…

【Unity】unity学习扫盲知识点

1、建议检查下SystemInfo的引用。这个是什么 Unity的SystemInfo类提供了一种获取关于当前硬件和操作系统的信息的方法。这包括设备类型,操作系统,处理器,内存,显卡,支持的Unity特性等。使用SystemInfo类非常简单。它的…

Linux 查看磁盘是不是 ssd 的方法

lsblk 命令检查 $ lsblk -d -o name,rota如果 ROTA 值为 1,则磁盘类型为 HDD,如果 ROTA 值为 0,则磁盘类型为 SSD。可以在上面的屏幕截图中看到 sda 的 ROTA 值是 1,表示它是 HDD。 2. 检查磁盘是否旋转 $ cat /sys/block/sda/q…

机器学习之保存与加载

前言 模型的数据需要存储和加载,这节介绍存储和加载的方式方法。 存和加载模型权重 保存模型使用save_checkpoint接口,传入网络和指定的保存路径,要加载模型权重,需要先创建相同模型的实例,然后使用load_checkpoint…

Autosar Dcm配置-0x85服务配置及使用-基于ETAS软件

文章目录 前言Dcm配置DcmDsdDcmDsp代码实现总结前言 0x85服务用来控制DTC设置的开启和关闭。某OEM3.0架构强制支持0x85服务,本文介绍ETAS工具中的配置 Dcm配置 DcmDsd 配置0x85服务 此处配置只在扩展会话下支持(具体需要根据需求决定),两个子服务Disable为0x02,Enable…

冯诺依曼体系结构与操作系统(Linux)

文章目录 前言冯诺依曼体系结构(硬件)操作系统(软件)总结 前言 冯诺依曼体系结构(硬件) 上图就是冯诺依曼体系结构图,主要包括输入设备,输出设备,存储器,运算…

Go高级库存照片源码v5.3

GoStock – 免费和付费库存照片脚本这是一个免费和付费共享高质量库存照片的平台,用户可以上传照片与整个社区和访客分享,并可以通过 PayPal 接收捐款。此外,用户还可以点赞、评论、分享和收藏您最喜欢的照片。 下载 特征: 使用Laravel 10构建订阅系统Stripe 连接渐进式网页…

从零开始读RocketMq源码(一)生产者启动

目录 前言 获取源码 总概论 生产者实例 源码 A-01:设置生产者组名称 A-02:生产者服务启动 B-01:初始化状态 B-02:该方法再次对生产者组名称进行校验 B-03:判断是否为默认生产者组名称 B-04: 该方法是为了实例化MQClientInstance对…

白嫖A100-interLM大模型部署试用活动,亲测有效-2.Git

申明 以下部分内容来源于活动教学文档: Docs git 安装 是一个开源的分布式版本控制系统,被广泛用于软件协同开发。程序员的必备基础工具。 常用的 Git 操作 git init 初始化一个新的 Git 仓库,在当前目录创建一个 .git 隐藏文件夹来跟踪…

Windows系统下载安装ngnix

一 nginx下载安装 nginx是HTTP服务器和反向代理服务器,功能非常丰富,在nginx官网首页,点击download 在download页面下,可以选择Stable version稳定版本,点击下载 将下载完成的zip解压即可,然乎在nginx所在…

SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1,先新建一个项目,我们叫它“HelloJPA”并且添加依赖 2,引入以下依赖: Spring Boot DevTools (可选,但推荐,用于开发时热部署)Lombok(可选&#xff0c…

三相感应电机的建模仿真(2)基于ABC相坐标系S-Fun的仿真模型

1. 概述 2. 三相感应电动机状态方程式 3. 基于S-Function的仿真模型建立 4. 瞬态分析实例 5. 总结 6. 参考文献 1. 概述 前面建立的三相感应电机在ABC相坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时…

qt 开发笔记堆栈布局的应用

1.概要 画面中有一处位置&#xff0c;有个按钮点击后&#xff0c;这片位置完全换成另一个画面&#xff0c;这中情况特别适合用堆栈布局。 //堆栈布局的应用 #include <QStackedLayout> QStackedLayout *layout new QStackedLayout(this); layout->setCurrentIndex(…

Unity Scrollview的Scrollbar控制方法

备忘&#xff1a;碰到用scrollview自带的scrollbar去控制滑动&#xff0c;结果发现用代码控制scrollbar.value无效&#xff0c;搜了一下都是说用scrollRect.verticalNormalizedPosition和scrollRect.horizontalNormalizedPosition来控制的。我寻思着有关联的scrollbar为什么用不…

Interview preparation--Https 工作流程

HTTP 传输的弊端 如上图&#xff0c;Http进行数据传输的时候是明文传输&#xff0c;导致任何人都有可能截获信息&#xff0c;篡改信息如果此时黑客冒充服务器&#xff0c;或者黑客窃取信息&#xff0c;则其可以返回任意信息给客户端&#xff0c;而且不被客户端察觉&#xff0c;…