进程,线程

简介: 进程, 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月前
                |
                Java Linux 调度
                硬核揭秘:线程与进程的底层原理,面试高分必备!
                嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
                39 6
                |
                1月前
                |
                消息中间件 调度
                如何区分进程、线程和协程?看这篇就够了!
                本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
                63 11
                |
                2月前
                |
                算法 调度 开发者
                深入理解操作系统:进程与线程的管理
                在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
                |
                2月前
                |
                消息中间件 Unix Linux
                【C语言】进程和线程详解
                在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
                87 6
                |
                2月前
                |
                调度 开发者 Python
                深入浅出操作系统:进程与线程的奥秘
                在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
                |
                2月前
                |
                调度 开发者
                核心概念解析:进程与线程的对比分析
                在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
                82 4
                |
                2月前
                |
                调度 开发者
                深入理解:进程与线程的本质差异
                在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
                82 5
                |
                3月前
                |
                监控 JavaScript 前端开发
                python中的线程和进程(一文带你了解)
                欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
                47 0
                |
                3月前
                |
                并行计算 数据处理 调度
                Python中的并发编程:探索多线程与多进程的奥秘####
                本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
                |
                3月前
                |
                Java
                java小知识—进程和线程
                进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
                43 1

                热门文章

                最新文章

                相关实验场景

                更多