【多线程】进程(进程的概念+进程的管理+PCB(进程控制块)+进程的调度+进程的独立性)

进程

一、计算机的组成:

  • CPU

中央处理单元

主频、核心数

  • 存储器

内存:速度快、空间小、成本高、掉电后数据丢失

外存:速度慢、空间大、成本低、掉电后数据不丢失

  • 输入设备
  • 输出设备
1.指令(Instruction)
  • CPU上能够执行任务的最小单元
  • 这些单元都是由二进制来表示(机器语言)

二、浅谈操作系统

1.日常的操作系统

windows10/11

linux

mac os

android

ios

操作系统,本质上是进行管理的软件

对下,要管理所有的硬件设备(通过驱动)

对上,要给软件提供稳定的运行环境

  • 要防止硬件被失控的应用程序滥用
  • 向应用程序提供API来控制硬件设备
1.操作系统内核

一个操作系统=内核+配套的应用程序(例如系统自带的程序:文件资源管理器)

内核:
  • 硬件的驱动程序都是在系统内核中执行的。

内核需要给很多的应用程序提供支持(API)

不同系统的API是不同的,在Java中,系统的API会被JVM进行封装

  • 内核态
  • 用户态

一个程序在运行的过程中,可能是在用户态工作,也可能是在内核态工作。

进程的隔离性:

一个计算机可以同时运行多个程序,这些程序各自独立运行,不会相互干扰。

三、进程(process)

1.进程的概念

1.进程也叫任务:跑起来的一个程序

2.每个进行要想执行,都需要消耗一定的系统资源(硬件资源:cpu/内存/硬盘/网络/gpu)

3.每个进程,都是系统资源分配的基本单位

2.进程的管理

东西多,才会考虑管理

1.管理的两个角度:
1.描述:

使用类/结构体(PCB),把被管理的一个对象的各个属性表示出来

搞清楚被管理的东西,有哪些属性,表示出来

2.组织:

使用一定的数据结构(如双向链表),把这些表示出来的对象,串起来

为了后续的增删改查

2.PCB(进程控制块):

操作系统法内核是C和C++写的

  • 使用PCB来描述进程的属性
  • 一个进程可以用一个或多个PCB来表示

1.系统会使用类似双向链表的数据结构,来组织多个PCB

1.创建一个进程,就是创建PCB,并且把PCB插入到链表中

2.销毁进程,就是把PCB从链表中删除并释放

3.展示进程列表,相当于遍历链表的每个结点

1.PCB的属性:
  • PCB是一个非常庞大的结构体,包含很多属性

.在Linux中,pcb叫做 task_struct

1.pid:(进程标识符)
  • pid:进程的身份标识

每个进程都会有一个pid,不同进程之间的pid是不同的

2.内存指针(一组属性)
  • 描述了进程持有的内存资源

1.每个进程在运行的时候,都会分配一定的内存空间

需要一组指针来区分,这个进程内存空间的具体位置、分配的内存空间中有哪些部分、以及每个部分的作用

2.进程的内存空间,需要有专门的区域存储要执行的指令,以及指令依赖的数据。同时还要存储一些运行时产生的临时数据。

3.文件描述符表
  • 描述了进程持有的硬盘资源

  • 类似于顺序表的数据结构,要很多元素

  • 和文件(硬盘)有关

    进程涉及到因硬盘的操作时,就需要按照文件的方式来操作

进程关联了哪些文件、能操作哪些文件,就是通过文件描述符表进行表示的

3.进程的调度

  • 和进程持有的CPU资源相关

一个进程要执行,需要CPU来执行一系列指令

早期的电脑是单核cpu,一个cpu(舞台)在同一时刻,只能执行一个进程(演员)的指令(剧本)。

分时复用(并发执行)

剧本(指令)上有很多幕,很多演员(进程)轮流上舞台(cpu)表演,每个演员只演一会。

就腾出了地方,让其他演员共同演戏

只要演员们轮转的速度足够快,看起来就是连续的,相当于在同时表演

  • 只要进程在CPU上轮转的速度足够快,在宏观上就相当于一个CPU在“同时”执行多个进程。

现代CPU是多核心的,有多个舞台

1.并行:
  • 如果两个进程同时在两个CPU核心上,在微观上也是同时执行的。
2.并发:
  • 一个CPU核心上,通过快速轮转调度的方式,执行多个进程,在宏观上的同时执行,微观上有先后

并发和并行,在应用程序层面感知不到,由系统内部完成调度。

一般会用并发代指并行和并发

PCB的属性:
  • PCB中引入了一些属性,来支持操作系统实现进程调度的效果
1.进程的状态
1.就绪状态:

1.进程正在CPU上执行。

2.进程随时准备好,去CPU上执行

2.阻塞状态:

某个进程,某种执行条件不具备,导致这个进程暂时无法参与CPU的调度执行

比如进程等待用户输入

进程还有其他状态等待

2.进程的优先级
  • 操作系统在调度多个进程时,并非一视同仁
  • 有的进程会具备更高的优先级,优先调度,更好的调配系统资源
3.进程的上下文

进程从CPU离开之前,需要保存现场,把当前CPU中各种寄存器的状态,都记录到内存中(存档)

等到下次进程回到CPU上执行时,此时就可以把保存的这些寄存器的值,恢复回去。(读档)

进程就会沿着上次访问到的位置,继续向后执行。

  • CPU中,有些寄存器没有特定含义和作用,只是用来保存运算的中间结果。有些寄存器是有特定含义和作用的

1.保存当前执行到哪些指令的寄存器(程序计数器)(x86_32位cpu上叫eip)

1.是一个2/4/8字节的整数,存的是一个内存地址。这个地址对应的就是程序下一条要执行指令的位置

2.一个exe文件,就包含了指令和数据,运行exe,操作系统就会把指令和数据加载到内存中(内存地址),CPU先从内存中取指令,然后执行指令。初始情况下,程序计数器就指向进程指令的入口(类型main方法)。每次取完一条指令,程序计数器的值就会自动更新,默认指向下一条(顺序执行)。如果遇到跳转类指令(jmp、jcmp、call)就会被设置成跳转到的地址。

2.维护栈相关的寄存器

  • 通过一组寄存器来维护当前程序的“调用栈”。栈也是一块内存,这个内存保存了当前这个程序方法调用过程中,一系列的关系,也包含了局部变量和方法参数。

edp始终指向栈底,esp始终指向栈顶

修改esp的值,就可以实现入栈出栈(push指令)

这样才能知道,方法执行完毕后,要回到哪里执行

3.其他的通用寄存器

  • 保存计算的中间结果

一个CPU中的寄存器大概有几十到几百字节,数据不多,好保存,也好恢复。

4.进程的记账信息

通过优先级机制,对不同的进程分配了不同权重的资源。

可能会出现极端情况,所有资源都分配给一个进程,其他没有分配到资源

​ 记账信息会记录,当前进程持有CPU的情况(记录在CPU中执行了多久),可以作为操作系统调度进程的参考依据,从而对资源分配进行调整。

4.进程的独立性

虚拟地址空间

​ 早期的操作系统,程序分配的内存,是物理内存

在这里插入图片描述

  • B进程此时越界访问了A进程的内存,破坏修改了A进程的内存,A进程可能崩溃

而操作系统的目的,就是要为进程提供稳定的运行环境,于是引入了虚拟地址空间的概念。由操作系统对内存又进行一层抽象

​ 不再直接分配物理内存,而是分配虚拟的内存空间。

在这里插入图片描述

  • A和B此时看到的都是抽象之后的虚拟内存,不直接接触物理内存

  • 由操作系统完成虚拟内存到物理内存的映射

​ 当进程A要操作某个数据时,就需要把要操作的虚拟地址告诉操作系统,操作系统再把虚拟地址翻译成物理地址(有一个类似于一种hash表的映射结构,叫做页表),转换完之后,再操作物理地址。

​ 而在翻译的过程中,操作系统会检查,要操作的虚拟地址是否合法。如果要操作的这个虚拟内存地址非法越界访问,就会对当前进程进行处理,不会影响到其他进程。同时也不会影响物理内存。

​ 通过虚拟地址空间,对进程与进程之间进行了隔离。如果需要多个进程的相互配合,就需要引进机制,来实现进程与进程之间的通信

都需要一个公共空间进行交互:1.通过文件。2.通过网络(socket)

点击移步博客主页,欢迎光临~

偷cyk的图

  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值