Linux 下进程基本概念与状态

文章目录

  • 一、进程的定义
  • [二、 描述进程-PCB](#二、 描述进程-PCB)
    • [task_ struct内容分类](#task_ struct内容分类)
  • [三、 进程状态](#三、 进程状态)

一、进程的定义

  1. 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
  2. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

二、 描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。称之为PCB(process control block),Linux操作系统下的PCB是 task_struct

task_ struct内容分类

  1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。

  1. 状态: 任务状态,退出代码,退出信号等。

  1. 优先级: 相对于其他进程的优先级。

  1. 程序计数器: 程序中即将被执行的下一条指令的地址。
  2. 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

  1. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

  1. I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

  1. 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  2. 其他信息

大体图

三、 进程状态

在Linux系统中,进程的状态可以通过多种方式来查看,最常见的方式是使用ps命令和top命令。以下是一些常见的进程状态及其解释:

  1. R (运行状态)

    • 进程正在运行或在运行队列中等待。
  2. S (可中断的睡眠状态)

    • 进程正在等待某个事件完成,可以被信号中断。例如,等待用户输入或等待资源变得可用。
  3. D (不可中断的睡眠状态)

    • 进程处于睡眠状态,但不可被信号(signal)中断。这通常表示进程正在等待I/O操作(如磁盘操作)完成。

使用htop命令查看

  1. T (停止状态)

    • 进程已被停止(通常是通过信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU)。

    使用 19) SIGSTOP 号信号停止正在运行的进程

    bash 复制代码
    kill -19  pid
  2. t (跟踪或停止状态)

    • 进程被跟踪,通常是由调试器停止的。
      使用gdb调试时查看进程状态
  3. Z (僵尸状态)

  • 进程已经结束,但其父进程尚未通过wait()系统调用来回收其资源。此时,进程仍保留在进程表中,但不再占用系统资源(除了进程表项)。
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
    所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
    代码如下
c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // 包含 sleep 和 getpid 函数所需的头文件
#include <sys/types.h> // 包含 pid_t 所需的头文件

int main() {
    pid_t id = fork();

    if (id < 0) {
        perror("fork");
        return 1;
    } else if (id > 0) { // 父进程
        printf("parent[%d] is sleeping...\n", getpid());
        sleep(30); // 父进程休眠30秒
    } else { // 子进程
        printf("child[%d] is beginning Z...\n", getpid());
        sleep(5); // 子进程休眠5秒
        exit(EXIT_SUCCESS); // 子进程正常退出
    }

    return 0; 
}

如下图



僵尸进程危害

僵尸进程(Zombie Process)在Linux操作系统中是一种特有的进程状态,这种状态的进程不再占用CPU或内存资源(除了进程表中的一个槽位),但它们仍然会对系统产生一些潜在的危害。

  1. 资源浪费

    • 僵尸进程虽然不再执行任何代码或占用CPU时间,但它们仍然占用系统进程表中的一个槽位。在进程表资源有限的情况下,如果僵尸进程数量过多,可能会导致进程表溢出,进而影响到系统的正常运行。
    • 此外,由于父进程需要维护对子进程的引用,这也会占用一定的系统资源。
  2. 进程号枯竭

    • 系统中的进程号是有限的。如果僵尸进程过多,它们会占用大量的进程号,导致系统无法分配新的进程号给新创建的进程。这可能会影响到系统的并发性能和任务调度能力。
  3. 父进程信息泄漏

    • 僵尸进程仍然保留有关其父进程的一些信息,如父进程的PID(进程标识符)。在某些安全敏感的应用程序中,这可能会导致敏感信息的泄漏。
相关推荐
东方巴黎~Sunsiny几秒前
给定数字 [3, 30, 34, 5, 9] 拼接成的最大数字,使用java实现
java·开发语言
焦糖酒3 分钟前
JS精进之Hoisting(提升)
开发语言·前端·javascript
daiyang123...5 分钟前
Java 复习 【知识改变命运】第九章
java·开发语言·算法
fancc椰9 分钟前
C++基础入门篇
开发语言·c++
不7夜宵17 分钟前
Golang 反射
开发语言·后端·golang
瑞雪流年20 分钟前
conda 创建环境失败故障解决记录
开发语言·python·conda
山山而川粤26 分钟前
大连环保公益管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·后端·学习·mysql
尘浮生33 分钟前
Java项目实战II基于SpringBoot前后端分离的网吧管理系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·小程序
Who_Mr.Lin36 分钟前
【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题
linux·运维·centos
晚安,cheems1 小时前
c++(入门)
开发语言·c++