Linux 下进程基本概念与状态

news/2024/11/25 6:46:19/

文章目录

  • 一、进程的定义
  • 二、 描述进程-PCB
    • 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. 标示符: 描述本进程的唯一标示符,用来区别其他进程。

pid


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

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

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

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

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

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

大体图
picture

三、 进程状态

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

  1. R (运行状态)

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

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

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

使用htop命令查看htop

  1. T (停止状态)

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

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

    kill -19  pid
    

    stop

  2. t (跟踪或停止状态)

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

  • 进程已经结束,但其父进程尚未通过wait()系统调用来回收其资源。此时,进程仍保留在进程表中,但不再占用系统资源(除了进程表项)。
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
    所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
    代码如下
#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; 
}

如下图


child


僵尸进程危害

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

  1. 资源浪费

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

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

    • 僵尸进程仍然保留有关其父进程的一些信息,如父进程的PID(进程标识符)。在某些安全敏感的应用程序中,这可能会导致敏感信息的泄漏。

http://www.ppmy.cn/news/1549750.html

相关文章

Mac设置java环境变量

Mac电脑中存在多个jdk版本,如何配置java环境变量为指定版本jdk? 一、查看所有已安装的 JDK 版本 /usr/libexec/java_home -V二、临时设置 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)三、永久设置 如果需要永久使用指定版

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

QT文件基本操作

QT文件基本操作 1.概述 这篇文章介绍一些QT操作文件的基础内容 2.创建项目 首先创建一个普通的widget类型项目&#xff0c;然后使用UI 布局页面&#xff0c;实现一个读取文件内容的功能。 2.1.UI布局 在UI界面添加一个QWideget容器&#xff0c;然后在容器中分别添加lineT…

AWS codebuild + jenkins + github 实践CI/CD

前文 本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流&#xff0c;用于自动化发布已经部署 lambda 函数。 在 AWS 海外区&#xff0c;CI/CD 工作流可以用 codepipeline 这项产品来方便的实现&#xff0c; CICD 基本概念 持续集成( Continuous…

CTF之密码学(键盘加密)

在CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;中&#xff0c;键盘加密是一种独特而有趣的加密方式&#xff0c;它巧妙地利用了键盘的布局和坐标进行信息的加密和解密。以下是关于CTF中键盘加密的详细解释&#xff1a; 一、键盘加密的定义 键盘加密是通过…

【网络安全设备系列】4、漏洞扫描设备

0x00 定义&#xff1a; 漏洞扫描是指基于漏洞数据库&#xff0c;通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测&#xff0c;发现可利用的漏洞的一种安全检测&#xff08;渗透攻击&#xff09;行为。 0x01 主要功能&#xff1a; 可以对网站、系统、数据…

Unity图形学之法线贴图原理

1.正常贴图&#xff1a;RGBA 4通道 每个通道取值范围 0-255 贴图里面取值是 0-1 2.法线贴图&#xff1a;法线怎么存入正常贴图的过程 每个通道里面存储的是一个向量(x,y,z,w) 通常我们会对应xyzw为rgba 存储值的范围也是0-1向量的取值范围是 -1到1法线怎么存入正常贴图的过程&…

TCP/IP--黑客想要通过TCP攻击,会如何攻击,应该怎么应对。

黑客想要通过TCP攻击&#xff0c;会如何攻击&#xff0c;应该怎么应对。 SYN Flood 攻击时DDOS攻击一种&#xff0c;洪水泛滥。黑客发送大量的SYN请求到目标服务器&#xff0c;但是不完成三次握手和四次挥手的过程&#xff0c;不发送ACK响应&#xff0c;服务器收到SYN请求后&a…