初识进程

来源:互联网 发布:mdict for mac 编辑:程序博客网 时间:2024/05/29 17:44

一、什么是进程

进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
这个定义是比较完整的,但可能有点难以理解。首先,我们来考虑这样一个场景。我们的电脑一般都有各种各样的程序,比如聊天软件,游戏软件,办公软件等等。某一天,我们心血来潮想玩游戏了,就双击LOL图标进入游戏界面。开始一局游戏,我们会见到各种各样的游戏人物,小兵,建筑塔,我们能发现人物会移动,建筑塔会掉血等等。那么,我们就可以把正在运行的、对人物、小兵等数据进行动态处理的这个LOL程序称作一个进程。
从这个例子,我们也可以知道。进程和程序的联系和区别。

  • 进程是处于执行状态的程序的抽象
  • 程序是静态的可执行文件,进程是动态的执行中的程序
  • 程序可永久保存,进程有生命周期,是暂时的
  • 进程和程序组成不同,进程包括程序、代码和数据以及进程控制块
  • -

二、进程的组成

上面我举例一个玩游戏的例子帮助大家理解进程,LOL这个进程包括了各种各样的人物、小兵、建筑塔,但是从操作系统的角度出发,我们需要用专业的术语来描述。
总的来说,在底层,进程由正在运行的一个程序的所有状态信息组成,包括代码、数据、状态寄存器、通用寄存器、进程所占用的系统资源比如内存、文件。

三、进程的状态

这里写图片描述

进程的状态也可以说是进程的生命周期,包括创建、等待、就绪、执行、抢占、、挂起、唤醒、终止。但较为常用的是进程三状态模型

  • 运行态:该时刻,进程实际占用CPU
  • 就绪态:可运行状态,但因为其他进程正在运行而停止
  • 阻塞态:等待状态,除非某种外部事件发生,否则进程不会进行

创建和终止比较好理解,这里讲下创建和终止的触发条件
创建:

  • 系统初始化
  • 用户请求创建一个新进程。比如我们平时双击图标启动程序。
  • 正在运行的进程执行了创建进程的系统调用

终止:

  • 正常退出,完成工作
  • 出错退出,比如找不到要打开的文件等
  • 严重错误,比如内存泄露等
  • 被其他进程杀死

注意图片中的fork()函数和exec()函数以及exit()函数。

fork():把一个进程复制成两个进程

  • 复制父进程的所有变量和内存
  • 复制父进程的所有CPU寄存器
  • 子进程的fork()返回0
  • 父进程的fork()返回子进程标识符
  • fork()返回值可方便后续使用,子进程可使用getpid()获取PID
  • 由于复制内存和CPU寄存器,所以fork()的开销比较大。在99%的情况里,我们在调用fork()之后调用exec(),所以内存复制没有什么作用。轻量级的vfork()在创建进程时,不再创建一个同一的内存映像,子进程几乎立即调用exec()。

exec():用于程序加载和执行系统调用

  • 允许进程加载一个完全不同的程序,并从main开始执行。
  • 允许进程加载时指定启动参数
  • 调用成功时,还是属于相同的进程,只是运行了不同的程序
  • 代码段、堆栈和堆等会完全重写

exit():进程结束执行时调用,完成进程资源回收

  • 关闭所有打开的文件等占用资源
  • 释放内存
  • 释放 大部分进程相关的内核数据结构
  • 检查父进程是否存活,如果存活,则保留结果的值直到父进程需要它,进入僵尸状态;否则,释放所有的数据结构,进程结果。

剩下的等待、抢占、唤醒也不难理解。

  • 等待:比如请求并等待系统服务,无法马上完成
  • 抢占:比如高优先级进程就绪
  • 唤醒:比如被阻塞进程需要的资源被满足;被阻塞进程等待的时间到达

最后,提一下进程挂起模型
所谓进程挂起,就是进程从内存转移到外存,目的是减少进程占用的内存

  • 等待挂起:进程在外存并等待某事件的发生
  • 就绪挂起:进程在外存,但只要进入内存即可运行

四、进程控制块(PCB)

进程控制块指的是操作系统用来管理控制进程运行所使用的数据集合。
操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识。它在进程创建的时候生成,在进程终止的时候被回收。

  1. 组成:进程标识信息;处理机现场保存;进程控制信息
  2. 结构:链表或者索引表。同一状态的进程其PCB成一链表,多个状态对应多个不同的链表;同一状态的进程归入一个索引表(由索引指向PCB),多个状态对应多个不同的索引表

五、进程的特点

  1. 动态性:可动态创建和销毁
  2. 并发性:进程可以被被处理机调度并占用执行
  3. 独立性:不同的进程工作不会相互影响
  4. 制约性:因为共享数据或者资源而产生制约
0 0