目录
1、基本概念
程 序:一系列有序指令的集合。
程序文件:编译后产生的(可执行文件a.out)、格式为ELF的,存储在外存(硬盘)的文件。
进 程:程序在处理器上的一次执行过程叫做进程。程序中的代码和数据,被加载到内存中运行的过程。
当源文件编译通过并且完成链接动作之后,则得到一个可以执行的ELF文件,ELF文件中包含了程序的指令和数据以及相关函数接口的跳转地址等信息,当用户运行程序时,操作系统就会把程序相关的指令和数据载入内存,并为程序分配对应的内存空间,然后通知CPU完成程序的相关动作。
用户编写的源文件是存储在外存(磁盘)中的,而使用编译器生成的ELF可执行文件也是存储在外存中的,这两者都是静态的,操作系统也并没有为两者分配系统资源。
当可执行文件得到运行,操作系统才会把可执行文件中的指令和数据从外存中读取出来并写入内存(载入),并且会为程序分配系统资源(内存空间、CPU使用权等),所以程序从静态变为动态,这种正在进行中的程序,操作系统就把其称之为进程(process)。也可以理解为进程是程序在处理器上的一次执行过程。
进程定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行程序的实例。
程序文件是一个静态的存储于外部寄存器之中的文件,在执行时会被载入内存,此时,内核中会产生一个名为task_stract{}的结构体来表示该进程,进程是动态的实体。该进程需要各种各样的资源才能生存下去,这些信息记录在结构体task_stract{}之中,这个结构体称为进程控制块(Process Control Block,PCB)。
总结:当一个程序文件被执行时,内核将会产生一个结构体task_stract{},来承载所有该活动实体日后运行时所需要的所有资源,随着进程的执行各种资源被分配和释放,是一个动态的过程。;
- 操作系统分配资源的基本单位——进程
- 操作系统调度资源的最小单位——线程
- 进程包含线程
2、进程的组织方式
除系统初始进程之外(init,systemd),其余所有的进程都是通过一个父进程(parent)复刻(fork)而来的。所有进程都起源于相同的初始进程,且系统初始进程(init,systemd)在系统启动之前就已经存在于系统分区当中,在系统启动时直接复制到内存中。
进程都直接或间接的是系统初始化进程的后代进程。
3、进程的特征
序号 | 特性 | 解释 |
1 | 动态性 | 进程是程序在处理器上的一次执行过程。进程是动态的活动实体 |
2 | 并发性 | 多个进程同时存在内存中,与其他程序并发执行,提高资源利用率 |
3 | 独立性 | 进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位 |
4 | 异步性 | 指进程以各自独立的、不可预知的速度向前推进。 |
4、进程的组成(笔试面试)
思考:操作系统中可能会有n个进程同时执行,请问操作系统如何掌握这些进程的执行情况?
一般进程在创建之后,操作系统都会为进程分配一块内存来记录进程的各项参数信息。所以这块内存被称为进程控制块(Process Control Block,PCB)。每个进程都有PCB,用于标识进程的存在以及记录进程的信息。
在Linux系统中,进程控制块PCB是以一个名为struct task_struct{}的结构体作为载体来存储信息的,该结构体被定义在一个名称叫做sched.h的头文件中。
进程一般由三部分组成:进程控制块、代码段、数据段。
- 进程控制块
- 代码段:指进程中能被调度程序调度到CPU上执行的程序代码段
- 数据段:指进程对应的程序原始数据或者程序执行过程中产上的中间数据等
5、进程控制块(PCB)中记录的内容
不同操作系统对于一个进程的信息记录是不同的,即PCB的内容会有一些区别,但是大同小异。基本包含以下内容:进程标识符、进程当前状态、
(1)进程标识符(PID)
每个进程都有一个有系统分配的唯一的 PID 进程标识符(process identifier),用于区分系统中的其他进程,这个 PID 也是 Linux 内核提供给用户访问进程的一个接口,用户可以通过 PID控制进程。
思考:windows 系统下可以通过任务管理器查看进程的 PID,那 Linux 系统如何查看进程 PID?
回答:Linux 系统中提供了关于获取进程状态的 shell 命令:ps ,该命令的使用方法详见 man手册,一般使用 ps -ef 或者 ps -aux 来查看 Linux 系统中所有用户相关的进程的所有信息。
(2)进程当前状态
在进程的运行过程中由于系统中多个进程的并发运行和相互制约的结果,所以使进程的状态不断发生变化。操作系统以进程的状态来作为调度程序分配处理器的依据。通常一个运行中的进程至少可划分为 5 种基本状态:就绪态、运行态、阻塞态、创建态、结束态。当然进程状态的叫法是比较灵活的,大家不用死记硬背,重在理解相关概念。
注意:进程不是一直处于某一个状态,进程的状态会受到外界因素和执行进度的影响而发生改变,当然,进程的状态在某一个时刻是唯一的,也就是在某一时刻进程必须且只能处于一种状态。