【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)

简介: 【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)

一、 进程

简单来介绍一下什么是进程,在我的理解中我是把每一个任务都当成一个进程,例如:我打开了电脑微信APP就是一个任务,也是一个进程。

这里的每一个任务都是进程,然后通过C++中的结构体,这里叫做PCB(进程控制块)来描述一个进程,然后通过链表将这些PCB给连接起来,当我们查看是就是遍历该链表,将存储的信息展示出来,当打开或是删除一个进程时,只需要在链表的头或尾进行插入和删除即可,每个进程都有一个结构体PCB,然后通过数据结构组织起来就形成上面的结果。

相比大家已经对PCB(进程控制块)有了一点了解,简单来说就是来描述一个进程的结构体,当然了,在结构体中是不是还有相当多的属性来组成这个结构体的,例如:上图中的状态、CPU…等都是PCB中的一个属性,也是我们接下来要学习的重点,这里我们学习PCB中的7大属性。

分别是:

  1. PID(进程标识符)
  2. 内存指针
  3. 文件描述符
  4. 状态
  5. 优先级
  6. 记账信息
  7. 上下文

所以说一个任务是一个进程,进程也就是系统分配资源的基本单位。

接下来让我们进入真正学习进程的内容了。

1.1 PID(进程标识符)

这个PID贼好理解,就记住PID的一个身份证或是一个数字,专门用来标记这个进程的,当然了,身份证是不重复的,这里的PID也不会有重复的同时出现,当你要使用该进程时,操作系统就会根据你的这个PID来迅速拿到这个进程。

上图可以看到,每一个进程都有一个PID,且是唯一的。

1.2 内存指针

按我的理解来说就是在创建该进程时,需要消耗一定的系统资源的,其中内存就是一种非常重要的资源,在整个电脑中,内存就那么大一点能让你随意使用吗?那肯定当然不是啦。

先从系统这里进行申请,系统分配给你一块,你才是可以使用,由内存指针指定了一块内存资源的区域,表示了你这个进程呀就在这块区域进行活动,且不能超出该区域,每个进程都必须使用自己申请到时候内存(一亩三分地)。

由于内存指针是进程创建时就已经开辟好了的,这里我们无法进行图片展示

总结来说:内存指针就是描述一个进程都能使用哪些内存资源的。

1.3 文件描述符表

内核为每个进程维护一个文件描述符表,该表记录了文件描述符的相关信息,包括文件描述符、指向打开文件表中记录的指针。

简单来说就是文件描述符表描述了一个进程对于内存资源使用的情况。

上图中的CPU、内存、以及磁盘都是文件描述符表对于该进程对内存资源使用的多少进行了统计。

1.4 状态

状态又分为阻塞状态和运行状态,在系统调度中心,若是要让 这个进程到CPU上进行执行就会将它的状态转变为就绪状态在执行中转变为运行状态,但是当不想让该进程进行执行时只需要将它转变为阻塞状态即可。

可以清楚的看到,这些状态一共有两种,一种是正在运行状态,一种是已挂起状态,已挂起状态也可以叫做阻塞状态。

1.5 优先级

优先级也很简单,我想问一下大家,当年同时运行王者荣耀打团时和微信聊天的时候,你要是CPU会先调度谁先来进行运行,很显然的我会先运行王者荣耀,但是计算机并不知道要先运行哪一个该怎么办?

这个时候就需要我们的优先级站出来了,优先级高的进程会优先进入CPU进行执行。

1.6 记账信息

简单来说就是针对每一个进程占据了多少CPU时间,进行了一个统计,然后会根据这个统计结果来进一步的调整调度的策略,确保在下一轮调整后的调度中,确保每一个进程都能进入CPU进行调度.

总结来说就是通过记账信息来进行动态的优化,让每一个进程都能进入CPU进行执行。

1.7 上下文

我们都知道在进程的调度中可能一个进程还没有执行完就被系统调度走了,难道下一次被调度回来时要重新执行前面执行了一半的吗?很显然不是这样的。

其实上下文有点向我们玩小游戏中的读档和存档,当打到第9关卡时不想玩了,就保存文档到上下文,当我们下一次想玩的时候在通过读取存档就可以继续上一次的关卡来进行了。

当进行进入CPU执行后被调度走时,会将当前处理的数据放在上下文中,当下一次重新被调度回来时在通过读取上下文信息进行继续执行。


二、线程

通过上面的学习我们知道了什么是进程,运行一个任务就是一个进程,那么什么是线程呢?可以理解为一个进程可以由一个或多个线程组成,系统在调度时会将一个进程分成多个线程来执行,当所有线程执行完,也就代表着该进程执行完了。

并且由于进程中进行频繁的创建和销毁时,会产生很大的开销(主要体现在资源的申请和释放上面),为什么进程会比线程开销大呢,举个例子:我打开王者荣耀就是一个进程,在刚进入加载界面时是不是会很慢,因为它要加载的数据很多很多,但是当我们进入后打开英雄界面或是匹配界面为什么会快秒出来呢,打开英雄界面就相当于是一个线程,匹配界面也是一个线程,当我关闭该界面(销毁线程时)处理很快,但是我要是关闭一个界面就需要重启一下游戏(进程)时,就知道多痛苦了,也可以看出来,一个进程可以由多个线程组合来完成工作,线程也可以称之为"轻量级进程"

因此说:线程是系统进行调度的基本单位

下图描述了进程和线程的关系。、

每一个进程在内存空间开辟一块属于自己的内存,他们之间相互独立,也叫做内存管理

第二个图片可以看出来,多个线程指向了同一块内存空间,而进程也是由一块空间组成,所以说进程由一个或多个线程构成,只是构成该进程的每一个线程的内存指针相同指向同一块区域,同时线程的文件描述符表也相同都是进程对内存资源的使用情况,当然了进程中其它的属性线程也都有,除了内存指针不同和文件描述符表不同之外,其它是属性和进程一样各不相同。


三、总结:进程和线程之间的区别(非常非常非常重要,面试必考题)

1.进程时系统进行资源分配时的基本单位,线程是系统调度执行时的基本单位

2.进程是包含线程的,一个进程可以由一个或多个线程组成

3.进程由一个或多个PCB组成,一个PCB包含的属性有PID、内存指针、文件描述符表、状态、优先级、记账信息以及上下文等诸多属性。

4…每个进程都有属于自己的资源,但同一个进程中的线程会共用这一份资源(该进程中线程的内存空间和文件描述符表相同)。

5.同一个进程中的线程也是一个独立的执行流,可以执行代码,并且可以单独的参与到CPU的调度中(该进程中 ,线程的PID,状态,优先级,记账信息,上下文相同的)。

6.进程和进程之间不会相互影响,因为他们的内存空间相互独立,也叫做:内存管理

7.进程间也可以相互交换信息,但需要CPU开辟一块公共空间用于交换,该过程叫做:进程间通信

8.同一个进程中的线程之间,可能会互相干扰,抛出异常,会影响到其它的线程,会把整个进程中的所有线程搞崩溃,从而引发线程安全问题。

相关文章
|
4天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
1天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
6 1
|
6天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
16 2
|
8天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
11天前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
12天前
|
Linux 调度
探索操作系统核心:进程与线程管理
【10月更文挑战第24天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度资源的大管家。本文将深入探讨操作系统的两大基石——进程与线程,揭示它们如何协同工作以确保系统运行得井井有条。通过深入浅出的解释和直观的代码示例,我们将一起解锁操作系统的管理奥秘,理解其对计算任务高效执行的影响。
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
3天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
21 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
62 2
下一篇
无影云桌面