【多线程】进程(进程的概念+进程的管理+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中执行了多久),可以作为操作系统调度进程的参考依据,从而对资源分配进行调整。

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

偷cyk的图

相关推荐

  1. 进程线关系

    2024-04-09 08:04:01       20 阅读
  2. 进程概念介绍

    2024-04-09 08:04:01       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 08:04:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 08:04:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 08:04:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 08:04:01       20 阅读

热门阅读

  1. PDF锐化

    PDF锐化

    2024-04-09 08:04:01      13 阅读
  2. 光学透雾方法和图像处理算法透雾

    2024-04-09 08:04:01       16 阅读
  3. 修改huggingface 的cache缓存路径

    2024-04-09 08:04:01       18 阅读
  4. django怎么设置把logger.info的日志保存到本地文件

    2024-04-09 08:04:01       16 阅读
  5. Matlab之R2024a安装软件分享

    2024-04-09 08:04:01       16 阅读
  6. MySQL调优时需要注意的问题

    2024-04-09 08:04:01       14 阅读