操作系统是一个软件,对下要管理硬件设备,对上要给软件运行提供稳定的运行环境。操作系统是软硬件及用户之间交互的媒介。最常见的操作系统有Windows 98,2000,xp,vista,win7,win8,win10,win11,linux,mac,ios(与mac同宗同源)。
进程是一个重要的“软件资源”,是由操作系统内核负责管理的。操作系统通过“描述+组织”的方式进行管理进程,其中描述就是讲清楚都有哪些特征,组织就是通过一定的数据结构,把多个这样的基本单位串起来。操作系统基本上都是C/C++写的,使用C语言的结构体来描述进程属性,有一个名字叫做PCB(进程控制块)。通过双向链表来把多个PCB串到一起,创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。销毁一个进程,本质上就是把链表上的PCB节点删除掉。在任务管理器查看到进程列表,本质上就是遍历这个PCB链表。
那么PCB是怎么描述进程的特征的呢?
1.pid进程的身份标识符(唯一的数字)
2.内存指针,指向了自己的内存是哪些
3.文件描述符表,表示硬盘上的文件等资源
其中内存指针和文件描述符表描述了进程持有了哪些硬件资源。
4.进程调度相关的属性
因为CPU是有限的,但是进程数量一般地都是成百上千个,这样一个“狼多肉少”的局面,操作系统就要合理的调度这些进程(并行+并发)。
1.进程状态
就绪状态(随叫随到)、运行状态、阻塞状态(短时间内无法到CPU上执行,比如该进程在进行密集的IO操作)
2.优先级
进程也是需要分优先级的,先调用谁后调用谁,谁分配的资源多谁分配的资源少
3.上下文
操作系统在进行进程切换的时候,就需要把进程执行的“中间状态”记录下来保存,下次这个进程再被执行的时候就可以恢复到上次的状态,继续往下执行。上下文本质上就是存档的内容,进程的上下文就是CPU中各个寄存器的值,保存上下文就是把这些CPU寄存器的值记录保存到内存中,恢复上下文就是把内存中的这些寄存器值给恢复回去。
4.记账信息
操作系统统计每个进程在CPU上占用的时间和执行的指令数量,根据这个来决定下一阶段该如何调度。
程序中所获取到的内存地址,并非是真的物理内存的地址.而是经过了一层抽象,虚拟出来的地址。针对进程使用的内存空间,进行"隔离"引入了虚拟地址空间。代码里不再直接使用真实的物理地址了,而是使用虚拟的地址,由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。
虚拟地址空间,主要就是为了避免进程之间相互产生影响。操作系统内核发现当前这里的地址超出进程1的访问范围了,此时就直接会向进程反馈一个错误。(具体来说是发送一个SIGN SEGEMENT FAULT信号,引起进程的崩溃)。谁出了bug,谁崩溃,其他进程不受影响了。
解决了进程间相互影响的问题。虽然进程隔离了,但是又引入了新问题,有些时候,确实进程之间,需要进行数据的交互。需要搞一个多个进程都能访问到“公共空间",基于这个公共空间来进行交互数据即可,在Java中一般会基于文件或网络来进行通信。