什么是进程?
总的来说进程的概念有多个定义,例如:
1.进程是指正在执行的程序
2.进程是正在计算机上执行的程序示例
3.能分配给处理器并由处理器执行的实体
4.具有一下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系数的系统资源集
进程控制块(PCB)
在进程执行时,可以唯一地被表征为标识符、状态、优先级、程序计数器、内存指针、上下问数据、I/O状态信息、记账信息等,这些信息被被放在一个叫做进程控制块(process control black)的数据结构中。该控制块由操作系统创建和管理。
在Linux中描述进程的结构体叫做task_struct,它是Linux内核的一种数据结构,会被转载到RAM(内存)里并且包含着进程的信息。
标识符 | 描述本进程的唯一标识符,用来区分其他进程 |
---|---|
状态 | 人物状态,退出代码,退出信号等 |
优先级 | 相对于其他进程的优先级 |
程序计数器 | 程序中即将被执行的下一条指令的地址 |
内存指针 | 包括程序代码和进程相关数据的指针,还有其他进程共享的内存块的指针 |
上下文数据 | 进程执行时处理器的寄存器中的数据 |
I/O状态信息 | 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表 |
记账信息 | 包括处理器时间总和,使用的时钟数总和,时间限制、记账号等 |
其他信息 | … |
进程创建与终止
上面我们大致了解了进程的概念以及进程控制块,那么进程在什么样的环境下会被创建呢?首先进程创建的定义为:当一个新的进程添加到那些正在被管理的进程集合中去时,操作系统需要建立用于管理该进程的数据结构,并在内存中分配地址空间的行为。创建一个进程,实际上就是创建一个PCB
通常以下4个事件会导致创建一个进程
事件 | 说明 |
---|---|
新的批处理作业 | 通常位于磁带或者磁盘中的批处理作业控制流被提共 给操作系统。当前系统准备接纳新工作时,它将读取下一个作业控制命令(PCB在内核中,由内核进行管理,用户程序无法直接访问内核,只能通过系统调用接口完成功能) |
交互登录 | 终端用户登录到系统 |
操作系统因为提供一项服务而创建 | 操作系统可以创建一个进程,代表用户程序执行一个功能,使用户无需等待(如控制打印的进程) |
由现有的进程派生 | 基于模块化的考虑,或者为了开发并行性,用户程序可以指示创建多个进程 |
相对的,有进程的创建就会有进程的终止,导致进程终止主要有以下几个方面
事件 | 说明 |
---|---|
正常完成 | 进程自行执行一个操作系统服务调用,表示它已经结束运行 |
超出时限 | 进程运行时间超出规定的时限。可以测量很多种类型的时间,包括总的运行时间(挂起时间)、花费在执行上的时间以及对于交互进程从上一次用户输入到当前时刻的时间总量 |
无可用内存 | 系统无法满足进程需要的内存空间 |
越界 | 进程试图访问不允许访问的内存单元 |
保护错误 | 进程试图使用不允许使用的资源或文件,或者试图以一种不正确的方式使用,如向只读文件种写 |
算数错误 | 进程试图进行被禁止的计算,如除以0或者存储大于硬件可以接纳的数字 |
时间超出 | 进程等待某一事件发生的时间超过了规定的最大值 |
I/O失败 | 在输入或者输出期间发生错误、如找不到文件、在超过规定的最多努力次数后仍然读/写失败(例如当遇到磁带上的一个环区时)或者无效操作(如从行式打印机中读) |
无效指令 | 进程试图执行一个不存在的指令 |
特权指令 | 进程试图使用为操作系统保留的指令 |
数据误用 | 错误类型或未初始化的一块数据 |
操作员或者操作系统干涉 | 由于某些原因操作员或者系统终止进程(例如:如果存在死锁) |
父进程终止 | 当一个父进程终止时,操作系统可能会自动终止该进程的所有后代进程 |
父进程请求 | 父进程通常具有终止其任何后代进程的权力 |