前言
在学习这部分内容之前,还是需要了解一下什么是操作系统?通俗来说,操作系统就是管理应用程序,对下,要管理各种硬件设备,对上,要给应用程序提供一个稳定的运行环境。这里涉及到的内容也是方方面面的。那么,今天我们就来了解一下操作系统中的最重要的内容——进程。
一、什么是进程(任务/task)
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
1.1 进程概念
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程, 同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
简单来说,进程就是正在运行的程序。那么也就是说,没有运行起来的程序,也就不是进程了。程序是可执行文件,只是在硬盘上的一个东西(静态的)。如果双击程序,此时操作系统就会把可执行文件中的数据和指令加载到内存中,并且让CPU去执行这里的指令,完成一系列相关的工作,此时是运行起来的,动态的。也就是进程。
1.2 进程的特点
动态性 创建->产生;调度->执行;得不到资源->暂停;撤销->消亡。
并发性 多个进程可以在一段时间内同时运行。
独立性 进程是独立运行的基本单位。
异步性 进程各自可以独立地、以不可知的速度前进。
进程能够干活,说明进程能够消耗一定的额系统资源。而对于可执行文件来说,只是占用了硬盘空间。而进程,会消耗CPU资源,内存资源,硬盘,网络带宽......
一台正在运行的计算机中,大概率是包含很多进程的,一旦东西多了,就需要考虑“管理”,此时,针对计算机中“进程”的管理,核心思路就是需要先描述,再组织。
描述:使用一个专门的结构体,来记录一个进程里面的各个属性。
组织:使用一系列的数据结构,把多个进程进行一个有效的组织,随时方便进行遍历,查找,汇总数据。
进程管理的前提是进程数量非常多,如果只有几个进程,那么也就不需要考虑管理进程了。
1.3 如何描述和组织进程
描述:PCB(进程控制块)。
组织:通常会使用双向链表这样的方式来进行组织。当使用双向链表来组织的时候,查看进程的列表,本质上就是遍历这个链表。创建一个进程,就是创建了一个PCB结构体,并且插入到链表上。销毁一个进程,就是把PCB从这个结构体从链表上删除并释放。
二、进程描述——PCB进程控制块
PCB中大概包含的信息: PID(进程的标识)、内存指针、文件描述符表。
2.1 PID——进程标识
同一个系统上,同一时刻,每个进程的PID一定都是不同的。有的时候,运行一个可执行文件EXE,可能会设计到多个进程。
2.2 内存指针
表示了该进程对应的内存资源的情况。(也就是操作系统分配的内存空间),最主要存储的就是从exe可执行文件中加载过来的指令和数据。还会保存一些运行过程的中间结果的数据。指令我们可以看成是一个剧本,而进程就是演员,演员要按照剧本进行表演,也就是说,进程要按照指令去完成一系列的相关操作。
2.3 文件描述符表
它和硬件资源有关,硬盘是硬件,应用程序一般是无法直接接触到“硬件”这一层面的。实际上是操作系统抽象成“文件”这样的概念,程序操作的是文件,文件实际上是存储在硬盘上的。每个进程就会有一个文件描述符来记录当前这个进程正在使用哪些文件。操作系统打开一个文件,就会产生一个文件描述符,同时会使用文件描述符表,把文件描述符组织起来。
此外,计算机最重要的一个硬件资源就是CPU,在这里也简单介绍一下CPU资源是怎么体现的:
进程是需要在CPU上执行指令的,如果说进程是演员,那么CPU就是拍摄场地,CPU要给进程场地,才能让进程表演。每一个进程要想执行里面的指令,完成对应的任务,都需要在CPU上执行。但是,一台机器上同一时刻的进程有百八十个,而CPU只有一个。但是在CPU中,拍摄场地不止一个,也就是CPU是有多个逻辑核心,这样就可以同时执行多个进程。但是,进程仍然有上百个,逻辑核心不够用,那么就需要进程的调度。进行调度的时候,又设计到俩个情况:并行和并发。
并行:同一时刻,两个进程,同时运行在两个CPU逻辑核心上。
并发:两个进程,在同一个CPU逻辑核心上,轮流执行。由于CPU切换速度极快,微观上这两个进程是串行执行的,宏观上,看起来这两个进行就像是“同时执行”的。
操作系统在调度这些进程的时候,可能是按照并行的方式,也可能是按照并发的方式。在应用程序这一层,是感知不到的(在系统内核可以感知到)。
三、PCB中进程调度相关的属性
下面我们只是简单介绍一下基本的内容。
3.1 状态
这里我们只介绍最重要的两个状态。
就绪状态:一个进程随时做好了在CPU上执行的准备。
阻塞/睡眠状态:进程还没有准备好被调度到CPU上。
3.2 优先级
系统调度进程的时候,并不是完全公平的,会根据优先级的不同,来决定时间分配的权衡,这样一来,就可以把系统资源调配给更重要的进程了。
3.3 上下文
进程是轮流执行的,一次运行不完,此时就需要保证下次CPU运行的时候,能够从上次运行到的位置继续往后执行。
操作系统所记录的上下文就是该进程在执行过程中,CPU的寄存器中对应的数据。这些寄存器有的存放中间结果,有的是存放一些特定含义的数据。
3.4 记账信息
相当于是一个统计信息,会统计每个进程在CPU上执行的时间,也是对进程调度的工作进行一个兜底。