本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
在这样一个充满无限可能的时代,我们正站在科技、文化与创新的交汇点上,每一天都有新的故事等待被讲述。从遥远星系的奥秘到微观世界的奇妙,从人类历史的深邃长河到未来梦想的璀璨星辰,每一个领域都蕴藏着无尽的知识和智慧。让我们一起探索未知,挑战极限,共同书写属于我们的精彩篇章
前言
在上篇的计算机组成原理中,我们认知到了计算机的构成和背后的工作原理,学习到了冯诺依曼体系结构和 CPU的重要指标
,以及 操作系统
的作用, 相关的 指标 和 基本的工作原理。
而本篇文章中讲提及一个更重要也是 面试中常考的的重要的热门点 之一 —— 进程和线程
废话不多说,咱们直接上菜吧 🤤 🤤 🤤 🤤
目录
-
进程的初识
-
线程的初识
-
线程和进程的关系
-
线程的缺陷
一. 进程的初识
1. 进程的引入
上一篇我们提及到
在以前,CPU只有
一个核心
,但是却可能实现多个进程的执行,那是因为 分时复用 (先执行一个进程, 再转过来 执行另外一个进程 ) 同样也能达到我们 多个进程(任务)的同时进行 。像这种我们称为并发执行
。
而如今我们 CPU有多个核心, 就可以实现多个 进程的执行 , 让多个CPU的核心同时执行, 这样的也就能大幅度的 提高效率 。 而这种我们称之为
并行执行
通过写代码可以把 多个CPU核心都利用起来 , 这样的编程,我们就称之为 并发编程
而我们把 并发和并行 的两种的执行过程,都可以称之为 并发编程
。
还不了解的小伙伴可以参考小编的上篇文章
进程的并发执行文章链接
那么我们谈及的进程到底什么呢? 他发挥着什么作用呢? 不妨看看下面的简介吧 ! ! !
1. 进程的简介
像上面我们利用 多个CPU核心 ,实现多进程的就是我们 多进程编程 。
所以进程本质上 系统管理的软件资源 , 也称为
任务
。
多进程编程 是我们典型的 并发编程
。
多进程的虽然能解决多任务的问题,但如今对于效率的要求越来越高,同时也存在一些问题。
2. 多进程的不足
在 操作系统中, 进程的创建和销毁都会 ==消耗的较大的时间和空间 ==。
因为当执行一个
.exe
的程序(双击) 时, 操作系统 本身就会消耗这个程序的执行进程分配系统资源
的过程。
而当 关闭这个程序运行 的时候, 就需要 销毁进程 , 就会产生 释放系统资源 的过程
虽然多进程编程能让开发者把 一个任务
分配给 多个进程同时执行
, 能够 加快效率 。
但一旦场景需要 , 我们就需要不断的 频繁创建销毁进程 , 由于比较 重量级的 , 这样的
开销是很大
。
鱼式疯言
- 栗子说明
试想一下这样的场景: 针对我们 服务器开发
客户端
每次发来的请求访问
, 都需要单独的 创建和销毁一次进程 ,由这个进程负责对 客户端提供服务 , 试想一下这样的开销的程度 !!!
进程的本质
用一句话概括就是 :
进程
是 系统分配资源 的基本单位
那么对于上面问题, 我们该如何解决了 ? ? ?
二. 线程的初识
1. 线程的引入
上面我们说到对于一个 ==可执行程序 .exe 文件 ==来说, 当我们执行程序(双击) , 系统就会创建进程,给这个程序分配 各种系统资源
(CPU, 内存,硬盘, 网络带宽…) .
同时 创建进程的过程 中,也会创建一系列的 线程
, 让这些线程在CPU上调度执行
。
所以线程的作用, 就是让程序在内存中利用 CPU核心调度执行
。
2. 线程的优势
回忆我们学习进程的问题,最大的不足就是进程很“重”, 每次创建/ 销毁的开销很大。
而线程的引入就直接解决了 进程开销大 的问题
因为线程创建是没有进程的创建时需要 分配系统资源
过程的。
线程是 微量的进程 , 当一个进程分配好一个系统资源后,线程就可以在进程分配好的资源下 共用同一份系统资源
3. 举个栗子
<1>. 假如现在有个滑稽 在吃100只鸡 (一个房间, 一张桌子,和一个滑稽)
<2>. 为了提高吃鸡效率,我们引入了 多进程方案
创建 两个房间, 两张桌子,分别分出各50只鸡
这样的让两个滑稽同时 吃50只,效率就增加了不少 , 但是我们同时 也需要开销创建房间,桌子… 的过程。 这样的过程就比较 “重”
。
<3>. 引入多线程
让两个滑稽同时在同一个房间,同一张桌子上吃, 这样不仅提高了效率, 还省去了 多创建一个房间和桌子的过程
<4>. 如果多创建多个线程呢
创建了4个滑稽,每个滑稽平均吃25只,这样的话,速度又进一步提高
。
<5>. 但是如果创建 很多个线程
这时就会出现 问题
,会出现相互竞争的情况,有可能还会导致 整个进程都崩溃 。 这个具体下一节小编会细细道来。
鱼式疯言
总结三句话
进程 是系统 资源分配
的基本单位
相当于 创建大工厂
相似。
线程 是系统 调度执行
的基本单位
相当于 征用工人工作
相似。
三. 进程与线程的关系
在上一篇文章中,我们谈到 进程是用一个 PCB这样的结构体 来描述并用 链表结构
来组织的。
其实这句话,是针对只含有 含有一个线程的进程
来说。
本质上是
-
一个
进程
中包含一组 PCB这样复杂的 PCB结构体 , 并用链式结构
来组织的 -
一个
线程
是 一个 PCB 结构体来描述,并用链式结构
来组织的。 -
所以 进程包含线程 , 并且 一个进程 是可以包含 多个线程 的。
并且当 一个进程 创建好, 系统资源分配完成 , 同时就会
一个 或 多个线程
。
但是一个进程中是
不能没有线程的
,因为线程是 系统调度执行 的基本单位。
-
并且这个线程是
共用同一份系统资源
。 -
所以也就是为什么说, 线程是 微量的进程,不需要再分配资源, 就 不需要 额外的去开销。
-
但是每一个线程中的
优先级
,上下文
,记账信息
这些单独的属性都是独立不同的
。
这点小伙伴们一定要区分开哦
鱼式疯言
一句话概括:
进程 包含线程,每个进程至少
有一个
线程 ,虽然线程共用同一份资源, 但每个线程的 属性相互独立 。
四. 线程的缺陷
如果我们不断的 创建线程的数目 ,就会出现下面问题。
像上面,如果我们线程创建过多, 桌子只有一张, 资源也只有那么多, 那么线程和线程之间就会 发生竞争,就会出现抢占资源的情况。
这样的执行效率就不会进一步的提升,反而还有可能减慢。
原因就是我们因为微观上
并发执行
的效果就 无法进一步提高 , 系统资源也只有那么多,CPU的核心也只有那么多 , 不能充分利用好线程, 执行一个任务转而接着执行另外一个任务。
可以理解为
通道
只有那么大,能运行 并发执行的线程 已经到达 上限了。
那么唯一的解决方案, 增加CPU的核心, 从提高
并行执行
的效率, 让 不同线程同时执行不同的任务 ,从而有效的提高速度
。
关于 CPU核心知识
CPU的核心数文章详解
那么我们就可以理解为把 管道变宽
, 让能通过的线程变多, 自然就 速度加快,效率提高 。
鱼式疯言
有着 大量的线程就会出现竞争 ,如果
竞争激烈
的话, 一个线程的崩溃,就会抛出异常
。
如果异常处理不当的话,就会导致整个进程都出现崩溃,进而就会带走
其他线程
,造成 整个程序的崩溃 。
补充知识
但是每个进程之间是不影响的,当 进程
和 进程
之间是 相互独立 的,一个进程的崩溃是不会影响其他进程的执行的。
总结
-
进程的初识 :认识到进程是系统管理的软件资源, 是系统资源的基本单位, 但很"重”量, 创建/ 销毁进程消耗大。
-
线程的初识: 线程是微量的进程,创建和销毁不需要额外消耗空间和时间, 是系统执行的基本单位
-
线程和进程的关系: 进程包含线程, 进程至少要含有一个线程, 每个线程都有自己独有的属性。
-
线程的缺陷 : 线程创建过多,就会出现资源不足,造成竞争激烈,进程停止,程序崩溃的问题。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖