文章目录
进程
一、计算机的组成:
- 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中执行了多久),可以作为操作系统调度进程的参考依据,从而对资源分配进行调整。
点击移步博客主页,欢迎光临~