3.2 进程定义与特性、进程与程序的区别、进程控制块全解


进程描述

进程是操作系统中资源分配和任务调度的基本单位,它代表了正在执行的程序的实例。

3.2.1 进程的定义

  • 进程是操作系统进行资源分配和任务调度的一个独立单位,它是程序执行的实体,代表了程序在计算机上的一次动态执行过程。进程具有独立的地址空间,可以并发执行,且在系统中有明确定义的生命周期。

3.2.2 进程的特性

进程的特性是操作系统中进程概念的重要组成部分,以下是进程的五个核心特性:

  1. 动态性

    • 进程是程序的执行过程,它是一个动态变化的对象。
    • 进程的创建、运行、阻塞、唤醒、结束等状态变化体现了其动态性。
    • 进程在生命周期中会经历不同的状态,如就绪、运行、等待和终止等。
  2. 并发性

    • 多个进程可以在同一个时间段内同时执行,实现宏观上的并行性。
    • 在多道程序设计中,多个进程可以共享CPU和其他系统资源,使得它们能够同时处于运行状态。
    • 并发性提高了系统资源的利用率和系统的吞吐量。
  3. 独立性

    • 每个进程都有自己独立的地址空间和系统资源。
    • 进程之间相互独立,一个进程的执行不会直接影响到其他进程。
    • 进程的独立性保证了程序的模块化和封装性。
  4. 异步性

    • 进程的执行是异步的,即进程的执行速度和时间不可预测。
    • 由于进程的异步性,操作系统需要提供进程同步和通信机制,以保证进程间的正确协作。
    • 异步性使得进程的执行不受其他进程的干扰,但同时也带来了进程同步和互斥的问题。
  5. 结构性

    • 进程具有明确的结构,它由程序代码、数据和进程控制块(PCB)组成。
    • 进程控制块(PCB)是进程存在的唯一标志,它包含了进程的管理和控制信息,如进程状态、优先级、进程ID、程序计数器、寄存器集合、进程的堆栈指针等。
    • 结构性使得操作系统能够有效地管理和调度进程。

这些特性共同定义了进程的行为和操作系统对进程的管理方式。操作系统通过这些特性来实现对进程的有效控制,包括进程的创建、调度、同步和终止等。

3.2.3 进程与程序的区别

进程与程序是两个密切相关但又有明显区别的概念。以下是进程与程序区别的三个主要方面:

  1. 进程的动态性

    • 程序:程序是一组指令和数据的静态集合,它是一个被动的实体,通常存储在磁盘或内存中,不包含执行状态或控制信息。
    • 进程:进程是程序的执行实例,具有动态性。它是一个活动的实体,随着程序的执行而创建,执行过程中会经历不同的状态变化,如运行、等待、就绪等,最终执行完毕被终止。
  2. 进程的暂时性

    • 程序:程序是长期存在的,它在磁盘上有一个持久的副本,可以在任何时候被加载到内存中执行。
    • 进程:进程具有暂时性,它的存在是临时的,仅存在于程序执行期间。一旦进程执行完毕或者被操作系统终止,该进程就消失了。
  3. 进程的结构性

    • 程序:程序作为一个静态的代码和数据集合,通常不包含执行状态信息,它不包含任何关于程序执行的上下文信息。
    • 进程:进程具有结构性,它由程序代码、相关数据和进程控制块(PCB)组成。PCB是进程存在的唯一标志,包含了进程的管理和控制信息,如进程ID、状态、优先级、程序计数器、寄存器集合、堆栈指针等。

总结来说,程序是静态的、持久的指令集合,而进程是程序在执行时的动态、暂时的实例,包含了程序执行的上下文信息。进程的创建和终止是操作系统对程序执行过程的管理和控制。

3.2.4 进程控制块

1、进程标识符信息

进程标识符信息是进程控制块(PCB)中的一个重要组成部分,它用于唯一标识系统中的每个进程。这些标识符对于操作系统的进程管理和调度至关重要。进程标识符信息通常包括以下两个主要部分:

  1. 内部标识符

    • 每个进程在操作系统中都被赋予一个唯一的内部标识符,通常是一个数字,如进程ID(PID)。
    • 这个标识符在系统中是唯一的,用于在内部管理和调度进程时引用进程。
    • 在类Unix系统中,PID是自动分配的,通常在创建进程时由操作系统生成。
  2. 外部标识符

    • 外部标识符是为了方便用户或程序开发者识别和管理进程而设计的,可以是字母数字组合或其他易于识别的字符串。
    • 在某些系统中,外部标识符可能与内部标识符不同,它们用于用户级别的交互,而内部标识符用于系统级别的管理。

进程标识符的作用包括但不限于:

  • 唯一性:确保系统中每个进程都有一个独一无二的标识。
  • 引用:操作系统和其他系统工具(如进程管理器)使用PID来引用和控制进程。
  • 管理:PID用于跟踪进程的创建、执行、终止和调度。
  • 通信:在进程间通信(IPC)中,PID可以用于标识发送和接收消息的进程。

在Unix和Linux系统中,进程标识符通常是一个非负整数,而在Windows系统中,进程标识符是一个更复杂的结构,称为EPROCESS,它包含了进程的详细信息和状态。在多任务操作系统中,进程标识符是实现并发和多任务的关键要素之一。

2、处理器状态信息

处理器状态信息是进程控制块(PCB)中的另一个核心组成部分,它记录了进程执行时CPU的状态。当进程被中断或切换时,处理器状态信息需要被保存,以便进程在重新获得CPU时能够从中断点继续执行。处理器状态信息通常包括以下内容:

  1. 通用寄存器

    • 这些寄存器用于存储进程当前执行过程中的临时数据和中间结果。
    • 包括数据寄存器、地址寄存器等,它们在进程执行期间用于各种计算和数据操作。
  2. 指令计数器(Program Counter, PC)

    • 也称为程序计数器,它存储了进程下一条将要执行的指令的地址。
    • 当进程被中断时,PC的值会被保存,以便之后能够恢复执行。
  3. 程序状态字(Program Status Word, PSW)

    • 包含了处理器的状态信息,如进位标志、零标志、溢出标志等。
    • PSW还可能包含控制位,用于控制处理器的某些特定行为。
  4. 用户栈指针

    • 指向进程用户级栈的顶部,栈用于存储局部变量、函数参数、返回地址等。
    • 每个进程可能有自己的用户栈,用于维护用户级程序的执行状态。
  5. 控制寄存器

    • 包括控制处理器操作模式和状态的寄存器,如中断使能寄存器等。
  6. 浮点寄存器

    • 如果处理器支持浮点运算,那么浮点寄存器会存储浮点运算的状态和数据。
  7. 状态和控制寄存器

    • 某些处理器有特定的状态和控制寄存器,用于管理处理器的特定功能,如性能计数器、调试寄存器等。

处理器状态信息的保存和恢复是上下文切换(context switching)的一部分。当操作系统从一个进程切换到另一个进程时,它会保存当前进程的处理器状态,然后加载新进程的处理器状态,这样新进程就可以从它上次中断的地方继续执行。这个过程对于用户是透明的,但对于确保进程能够正确执行和系统能够有效调度进程是至关重要的。

3、 进程调度信息

进程调度信息是操作系统用于管理进程执行和调度的一组关键信息,它包括:

  1. 进程状态

    • 描述进程当前的状态,如就绪(Ready)、运行(Running)、阻塞(Blocked)、挂起(Suspended)等。
  2. 进程优先级

    • 决定进程被调度执行的优先级。优先级高的进程更容易获得CPU时间。
  3. 调度队列

    • 指向进程所在调度队列的指针,如就绪队列、阻塞队列等。
  4. 事件信息

    • 记录可能导致进程状态改变的事件,如等待I/O操作完成、等待信号量等。
  5. 调度策略

    • 指示操作系统用于调度进程的算法或策略,如先来先服务(FCFS)、短作业优先(SJF)、轮转(Round-Robin)等。
  6. CPU时间

    • 记录进程已经使用或被分配的CPU时间,包括用户模式时间和内核模式时间。
  7. 时间片

    • 在时间片轮转调度算法中,记录进程的时间片长度。
  8. 到达时间

    • 进程进入就绪队列的时间。
  9. 剩余时间

    • 进程需要的剩余执行时间。

4、进程控制信息

进程控制信息涉及进程的创建、同步、通信和终止等控制和管理方面的信息,包括:

  1. 程序和数据地址

    • 指向进程的程序代码和数据的地址,以便操作系统能够加载和执行进程。
  2. 资源清单

    • 记录进程所使用的系统资源,如打开的文件描述符、分配的内存段、使用的I/O设备等。
  3. 进程同步和通信机制

    • 包括信号量、互斥锁、条件变量等同步原语,用于进程间的同步和通信。
  4. 链接指针

    • 用于将PCB链接到各种队列中,如就绪队列、阻塞队列等。
  5. 父子关系指针

    • 指向父进程和子进程的PCB,用于维护进程的家族关系。
  6. 进程组和会话

    • 标识进程所属的进程组和会话,这些通常用于管理和控制一组相关的进程。
  7. 信号处理信息

    • 记录进程如何响应各种信号,包括信号的默认处理方式和用户自定义的处理方式。
  8. 记账信息

    • 记录进程的资源使用情况,如CPU使用时间、内存使用量、I/O操作次数等,用于系统计费和性能监控。
  9. 环境信息

    • 进程的环境变量,为进程执行提供必要的上下文信息。

这些信息共同构成了操作系统对进程进行全面管理和控制的基础,使得操作系统能够有效地调度进程,同时为进程提供必要的资源和服务。

5、unix中进程控制块的数据结构定义

在UNIX和类UNIX操作系统中,如Linux,进程控制块(Process Control Block,PCB)是操作系统中用于描述进程的基本信息和控制进程运行的数据结构。以下是PCB的几个主要部分的详细说明,包括代码、表格和流程图的描述:

1. 进程基本控制块(Process Control Block, PCB)

代码示例(Linux中的task_struct结构体部分字段):

struct task_struct {
    // 进程状态
    volatile long state;
    // 进程标识符
    pid_t pid;
    // 父进程指针
    struct task_struct *parent;
    // 进程优先级
    int prio;
    // CPU 时间统计
    struct tms times;
    // 进程名
    char comm[16];
    // 进程组
    pid_t pgrp;
    // 会话
    pid_t session;
    // 进程控制块链表
    struct list_head tasks;
    // ...
};

文字说明

  • state: 表示进程的状态,如运行、就绪、阻塞等。
  • pid: 进程的唯一标识符。
  • parent: 指向父进程的指针,用于描述进程的家族关系。
  • prio: 进程的优先级,用于调度决策。
  • times: 包含进程的CPU时间统计信息。
  • comm: 进程名,通常由命令行参数提供。
  • pgrp: 进程组标识符,用于进程组间的信号传递。
  • session: 会话标识符,关联控制终端等。
  • tasks: 进程控制块链表,用于将所有进程链接在一起。

2. 进程扩充控制块

代码示例(Linux中的task_struct结构体部分字段):

struct task_struct {
    // 指向下一个任务的指针
    struct task_struct *next_task;
    // 指向上一个任务的指针
    struct task_struct *prev_task;
    // 指向下一个就绪任务的指针
    struct task_struct *next_run;
    // 指向上一个就绪任务的指针
    struct task_struct *prev_run;
    // 指向子进程的指针
    struct list_head children;
    // 指向兄弟进程的指针
    struct list_head sibling;
    // ...
};

文字说明

  • next_task, prev_task: 用于维护进程控制块的双向链表。
  • next_run, prev_run: 用于维护就绪队列中的进程。
  • children: 子进程链表,用于维护父子关系。
  • sibling: 兄弟进程链表,用于维护同一父进程下的进程关系。

3. 共享正文和共享正文表(Text)

代码示例(概念性描述,非直接代码):

struct shared_text {
    // 代码段的起始地址
    void *text_start;
    // 代码段的大小
    size_t text_size;
    // 代码段的权限(读/执行)
    int text_permission;
    // ...
};

文字说明

  • 共享正文段允许多个进程共享同一份代码,例如,当多个进程运行同一个程序时,它们的代码段可以是共享的,这样可以节省内存空间。
  • 共享正文表用于管理共享代码段的信息,包括起始地址、大小和权限等。

流程图说明

流程图通常用于描述进程状态的变化和进程创建、调度的过程。例如,一个进程从创建到运行、阻塞、唤醒、终止的状态变化可以通过流程图来表示。由于无法直接在这里展示流程图,可以使用流程图软件或在线工具来创建相应的图表。

表格说明

字段名描述
state进程的状态,如运行、就绪、阻塞等。
pid进程的唯一标识符。
parent指向父进程的指针,用于描述进程的家族关系。
prio进程的优先级,用于调度决策。
times包含进程的CPU时间统计信息。
comm进程名,通常由命令行参数提供。
pgrp进程组标识符,用于进程组间的信号传递。
session会话标识符,关联控制终端等。
next_task用于维护进程控制块的双向链表。
children子进程链表,用于维护父子关系。
sibling兄弟进程链表,用于维护同一父进程下的进程关系。

请注意,上述代码和表格是基于Linux操作系统的task_struct结构体的简化描述,实际的task_struct结构体要复杂得多,包含了更多的字段和信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值