操作系统 - 进程与线程的区别[超详解]

简介: 操作系统 - 进程与线程的区别[超详解]

🍎一.进程(process)


🍇1.1什么是进程


线程就是我们所谓的"跑起来的程序",那什么是可以跑起来的程序呢?就是类似我们在桌面上创建的对应软件的快捷方式,右击软件点击打开文件所在位置我们就可以看到xxx.exe文件,这样exe的文件我们统称为可执行文件


053d903ab1da49fc9a279de49f787426.png

584de9f08b874ec9b80c9e6e2567d290.png



当我们不想启动软件时,这些文件就会静静的"呆在"硬盘上,在我们双击之前是不会对系统有任何影响.

但是,当我们一旦双击这些exe文件后,操作系统就会把这些exe的文件加载到内存中,并且让CPU开始执行exe内部的一些指令(exe 里面存放了很多程序点对应的二进制指令).这个时候这些exe文件就不再’"呆呆"的在硬盘上了,把这些文件运行起来的可执行文件,称为**“进程”**.


a33c637191654ca2bbe8dae2cdb13bf8.png


🍇1.2操作系统管理进程


159d7eb2d1f7498ea2b51019536516f2.png



进程控制块(PCB):

我们知道操作系统里面主要是由C++实现的,此时对线程的描述就类似于用C语言的"结构体"(也就和Java类差不多),操作系统所描述的这个结构体就是统称为"PCB"(process control block)–进程控制块.我们在电脑的任务管理器中可以看到pid - 进程的"身份证号码"


内存指针:

就是当我们想要知道进程要执行的代码/指令在内存的哪里,以及这个进程中依赖的数据在哪里就会用到内存指针


文件描述符表:

可以视为数组,里面的每一个元素都是一个结构体,也就是对应一个文件的相关信息

在程序运行中,经常要和我们硬盘里的文件"打交道",每当进程打开一个文件,就会在文件描述符表多增加一项"元素".

当一个进程只要一启动,不管代码是否写了打开/操作文件的代码,都会系统默认的打开三个文件:标准输入(System.in),标准输出(System.out),标准错误(System.err).


🍇1.3进程的调度


进程的调度分为四个部分:状态,优先级,记账信息,上下文

我来给大家举一个例子:有一位女同学长相十分美丽,身材也好,自然就会有很多男生追求,这个时候这个女生就在想这么多男生追求我,我应该选择那个最我的男朋友比较好呢,她想那我就先选三种类型的男生来同时和我谈恋爱,A男生有钱,B男生有颜,C男生对她好"舔狗".


进程的状态: 进程随时可以去CPU执行就叫做就绪状态,进程暂时不可以去CPU执行就叫做阻塞状态

例子: 当这个女生想要找A去逛街时,A说我在国外办一些事情没有空去陪这个女生,这就是阻塞状态,当女生找C去逛街,c立马答应配女生逛街就是就绪状态


进程的优先级: 就时将CPU执行的顺序优先给到一些线程

例子: 因为B颜值很高,所以女生将自己的周一到周五的时间来和B在一起度过,周六和A在一起度过,周日又可能和C在一起度过.


进程的记账信息: 统计了每个线程都分别执行了多久,分别都执行了那些指令,分别排队等了多久

例子: 因为女生长期不和C在一起,C对女生的好感度降低,对女生舔的力度不够了,女生就会适当的去陪陪C,来增加C对自己的好感度.


进程的上下文: 表示在上一次进程别调度出的时候,程序的执行状态,这样在下一此进程调到CPU时就能接着上次执行的状态继续运行,所以在进程调度之前,都需要先把CPU上的寄存器的数据都保留到内存中,相当于"存档",到下次CPU调用该进程的时候,根据上次在内存存储的数据在进行继续执行,就叫做读档 .

例子: 当女生忘了改A,B,C三个男生的备注了,有一天男生们换头像或者昵称了,女生把A的名字叫成了B的名字,将C的名字也叫成了B的名字这样就会引起A,C的猜疑,所以女生过后就会将A,B,C的备注改成他们的名字


🍇1.4线程的通信


操作系统上同时运行着多个进程,我们来考虑一种情况,就是当一个进程出现bug导致进程崩溃,其他进程会不会受影响呢?对于现代的操作系统,是不会影响的。因为线程之间通过虚拟地址空间,来保证进程之间的独立性。


每个进程只能访问自己的那一块虚拟地址空间的数据,无法访问其他进程虚拟地址空间的数据,这样当一个进程崩溃时,另外的进程不会受到影响,这样就将各个进程隔离起来了。


但是,在实际工作开发中,进程间常常需要进行交互,为了实现进程间的通信,操作系统提供了一块“公共空间”,进程A可以先把数据存入“公共空间”,然后进程B可以到“公共空间”取出数据,这样就实现了进程间的通信。


操作系统提供的“公共空间”有很多种,有储存大的也有小的,有访问速度快的也有慢的,现在最常见的进程间通信机制有:


1.文件操作

2.网络操作(socket)


那么为什么要引出进程这样一个概念呢?因为现代的操作系统都是多任务操作系统,为了最大效率地运行程序,我们需要进行并发编程,毕竟一群人完成任务的速度比一个人要快的多。


🍇1.5并发编程


我们发现如果需要频繁的创建/销毁进程,这个事情成本是很高的,如果需要频繁的调度进程,这个事情成本也是很高的,那我们应该如何解决呢?

方案A: 使用进程池,与字符串常量池类似,将已经创建的进程存入常量池,后面需要使用时直接加载即可,但是也存在问题,那就是闲置的进程也会占用资源,相当于空间换时间,消耗空间来提升效率。


方案B : 使用多线程来实现并发编程,因为进程包含线程,一个进程中包含多个线程,所以线程比进程轻量,因此Linux中也将线程称为轻量级进程(LWP),正是因为线程比进程轻量的多,线程的创建与销毁的成本很低,因此使用多线程实现并发编程比多进程更加合适。


**例子:**假如华为手机要生产1万台手机,但是一条生产线只可以生产5000台手机

方法1.我们可以分两个工厂来分别生产5000台手机(两个进程)

方法2.我们可以让改工厂在生产出一条可以生产5000台手机的生产线(一个进程,两条线程)

我们可以看出方法1是实现并发编程,方法2实现了多线程并发编程


🍎二.线程(Thread)


🍇2.1什么是线程


如上述,知道了进程就是运行的程序,那线程又是什么?线程是进程内部的一部分,如果说进程是一个工厂,那么线程就是工厂中的生产线,所以一个进程可以包括很多个线程,一个进程至少拥有一个线程


🍎三.进程与线程的区别(面试高频问题)


🍇3.1谈谈进程和线程的区别和联系


1.线程可以包含线程,一个进程里可以有一个线程,也可以有多个线程

2.进程具有独立性,每个进程有各自的虚拟地址空间,一个进程挂了不会影响其他进程,但是一个线程挂了,就会影响其他线程,甚至导致整个进程崩溃

3.操作系统创建进程,要给进程分配资源,进程是操作系统分配资源的基本单位 操作系统创建线程,要在CPU上调度执行,线程是操作系统调度执行的基本单位

4.进程和线程都是为了处理并发编程这个场景,但是在频繁和释放时进程效率低,线程效率高

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
9天前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
31 5
|
7天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
25天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
24天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
28天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
42 3
|
1月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
27天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
26 1
|
29天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
27 0
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
48 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
人工智能 安全 Linux

热门文章

最新文章