🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈
文章目录
- [1. 操作系统](#1. 操作系统)
- [2. 进程](#2. 进程)
-
- [2.1 进程是什么](#2.1 进程是什么)
- [2.2 进程管理](#2.2 进程管理)
- [2.3 进程调度](#2.3 进程调度)
- [2.3 内存管理](#2.3 内存管理)
- [2.4 进程间通信](#2.4 进程间通信)
- [3. 线程](#3. 线程)
-
- [3.1 线程是什么](#3.1 线程是什么)
- [3.2 多线程编程](#3.2 多线程编程)
- [3.3 线程与进程联系与区别](#3.3 线程与进程联系与区别)
1. 操作系统
【概念 】是一个软件 ,是一组做计算机资源管理 的软件统称,非常复杂,所以操作系统本身是一个很大的话题(这里简单了解,引入进程概念)
【常见的操作系统 】
【基本功能 】
1)防止硬件被时空的应用程序滥用
2)向应用程序提供简单一致的机制来控制复杂低级硬件设备
【对上 】要给软件提供稳定的运行环境
【对下 】要管理好 各种硬件设备
操作系统的功能非常多,其中一个与我们密切相关的功能模块--->进程管理
接下来让我们一起来看看,进程是什么吧~~~
2. 进程
2.1 进程是什么
【进程 】也称作任务 ,一个运行起来的程序 ,就是进程~
这个.exe是一个可执行文件,即程序,当我们双击这个exe,这个程序微信就运行起来,在系统中形成一个进程
即进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程
【基本单位 】进程 是操作系统进行资源分配 的基本单位
(此处涉及到的资源包括不限于内存,硬盘,CPU等等)
在任务管理器中,我们可以看到电脑的进程,打开任务管理器的快捷键为Ctrl+Alt+Del,如图:
通过任务管理器,我们能看到系统中有如此多的进程都在跑着!那么进程有如此之多,如何去管理呢~
2.2 进程管理
所谓进程管理,即进程多了才需要管理,分为以下两步:
1)描述一个进程 :使用结构体/类,表示一个进程的信息
2)组织这些进程:使用一定的数据结构,把这些结构体/对象放到一起
举一个生活中常见的栗子叭~
一个大型超市,有特别多的商品,超市需要管理这些商品,建立一个商品信息管理系统,需要做:
1)明确每个商品的相关信息 (价格、生产日期等)
2)通过一定的数据结构将这些商品信息都组织起来(如通过表格等)
2.3 进程调度
【进程调度概念 】操作系统对CPU资源 的分配,采用时间 模式,不同的进程在不同的时间段去使用 CPU 资源即为进程调度~
先来了解进程的基本知识叭~
在Java中,我们通过类/对象描述这个特征,即每一个PCB对象代表一个在运行的程序即进程
进程类---> PCB(process control block)
c
class PCB {
//属性1 pid
//属性2 内存指针
//属性3 文件描述表
//属性4 进程调度信息
//...
}
操作系统再通过数据结构把PCB对象组织起来,往往使用双向链表来组织PCB对象,进程相当于链表中的节点,方便管理时进行增删改查的操作
- 创建一个进程,即创建一个链表的节点
- 销毁一个进程,即把链表的节点删除
- 遍历进程列表,即遍历链表
PCB中的属性非常多,在这里枚举4个核心的属性:
1)pid
每个进程需要有一个唯一的身份标识(如每个人都有独一无二的身份证~~)
2)内存指针
当前这个进程使用的内存是哪一部分(进程要跑起来,就需要消耗一定的硬件资源,比如内存~进程运行的时候,使用哪些内存上的资源)
3)文件描述符表
进程每次打开一个文件,就会产生一个"文件描述符",标识了这个被打开的文件,一个进程可能会打开很多文件,对应一组文件描述符,把这些文件描述符放到一个顺序表 这样的结构,构成文件描述符表
4)进程调度信息
这一组属性都是描述和CPU资源相关的属性,这些属性都辅助进行进程调度
【预备知识 】先来了解了解CPU!
我们的程序能运行,全靠CPU,每一个程序相当于一组"二进制指令 "的集合
CPU中的一个概念:核心数 (在任务管理器中可以看到我们电脑的核心数)
这个表示16核32线程,即CPU里有16个核心,每个核心顶两个!16个人可以干32个人的活~
但是我们可以看到一个电脑上可以运行很多程序,不止这些,那么计算机是如何做的呢~
【并行 】同一时刻,两个核心同时执行两个进程,此时这两个进程就是并行执行的(强调同时 )
【并发 】一个核心先执行进程1执行一会后再去执行进程2...只要这里切换进程的速度足够快,看起来进程1和2就是"同时"进行的
所以虽然只有这些核心,但是也可以同时执行很多很多个任务啦~
在计算机中,通过并行+并发的方式来完成的(由操作系统控制,我们感知不到的~)所以很多时候把并行+并发统称为并发!
【进程调度意义 】如上所述,进程调度就是为了解决电脑核心数是固定的但是电脑有很多程序要运行的问题 ~
A) 进程状态
简单认为进程状态主要是这两个:
【就绪态 】该进程已准备好,随时可以上CPU执行
【阻塞态 】该进程暂时无法上CPU执行
B)进程的优先级
进程之间的调度不一定是"公平"的,有的会优先调度(在现实生活中,我们也会将事情根据重要性排个序,有的事情就需要优先做~)
C) 进程的上下文
即描述当前进程执行到哪里的"存档记录",进程在暂时离开CPU时把当前运行的中间结果进行"存档",等下次进程回到CPU执行时,恢复之前的"存档",从上次的结果继续往后执行(即记录离开结果,这样回来时我可以从离开的地方继续执行)具体过程如下:
D)进程的记账信息
统计了每个进程在CPU上执行多久(这个可以作为调度的参考依据~)
2.3 内存管理
操作系统对内存资源 的分配,采用空间 模式,不同进程使用内存中的不同区域,互相之间不会干扰,相互独立的~
每个进程访问的内存地址并不是真实的物理内存地址 ,操作系统给进程分配的内存是以"虚拟地址空间 "的方式进行分配的~
【直接访问物理内存地址缺点 】如果进程1内容改变则会可能会影响进程2的内存内容
(比如进程1数组下标越界、野指针情况等)
【虚拟地址空间优点 】
【解释说明 】站在进程角度,它们的代码操作的内存地址是图中0x00-0x33这一段,这里访问的内存就会被操作系统自动映射到真实的物理内存上,当然进程自己是感受不到实际物理内存地址是什么的,如果进程1代码出bug,就没有什么影响,因为任何一个内存操作都需要通过页表翻译 ,如果拿着这个地址发现页表没有这个地址,则不会翻译,也就不会修改真正物理内存,即不会对进程2的内存数据进行干扰
1)方便校验,当前地址是否有效
2)一个进程无法直接影响另一个进程的内存内容,每个地址都有自己独立的地址空间,具有独立性
3)大大提升操作系统的稳定性
2.4 进程间通信
进程是操作系统进行资源分配的最小单位,即各个进程互相之间是无法感受到对方存在的,是相互独立的,这样进程之间 互相具备"隔离性 ",但有时候需要进程之间进行交互,相互配合~
【进程间通信 】即在隔离性前提下,找一个公共区域 ,让进程借助这个区域完成数据交换
【实现方式 】操作系统提供进程间通信具体实现方式,有很多种,如以下:
1)管道 2)共享内存 3)文件 4)信号 5)消息队列 6)网络 等等
其中网络是一种相对特殊的 IPC 机制,支持同主机 也支持同一网络内部非同一主机,进行进程间通信
3. 线程
3.1 线程是什么
【线程 】是更轻量的进程,约定:一个进程中可以包含多个线程,此时这多个线程的每一个线程都是一个可以调度执行一个独立的"执行流",多个线程之间也是并发执行(多个线程可能是在多个CPU核心同时运行,也可能是在一个CPU核心上,通过快速调度进行运行),同时这些线程共用同一份进程的系统资源
即对于线程来说,系统资源已经分配好,创建线程就省下分配资源开销 ,但是创建进程则需要系统分配资源,较耗时~
【为什么资源分配如此耗时 】
比如系统要给进程分配一块内存需要做的以及遇到的情况:
1)系统需遍历自己的空闲内存的表(数据结构) 找到差不多的空间,进行分配内存
2)很多进程都在向系统申请资源~但是系统进行资源分配时候,得一个个来,很耗时
【为什么要线程 】
(1) 并发编程能更充分利用多核 CPU 资源,多进程编程和多线程编程都满足并发编程需求场景(并发编程即同一时刻要运行多个任务)
(2) 线程比进程更轻量,进程创建、销毁、调度成本高 且速度慢不高效,线程则相反,线程创建、销毁、调度成本 比进程低 ~(只有在进程启动,创建第一个线程的时候,需花成本去申请系统资源,一旦进程创建完毕,后续再创建的线程,就不需要再申请资源,这样创建/销毁的效率大大提高)
(3) 在Java中不鼓励多进程编程,非常鼓励多线程编程~
3.2 多线程编程
【意义 】解决并发编程问题
举个栗子吧!更加深入理解一下多进程和多线程编程~
比如想加工一大批零件,有两种做法:
一是再建一个工厂重新再搭一套机器(多进程)
此时这两套机器可以同时生产,不过这种方式需要再建立一个工厂,建工厂比较麻烦,成本较高,但这两个工厂之间是相互独立的,相互不影响~
二是还在当前工厂,引进机器再弄一套生产线(多线程)
这两套机器也可以各自独立生产,是两个独立的执行流,共用同一个资源工厂,除工厂共用,存储原料/成品/仓库/物流运输等等,都能共用,成本降低~
这两种方式均提高了工厂的生产效率,进程相当于工厂,线程相当于流水线~
多进程工厂方式,需多建工厂,开销大,且两机器之间看不到对方进度
多线程工厂方式,有两个机器,共用一个工厂,可以互相了解对方进度
此时想要生产更多的零件,在工厂内弄更多的机器,以此提高生产效率,但是并不是越多越好,如下图:
1)一个工厂的大小提供的空间是固定的即CPU核心数是固定的,此时想进一步提高机器的数量,工厂已经没有空余位置了,机器只能在工厂外干着急~这时,程序的效率并没进一步提升,可能不仅没提升,可能还会下降,因为调度本身也是有开销的 ,调度上一个机器,需要把之前的机器移出来,再把这个机器移进去,有开销,总并发程度依旧固定
2)机器是有脾气的,在这个调度来调度去的过程中,可能很生气很累,出现异常,如果一个线程出现异常,可能会带走整个进程!
在我们的电脑中:
1)在同一程序中,内部需要并发完成多组任务,此时使用多线程比较合适(比如微信,可以同时的视频,也可以聊天,网络传输等等)
2)多个程序之间,此时是多进程,进程之间具有"隔离性"(比如微信是一个进程,qq是一个进程等等)
所以多进程和多线程在电脑中是同时存在的~不是多线程代替了全部!且多进程和多线程都是可以并发和并行的
3.3 线程与进程联系与区别
【联系 】
进程包含线程,一个进程可以有多个线程
【区别】
(1) 进程有自己独立的内存空间和文件描述符表,同一进程多个线程之间共享同一份地址空间和文件描述符表
(2) 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
(3) 进程具有独立性 ,一个进程不会影响另一个进程,但在同一进程的多个线程之间,一个线程挂了,可能会把整个线程带走,影响其它线程~
(4) 进程开销大,消耗资源多,线程执行开销小,但不利于资源的管理和保护
💛💛💛本期内容回顾💛💛💛
✨✨✨本期内容到此结束啦~下期再见!