当前位置: 首页 > article >正文

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

](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.kler.cn/a/462961.html

相关文章:

  • tcpdump指南(1)
  • 呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音
  • dockerignore文件怎么写
  • 【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
  • OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示
  • parquet文件数据格式介绍以及python pandas对parquet常见操作
  • 基本语法与数据结构:全面掌握 Java 的基础
  • STM32使用UART发送字符串与printf输出重定向
  • 自动驾驶---Tesla FSD Version 13
  • Java排序算法全解析
  • memcached的基本使用
  • arcgis模版空库怎么用(一)
  • 基于Java+SQL Server实现的(GUI)会展中心管理系统
  • Wndows bat将一个目录下所有子文件夹的路径导出到txt文本
  • Windows 安装 MySQL8(在已有MySQL 5.7 的情况下)
  • 【SQL Server】教材数据库(3)
  • 【Domain Generalization(2)】领域泛化在文生图领域的工作之——PromptStyler(ICCV23)
  • 爬虫基础之爬取表情包GIF
  • Pyqt+Opencv的练习
  • 【嵌入式硬件】嵌入式显示屏接口
  • CTFshow-pwn刷题
  • Mongodb日志报错too many open files,导致mongod进程down
  • 主数据驱动的数据治理框架
  • 探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石
  • [卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析
  • OkHttp深度解析:请求流程、分发器机制、拦截器工作及TCP连接复用