进程,线程

简介: 进程, PCB,  pid,  内存指针(一组属性),  文件描述符表,  进程的状态,  进程的优先级,  上下文,  记账信息, 虚拟地址空间,线程, 线程的特点

操作系统是一个搞管理的软件,它对上给各个应用程序提供稳定的运行环境;对下管理各种硬件设备。

进程

一个操作系统由内核和配套的应用程序组成。而进程就是操作系统内核中众多关键概念中的一个。进程通俗一点来讲就是一个已经跑起来的程序。

每个进程都会消耗一定量的系统资源(CPU,GPU,内存……)。而操作系统是按照进程来分配资源的,即:进程是系统分配资源的基本单位

PCB

在操作系统中有一个专门的结构体(操作系统内核是C/C++实现的)来描述进程的属性,而这个结构体被统称为 “进程控制块” 也叫PCB(Process Control Block)(此处的pcb并不是硬件中的pcb板)。

一个进程可以使用一个或多个PCB来表示,操作系统中会使用一个类似双向链表的数据结构来管理和组织多个PCB。

    • 进程的创建就是创建PCB并将其插入链表;
    • 销毁进程就是将PCB从链表上删除并释放;
    • 展示进程列表就相当于遍历链表。

    pid

    pid是进程的身份标识。每个进程都会有一个pid,程序一运行系统就会自动分配给进程一个独一无二的PID。 进程中止后PID被系统回收,可能会被继续分配给新运行的程序。

    内存指针(一组属性)

    内存指针描述了进程持有的内存资源是啥样的。

    每个进程在创建的时候都会分配一块内存。

      • 进程需要一块专门的内存来存储需要执行的指令,例如当我们打开电脑中的exe文件时系统就会读取文件内容并将其加载到内存中,之后CPU从内存中取走并执行这些指令;
      • 同时还会存储一些运行时产生的临时数据。

      文件描述符表

      文件描述符表是一种类似于顺序表的数据结构。描述了进程持有的硬盘资源是啥样的。

      每个进程都有一个自己的文件描述符表,通过文件描述符表可以知道当前程序关联了哪些文件都能操作那些文件。


      PCB中还引用了一些属性,用来支持操作系统实现进程的调度。

      进程的状态

      就绪状态:进程时刻准备着去CPU上执行,也就是此时进程被CPU随叫随到,呼之即来挥之即去。

      具体情况:

        • 进程正在CPU上执行;
        • 虽然此时进程没有在CPU上执行但时刻准备着去CPU执行

        阻塞状态:当进程中某种执行条件不具备,而导致这个进程无法参与CPU的调度执行。比如程序在等待用户输入。

        进程一共有 5 种状态,分别是创建、就绪、运行(执行)、终止、阻塞

        进程的优先级

        在操作系统中对多个进程进行调度时并非是一视同仁的,有些进程操作系统会给予更高的优先级。比如:当你打游戏时游戏的优先级就高于QQ。

          • 每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间
          • 进程的优先级可以动态变化,高优先级进程优先运行,优先级相同的进程按照时间片轮流运行

          上下文

          进程在从CPU离开之前需要保存现场,将当前CPU中的各种寄存器的状态都记录在内存中。等下次进程再回到CPU中执行时,就会将这些内存信息恢复回去让接着上次的继续执行。简单来说就是存档和读档。

          记账信息

          因为操作系统会通过进程优先级机制对不同优先级的进程分配不同的硬件资源。而这就有可能会导致某一个或几个进程占用了太多的资源而导致某一个或某几个进程因为分配不到资源而发生异常。

          记账信息会记录当前进程所持有的CPU状况,而根据这些信息对资源进行动态的分配。


          虚拟地址空间

          早期的电脑并没有虚拟内存,那时操作系统为进程所分配的都是物理内存。

          image.png

          此时就会存在一些问题如果进程A在访问内存时发生了越界就有可能会更改进程B内存中的数据进而导致A和B两个进程都发生异常。

          之后操作系统对内存进行了一层抽象,引入了“虚拟地址空间”的概念,此时操作系统分配的就不是真实的物理内存地址了而是分配的虚拟内存地址。

          image.png

          此时因为进程得不到真实的物理内存地址也就不会发生上述的,错误修改别的进程的内存的情况了。但是此时又引入了一个新的问题:此时的进程与进程之间被完全的隔离了起来,之前如果两个进程之间想要实现通信就可以直接在对方的内存中进行修改,可是引入了虚拟内存之后因为无法得到真正的内存地址,所以就无法使用相同的方式进行修改。


          此时进程之间的通信就需要借助一个额外的公共的内存空间进行实现:比如 A 在网上买了一台电脑,然后快递员将它送到菜鸟驿站,然后 A 再去菜鸟驿站拿到电脑。


          其实此处的通信方式有很多种但整体的核心思想都是借助一个额外的公共的内存空间。


          线程

          此处利用工厂来举例线程和进程的关系:

          此时 A 是一个工厂的老板现在他有一个工厂,但工厂里只有一条流水线 A 们每天可以赚到 100 块钱。

          image.pngimage.gif

          这时 A 想要每天赚 200 块钱那么他现在有两种解决方案,第一种再建一个工厂同样也只有一条流水线;第二种就是在旧工厂里面增加一条流水线。

          image.png

          image.gifimage.png


          这里的流水线就相当于线程;而工厂就相当于进程。

          在JAVA中鼓励使用多线程而并不鼓励使用多进程的方式来实现并发编程。

          上文提到过进程是系统分配内存的基本单位,而分配内存对于系统来说并不轻松所以导致:进程太重量,效率不高

            • 创建一个进程消耗的时间较多;
            • 销毁一个进程消耗的时间也较多;
            • 调度消耗的时间也多。

            而线程是比较轻量的也叫 “轻量级进程” 。就像上面举的例子新建一个工厂肯定没有新加一条流水线省时省力。

            虽然线程的创建,销毁,调度都较快但是线程却无法离开进程单独存在,也就是进程里面是包含线程的可以包含多个线程但至少要包含一个线程。

            线程来负责执行代码,如果需要可以创建多个线程,每个线程都可以独立的执行一段代码,从而实现并发编程的效果。

            线程是调度执行的基本单位。

            而上文提到的PCB和线程是一一对应的,也就是说一个进程可以有多个PCB而每个PCB都对应一个线程。但是 pid,内存指针,文件描述符表 在同一个进程之间是公用的。也就是说除了第一个线程剩下的线程在创建时都不需要重新申请资源了。

            线程也不是越多越好,因为工厂的大小是一定的,如果线程过多效率不但不会提高可能还会降低

            image.png

            线程的特点

              • 每个线程都可以单独去CPU上调度执行;
              • 同一个进程中的多个线程公用同一块内存空间,文件资源。

              总结:

              进程中包含线程(线程数至少为 1 )=> 每个PCB都对应一个线程 => 每个线程都有自己的状态,上下文,优先级,记账信息 => 每个线程都可以独立去CPU上调度执行 => 同一个进程中的多个线程公用同一块内存空间,文件资源 => 创建线程不需要重新申请资源 => 线程更轻量

                • 进程是资源分配的基本单位;
                • 线程是调度执行的基本单位。

                进程和进程之间相互独立,一个进程挂了并不会影响其他的进程;而如果一个线程挂了如果没有妥善处理是会影响到其他线程的


                目录
                相关文章
                |
                1月前
                |
                消息中间件 并行计算 安全
                进程、线程、协程
                【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
                43 1
                |
                10天前
                |
                并行计算 数据处理 调度
                Python中的并发编程:探索多线程与多进程的奥秘####
                本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
                |
                14天前
                |
                Linux 调度 C语言
                深入理解操作系统:进程和线程的管理
                【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
                |
                11天前
                |
                Java
                java小知识—进程和线程
                进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
                22 1
                |
                17天前
                深入理解操作系统:进程与线程的管理
                【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
                33 2
                |
                18天前
                |
                调度 Python
                深入浅出操作系统:进程与线程的奥秘
                【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
                |
                1月前
                |
                存储 消息中间件 人工智能
                进程,线程,协程 - 你了解多少?
                本故事采用简洁明了的对话方式,尽洪荒之力让你在轻松无负担的氛围中,稍微深入地理解进程、线程和协程的相关原理知识
                41 2
                进程,线程,协程 - 你了解多少?
                |
                29天前
                |
                Python
                Python中的多线程与多进程
                本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
                |
                1月前
                |
                消息中间件 并行计算 安全
                进程、线程、协程
                【10月更文挑战第15天】进程、线程和协程是操作系统中三种不同的执行单元。进程是资源分配和调度的基本单位,每个进程有独立的内存空间;线程是进程内的执行路径,共享进程资源,切换成本较低;协程则更轻量,由用户态调度,适合处理高并发和IO密集型任务。进程提供高隔离性和安全性,线程支持高并发,协程则在资源消耗和调度灵活性方面表现优异。
                45 2
                |
                2月前
                |
                存储 消息中间件 资源调度
                「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
                该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
                「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识

                热门文章

                最新文章

                相关实验场景

                更多
                下一篇
                无影云桌面