第一章 进程的知识

多任务处理是指在同一时间内运行多个应用程序,每个应用程序称为一个任务。Linux 作为支持多任务的操作系统,通过调度策略实现任务的并发执行。实际上,单核处理器每次只能执行一个任务,每个任务有一个时间片,时间片用完后,操作系统切换到其他任务。这种快速切换给用户带来多个任务同时运行的体验。多任务系统中有三个基本概念:任务、进程和线程。

1.1 多任务机制的介绍

任务是一个逻辑概念,指为实现某个目的而进行的一系列操作。通常,任务是程序的一次运行,包含一个或多个独立的子任务,这些子任务可以是进程或线程。
结构如图所示

1.2 进程的介绍

进程是程序的一次执行过程。每当一个程序被执行时,操作系统会创建一个对应的进程。进程是操作系统中资源分配的基本单位,例如分配的内存空间(用户空间为 0-3GB)。每个进程都有独立的内存空间、文件描述符表和缓冲区。进程可以看作是程序在执行期间的一个示例。

2.2.1 进程的分类

交互进程
交互进程是指与用户直接交互的进程,用户可以通过键盘、鼠标、终端等设备与这些进程进行实时交互。典型的交互进程包括终端窗口中的命令行程序、图形界面应用程序等。交互进程通常运行在前台,用户可以直接看到和操作这些进程。

批处理进程
批处理进程是指无需用户干预,自动按照预定顺序依次执行的一组任务。批处理进程通常在后台运行,用于执行大量重复的任务,如定期备份、数据处理等。批处理进程可以在特定时间启动,执行完任务后自动退出,适合处理对时间要求不高、可集中处理的任务。

守护进程
守护进程(Daemon)是一种在后台运行的特殊进程,它不与用户直接交互,通常在系统启动时加载并持续运行,提供系统级别的服务。守护进程通常负责处理系统服务、日志记录、任务调度等工作。常见的守护进程包括 sshd(用于远程连接)、crond(用于定时任务)等。

这三类进程在操作系统中具有不同的作用和特点,交互进程用于实时响应用户操作,批处理进程用于自动化处理任务,守护进程则是维持系统稳定运行的重要后台服务。

进程的组成

2.2.2 进程的结构

在 Linux 中,进程的结构由一个称为 task_struct 的数据结构来表示,它包含了与进程相关的几乎所有信息。这个结构体定义在内核源码的 include/linux/sched.h 文件中。

如何查看进程
方法一:使用PS 命令
方法二:查看/proc目录

cat /proc/1/status
# 

方法三:阅读 Linux源码

路径 /usr/include/sched.h === >> 进程信息结构体

你对进程状态的描述总体是正确的,但有些地方可以进一步精简和调整,使内容更加清晰和逻辑流畅。以下是优化后的版本:

2.2.3 进程的状态

在 Linux 中,进程的状态通常可以从两个不同的层次进行描述:基本状态和生命周期中的状态。

  • 基本状态:这是操作系统在进程调度中使用的核心状态,主要描述进程在调度过程中可能经历的关键状态。
  • 生命周期中的状态:这是对进程在实际运行中的具体行为进行更细化的状态描述。

基本状态

基本状态包括:

  1. 就绪态(Ready)

  2. 进程已具备运行条件,==等待被调度器分配 CPU==。此状态下,进程没有在运行,但一旦分配到 CPU 资源,就可以立即执行。

  3. 运行态(Running)

  4. 进程正在使用 CPU 运行。只有处于运行态的进程真正占用了 CPU 执行指令。

  5. 阻塞态(Blocked/Waiting)

  6. 进程由于等待某个事件(如 I/O 完成、资源可用等)而无法继续执行,被挂起。阻塞态的进程在等待事件发生时不占用 CPU。

  7. 创建态(New)

  8. 进程正在被创建,操作系统为其分配必要的资源,但尚未进入就绪状态。

  9. 终止态(Terminated/Exit)

  10. 进程执行完毕或被强制终止,进入结束状态,系统会回收进程占用的资源。

进程状态_2

生命周期状态

生命周期中的状态更细致地描述了进程在不同任务中的具体表现,包括:

  1. 运行(Running or Runnable, R)

  2. 进程正在运行或准备运行。此状态下的进程正在使用 CPU,或处于就绪队列中,等待被调度。

  3. 可中断睡眠(Interruptible Sleep, S)

  4. 进程正在等待某个条件(如 I/O 操作)的完成,可以被信号打断并唤醒。

  5. 不可中断睡眠(Uninterruptible Sleep, D)

  6. 进程正在等待一个不会被信号打断的事件(通常是设备 I/O 操作),如等待磁盘操作完成。此状态下的进程无法响应外部信号。

  7. 暂停(Stopped, T)

  8. 进程由于接收到特定信号(如 SIGSTOP、SIGTSTP)而暂停运行。此状态下,进程不会继续执行,直到收到继续运行的信号(如 SIGCONT)。

  9. 僵尸(Zombie, Z)

  10. 进程已终止,但其父进程尚未回收它的退出状态信息。僵尸进程仍然占用进程表的一个条目,但它不再占用其他资源。

  11. 结束(Dead or Exit, X)

  12. 进程已经完全结束,但这个状态一般是非常短暂的,通常在进程终止之后立即被移除。

这些状态可以通过命令 pstop 查看。每种状态在输出中通常以单个字母表示,例如:

进程状态

  • R 表示运行状态
  • S 表示可中断睡眠
  • D 表示不可中断睡眠
  • T 表示停止
  • Z 表示僵尸

2.2.4 进程控制块(PCB)

进程控制块(Process Control Block, PCB)是操作系统中用于描述进程的一个数据结构,包含了操作系统管理进程所需的所有信息。PCB 是进程在操作系统中的“身份标识”,操作系统通过 PCB 来管理和调度进程。

PCB 的主要内容

  1. 进程标识信息

  2. 进程 ID(PID):进程的唯一标识符。

  3. 父进程 ID(PPID):该进程的父进程的标识符。

  4. 用户 ID(UID)和组 ID(GID):用于表示进程所属的用户和用户组。

  5. 进程状态

  6. 记录进程的当前状态,如运行、就绪、阻塞、挂起、终止等。

  7. 进程调度信息

  8. 优先级:进程的优先级,决定进程调度的顺序。

  9. 程序计数器:保存进程下一条要执行的指令地址。

  10. CPU 寄存器:保存进程执行时的寄存器内容。

  11. 调度队列指针:指向进程所在的调度队列。

  12. 内存管理信息

  13. 基地址和限长寄存器:进程使用的内存区域的描述。

  14. 页表或段表:用于实现虚拟内存的页式或段式管理。

  15. 进程控制信息

  16. 文件描述符表:保存进程打开的文件信息。

  17. 信号处理信息:记录进程可以接收和处理的信号。

  18. 消息队列、管道、共享内存:进程间通信相关的信息。

  19. 资源使用信息

  20. 记录进程使用的 CPU 时间、内存资源、I/O 设备等信息,方便操作系统进行资源分配和管理。

PCB 的作用

  • 进程调度:调度程序通过读取和修改 PCB 中的状态和调度信息来管理进程的执行。
  • 进程切换:在进程上下文切换时,系统保存当前进程的上下文信息到 PCB,并加载下一个进程的 PCB 信息。
  • 进程控制:操作系统可以通过 PCB 管理进程的创建、终止、挂起、恢复等操作。

    2.2.5 进程的标识符(PID)

在 Linux 中,PID 是操作系统分配给每个进程的唯一标识符,用来区分不同的进程。它是一个整数,可以通过 getpid() 系统调用获取当前进程的 PID。PID 在进程管理、调度、信号传递(如 kill 命令)等方面起着关键作用。

2.2.6 进程的内存结构

  • 保留区:通常为保留的空间,不会用于程序的运行。

  • 代码段(Text Segment):存放程序的可执行代码,通常是只读的。

  • 数据段(Data Segment):存放已初始化的全局变量和静态变量。常量

  • BSS 段:存放未初始化的全局变量和静态变量,程序启动时这些变量被初始化为零。

  • (Heap):用于动态内存分配,通过 malloc 等函数申请的内存从这里分配,堆向高地址方向增长。

  • 待分配区域:通常是堆和栈之间的未 使用内存空间,随着堆的增长或栈的扩展,这部分空间会动态分配给其中一方。

  • 文件映射与匿名映射区:存放文件映射(如通过 mmap 映射的文件)和匿名映射(没有与具体文件关联的内存区域),这一部分用于进程间通信或快速文件访问。

  • (Stack):用于存放函数调用时的局部变量、参数和返回地址,栈从高地址向低地址增长。

  • 内核空间:内核使用的内存区域,用户进程无法直接访问,只有通过系统调用才能间接操作。

1.3 线程的介绍

前面已经提到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这导致进程切换时操作系统的开销较大。为提高效率,操作系统引入了线程这一概念,线程也被称为轻量级进程

线程是进程中的执行单元,可以访问进程的内存空间和资源,并与同一进程中的其他线程共享。这种资源共享机制使得线程的上下文切换开销比进程小得多。一个进程可以拥有多个线程,它们共享进程的资源(如内存地址空间、文件描述符等)。但需要注意的是,由于线程共享资源和地址空间,任何线程对资源的操作都会影响到其他线程。因此,多线程编程中同步问题至关重要。