1. 进程介绍
1.1 进程的概念
- 程序是由指令和数据组成的,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,将数据加载至内存。在指令运行过程中还需要用到磁盘和网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
- 当一个程序被运行,会从磁盘加载这个程序代码至内存,这时就开启了一个进程。
- 一个运行的程序可以视为一个进程,进程也可以认为是一个可执行文件跑起来之后的动态的过程。
- 进程运行会被系统分配一些资源,进程就是系统资源分配的基本单位。
- 进程是由程序的代码、程序处理的数据、程序计数器中的值、一组通过的寄存器的当前值、堆、栈和一组系统资源组成。
1.2 进程和程序的关系
进程与程序的联系:
- 程序是产生进程的基础,进程是程序功能的体现
- 程序的每次运行会构成不同的进程,通过多次执行,一个程序可以对应多个进程;通过调用关系,一个进程可以包括多个程序。
进程与程序的区别:
- 程序是有序代码的集合,是静态的;进程是程序的执行,会涉及到核心态和用户态的切换,是动态的。
- 进程是一个状态变化的过程,是暂时的,程序是可以长久保存的。
- 进程和程序的组成不同,进程包括了程序、数据和进程控制块。
1.3 进程的特点
- 动态性:可以动态的创建和结束进程。
- 并发性:进程可以被独立调度并占用处理机运行。
- 独立性:不同进程的工作互不影响。
- 制约性:因访问共享数据或进程间同步而产生制约。
2. 进程控制块 PCB
操作系统要保证多个进程都能正常工作,并且互相之间不能影响,操作系统内部就实现了一个结构体,该结构体用于描述一个进程具备的信息,然后通过某种数据结构(比如双向链表)将所有的结构体给组织起来,这样就能有效的管理所有的进程。
该结构体在操作系统中称为 PCB(Process Control Block)进程控制快,它是操作系统管理控制进程运行所用的信息集合。PCB 是用来描述进程的数据结构。操作系统为每个进程都维护了一个 PCB,用来保存与该进程有关的各种状态信息。
PCB 中存储的信息:
- pid:进程的身份标识。
- 内存指针:描述着这个进程使用的内存有哪些,比如程序对应的指令有什么,依赖的数据有什么等。
- 文件描述符表:描述了这个进程都打开了哪些文件。每一个进程默认会打开三个文件,标准输出、标准输入和标准错误。
- 进程的状态:描述了当前这个进程能够在 CPU 上执行。
- 优先级:调度进程是,给每个进程安排的时间和先后都存在差别。
- 上下文:操作系统在执行某个进程时,如果需要吧这个进程从 CPU 上调度走,就需要先将 CPU 的运行状态保存到内存中,下次再调度该进程时,就从内存中获取。
- 记账信息:统计量每个进程执行的时间和指令的数目,依据这个来平衡调度效果。
3. 进程的状态
3.1 进程的生命周期
- 进程创建
- 进程运行
- 进程等待
- 进程唤醒
- 进程结束
3.2 进程的状态
- 运行状态:表示该进程正在 CPU 上运行。
- 就绪状态:表示该进程获得了除 CPU 之外的一切资源,一旦得到 CPU 就可以运行。
- 等待状态/阻塞状态:表示该进程正在等待某事件而暂停运行。
- 创建状态:表示该进程正在被创建,还没被转到就绪状态之前的状态。
- 结束状态:表示该进程正在从系统中消失。
4. 进程间通信的机制
虽然进程之间存在独立性,但是很多时候又避免不了需要多个进程相互配合来完成一些工作。操作系统提供了一些进程间通信的机制,使得进程在有限的情况下可以进行交互操作。
操作系统中提供的进程间通信的机制有很多,Java 中主要用到以下两种机制: