【操作系统进程与线程管理:从PCB到多线程并发编程】

news2025/1/5 5:58:53

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”

文章目录

    • 操作系统管理进程
    • PCB核心属性
    • 线程&多线程编程
    • 为什么线程比进程更轻量?为什么线程创建/开销比进程更小?
    • 线程基本特性的例子
    • 🏷️总结:

操作系统管理进程

  • (1)先描述 -> 通过PCB结构体将进程的各种属性都表示出来
  • (2)再组织 -> 通过链表数据结构把多个PCB串起来。

PCB核心属性

  • 1.pid进程标识符
  • 2.内存指针,该进程依赖的指令和数据在哪里
  • 3.文件描述符表,该进程打开了哪些文件
  • 4.支持进程调度的属性:状态、优先级、上下文、记账信息。

线程&多线程编程

  • 当前的CPU基本上都是多核心CPU

  • 多线程编程:通过特定的编程技巧(并发编程=并行+并发),把要完成的任务,拆解成多个部分,并让他们在不同的CPU上运行。【防止出现“一核有难,多核围观”的现象。】

  • 由于服务器,频繁地有客户端来来去去,这导致服务器需要频繁的创建/销毁进程(过于频繁的创建和销毁进程会导致服务器的响应速度变慢)。

  • 为了解决进程的负重,所以引入线程来解决进程开销过大的问题。

  • 线程(Thread):也叫做“轻量级进程”(创建销毁开销更小),可以理解成线程是进程的一部分。

  • 一个进程中可以包含一个线程或多个线程

  • 描述进程,使用的是PCB这样的结构体

    • 一个PCB其实就是描述一个线程
    • 若干个PCB(线程)联合在一起用来描述一个进程。

  • PCB属性

    • 1.pid (每个线程都不一样)
    • 2.内存指针
    • 3.文件描述符表
      • 在同一个进程的若干个线程中,内存指针和文件描述附表其实是同一个 。
      • 同一个进程中的若干个线程之间,是公用相同的内存资源和文件资源的。
        • (eg:线程1中new个对象,线程2可以访问到;线程1打开一个文件,线程2也可以直接使用。)
    • 4.状态、上下文、优先级、记账信息
      • (对于进程调度的这四个属性,每个线程都有属于自己的一组属性)
      • 每个线程都是在独立的在CPU上执行调度的。
        • 进程是系统资源分配的基本单位
        • 线程是系统调度执行的基本单位
    • 5.tgid:同一个进程的tgid是同一个。

为什么线程比进程更轻量?为什么线程创建/开销比进程更小?

  • 核心在于:

  • 创建进程,可能要包含多个线程,在这个过程中,涉及到了资源分配/资源释放。

  • 创建线程,相当于已经拥有资源,省去了资源分配/释放的步骤了。
    在这里插入图片描述

  • 同一个进程包含N个线程,这些线程之间资源是共用的。

  • 只有当创建第一个线程的时候(即创建进程的时候),才需要去进行资源申请操作。

  • 后续再创建线程,都没有申请资源的过程了。

线程基本特性的例子

  • 滑稽有个任务,吃掉100只盐焗鸡,但是现在只有它一个人吃,效率比较低~
    在这里插入图片描述

  • 为了解决效率低这个问题,我们引入了多进程和多线程方案:

  • ①多进程方案:
    在这里插入图片描述

  • 我们可以看到我们又找了一个滑稽来吃鸡,不仅要租房子还要搞个桌子,这使得吃鸡成本大大增加

  • ②多线程方案:
    在这里插入图片描述

  • 房间和桌子还是同一个,把滑稽变成两个,这两个滑稽都可以同时来吃鸡,还是相当于一个人吃了两50只鸡,效率和多进程相比,成本降低了。

  • ③引入更多线程的方案:
    在这里插入图片描述

  • 根据上图,我们可以看到随着引入的线程增多,每个线程要完成的任务量更少了,整体吃鸡的速度就会更快!!

  • ④引入无限多个多线程的方案:

在这里插入图片描述

  • 由于桌子大小是有限的,我们的滑稽需要坐在椅子上才能吃鸡,当引入更多的滑稽时,会导致滑稽无法凑到桌子边上,没法和正在坐姿上的滑稽一样并发的执行任务。

  • 此外,外面的滑稽往里面挤,可能会打断里面正在吃鸡的滑稽,此时,线程调度会非常明显,可能会导致程序性能不升反降。

  • ⑤多个线程共同完成某个任务:
    在这里插入图片描述

  • 如果是多个线程共同完成某个任务,在这个过程中,多个滑稽之间,可能会发生冲突!!

    • 1号滑稽看上大鸡腿
    • 2号滑稽盯上了同一个大鸡腿
    • 导致两个人起了冲突,打起来了 => 程序出现bug~ 【线程安全问题】
  • ⑤一个线程·抛出异常并且未处理好:
    在这里插入图片描述

  • 如果,某个滑稽,不太开心,不想吃鸡了~

  • 直接反抗,使得别的滑稽也吃不了鸡。

  • 如果一个线程抛出异常,并且没有很好的捕获处理好,就会使得整个进程退出(其它线程也没了)。

🏷️总结:

  • 对于多线程:一个线程挂了,会影响到其他线程。
  • 对于进程:进程与线程相比,具有更好的独立性,当一个进程挂了,一般不会影响到其它进程。
特性进程 (Process)线程 (Thread)
定义操作系统进行资源分配和调度的一个独立单位。进程的一个实体,是被系统独立调度和分派的基本单位。
资源拥有每个进程拥有独立的内存空间,进程间的资源不共享。同一进程内的线程共享进程的资源,如内存和文件描述符。
创建开销创建和销毁进程涉及到资源的分配和释放,开销较大。线程的创建和销毁开销较小,因为它们可以利用进程已经分配的资源。
独立性进程间相互独立,一个进程的崩溃不会直接影响到其他进程。线程间不独立,一个线程的崩溃可能会影响到同一进程的其他线程。
通信方式进程间通信(IPC)需要特定的机制,如管道、信号、共享内存等。同一进程内的线程可以通过读写共享变量的方式进行通信,无需特定的IPC机制。
上下文切换进程间的上下文切换开销较大。线程间的上下文切换开销较小,因为它们共享相同的地址空间。

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)

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

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

相关文章

超越TF-IDF:信息检索之BM25

深入解析BM25:信息检索的优化利器 搜索系列相关文章(置顶) 1.原始信息再加工:一文读懂倒排索引 2.慧眼识词:解析TF-IDF工作原理 3.超越TF-IDF:信息检索之BM25 4.深入浅出 Beam Search:自然语言处…

C#控件开发4—仪表盘

目录 思路(GDI绘图)1.定义属性2.绘制图形3.最后生成(自定义各种监控值显示)End 如何让温度、湿度、压力等有量程的监控值如仪表盘(DashBoard)一样显示? 思路(GDI绘图) 定…

提升口语发音水平,中英文发音评测系统实现

在全球化的浪潮中,语言不再是障碍,而是连接世界的桥梁。掌握一门流利的英语,意味着打开了通往世界的大门。但是,如何确保你的英语口语如同母语者一样自然流畅?这正是我们存在的意义。 我们的中英文口语发音评测服务&a…

JVM对象创建过程

1 类加载检查 jvm通过new指令开始创建对象jvm执行new指令时,首先通过指令参数从常量池中取到需要创建的类名检查该类是否被加载,解析,和初始化过如果没有,则执行类的加载过程new指令对应到java语言具体的操作为 new 关键字创建对象…

什么是Sight Words(信号词)

🧡什么是Sight Words(信号词) 简单来说,Sight Words就是我们在日常英语中常用的一些基本词汇。可以把它想象成是学练英语的“基础词汇”,这些词在各种考试中经常出现,也是在生活中必不可少的。 &#x1f…

秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件(30000字)

这里我分享一下尚硅谷的pdf100页笔记和代码,大家可以参考学习。 笔记: 通过网盘分享的文件:MyBatis.pdf 链接: https://pan.baidu.com/s/14Iu1Zs-_5vZoRjBEjmagag?pwdyjh6 提取码: yjh6 --来自百度网盘超级会员v1的分享代码: …

12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习

1.思维导图 2练习: 1.尝试将下列指令放到脚本中运行 在家目录下创建目录文件dir1,把/etc/passwd拷贝到dir1中,把/etc/group拷贝到dir1中并重命名为grp.txt,使用tree指令,显示dir1目录的文件树,把dir1&am…

云计算学习架构篇之HTTP协议、Nginx常用模块与Nginx服务实战

一.HTTP协议讲解 1.1rsync服务重构 bash 部署服务端: 1.安装服务 [rootbackup ~]# yum -y install rsync 2.配置服务 [rootbackup ~]# vim /etc/rsyncd.conf uid rsync gid rsync port 873 fake super yes use chroot no max connections 200 timeout 600 ignore erro…

【项目】智能BI洞察引擎 测试报告

目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试(异步)测试用例测试结…

权限菜单之菜单管理 SpringBoot + VUE

一、 数据表设计 新建表sys_menu 表内数据 添加实体类Menu package com.example.demo.demos.web.demo.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.Ta…

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

:羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言: 在当今数字化的时代,人工智能生成内容(AIGC)正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师,…

UnityRenderStreaming使用记录(三)

测试UnityRenderStreaming在Ubuntu24.04.1LTS上的表现 先放上运行图操作系统 Ubuntu24.04.1LTSUnity测试工程环境相关修改遇到的问题 先放上运行图 操作系统 Ubuntu24.04.1LTS 系统下载地址 https://cn.ubuntu.com/download/desktop安装UnityHub https://blog.csdn.net/AWNUXC…

从0开始的docker镜像制作-ubuntu22.04

从0开始的docker镜像制作-ubuntu22.04 一、拉取基础ubuntu22.04镜像二、进入拉取的docker镜像中,下载自己需要的安装包三、安装需要的系统软件四、打包现有镜像为一个新的镜像五、推送打包的镜像到私有docker服务器1.编辑docker文件,使其允许http传输和对…

多模态论文笔记——CogVLM和CogVLM2(副)

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍多模态模型的LoRA版本——CogVLM和CogVLM2。在SD 3中使用其作为captioner基准模型的原因和优势。 文章目录 CogVLM论文背景VLMs 的任务与挑战现有方法及…

gitlab-runner的卸载与安装

如果你使用rpm方式安装gitlab-runner,则可以参考本教程。 卸载 停止和卸载gitlab-runner 停止 gitlab-runner stopchkconfig gitlab-runner off卸载 gitlab-runner uninstall删除rpm包 查询出rpm包名,根据包名删除rpm。 [rootEuler02 ~]# rpm -qa …

Nacos配置中心总结

Nacos配置中心总结 Nacos配置文件的加载顺序和优先级 加载顺序 nacos作为配置中心时,需要在bootstrap.yml文件中添加nacos config相关的配置,这样系统启动时就能先去拉取nacos server上的配置了。拉取过来后会和本地配置文件进行合并。 bootstrap.ym…

赛博周刊·2024年度工具精选(图片资源类)

1、EmojiSpark emoji表情包查找工具。 2、fluentui-emoji 微软开源的Fluent Emoji表情包。 3、开源Emoji库 一个开源的emoji库,目前拥有4000个emoji表情。 4、中国表情包大合集博物馆 一个专门收集中国表情包的项目,已收录5712张表情包,并…

Goland:专为Go语言设计的高效IDE

本文还有配套的精品资源,点击获取 简介:Goland是JetBrains公司开发的集成开发环境(IDE),专为Go语言设计,提供了高效的代码编辑、强大的调试工具和丰富的项目管理功能。其智能代码补全、强大的调试与测试支…

小程序发版后,用户使用时,强制更新为最新版本

为什么要强制更新为最新版本? 在小程序的开发和运营过程中,强制用户更新到最新版本是一项重要的策略,能够有效提升用户体验并保障系统的稳定性与安全性。以下是一些主要原因: 1. 功能兼容 新功能或服务通常需要最新版本的支持&…

EasyExcel(环境搭建以及常用写入操作)

文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…